diff --git a/.changeset/afraid-apes-smell.md b/.changeset/afraid-apes-smell.md deleted file mode 100644 index 2654351ad8..0000000000 --- a/.changeset/afraid-apes-smell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-kubernetes-common': patch ---- - -Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. diff --git a/.changeset/angry-badgers-beg.md b/.changeset/angry-badgers-beg.md new file mode 100644 index 0000000000..38952aef98 --- /dev/null +++ b/.changeset/angry-badgers-beg.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Internal update for removal of experimental plugin configuration API. diff --git a/.changeset/angry-ghosts-brush.md b/.changeset/angry-ghosts-brush.md deleted file mode 100644 index e1f3d7bc04..0000000000 --- a/.changeset/angry-ghosts-brush.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Updated the backend template to no longer create duplicate connection pools to plugins that use the task scheduler. - -To apply this change in your own repository, perform the following small update: - -```diff -// in packages/backend/src/index.ts -- const taskScheduler = TaskScheduler.fromConfig(config); -+ const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); -``` diff --git a/.changeset/big-bananas-sleep.md b/.changeset/big-bananas-sleep.md deleted file mode 100644 index 71a0772720..0000000000 --- a/.changeset/big-bananas-sleep.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Updated latest playlist screen in readme document diff --git a/.changeset/big-masks-divide.md b/.changeset/big-masks-divide.md deleted file mode 100644 index f1d346ba7d..0000000000 --- a/.changeset/big-masks-divide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-home': patch ---- - -Fixed a bug where customizable home page cards would render missing their normal borders. diff --git a/.changeset/big-spies-agree.md b/.changeset/big-spies-agree.md deleted file mode 100644 index 1c544f4f36..0000000000 --- a/.changeset/big-spies-agree.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend-module-yeoman': patch ---- - -Enables dry-run functionality for the run:yeoman scaffolder action diff --git a/.changeset/big-spies-beam.md b/.changeset/big-spies-beam.md new file mode 100644 index 0000000000..e5f0ad3eff --- /dev/null +++ b/.changeset/big-spies-beam.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Removed duplicate `apple-touch-icon` link from `packages/app/public/index.html` that linked to nonexistent icon. diff --git a/.changeset/blue-rats-drop.md b/.changeset/blue-rats-drop.md deleted file mode 100644 index 19b732be1a..0000000000 --- a/.changeset/blue-rats-drop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-test-utils': patch ---- - -Introduced a new utility for testing service factories, `ServiceFactoryTester`. diff --git a/.changeset/brave-books-pretend.md b/.changeset/brave-books-pretend.md deleted file mode 100644 index ee80aedb18..0000000000 --- a/.changeset/brave-books-pretend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -change color of delete icon to secondary in playlist table diff --git a/.changeset/brave-carrots-occur.md b/.changeset/brave-carrots-occur.md deleted file mode 100644 index 017a9bdd8c..0000000000 --- a/.changeset/brave-carrots-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-search-backend-module-pg': patch ---- - -Added `indexerBatchSize` option to be able to control the size of the batches being indexed. Also added a debug log entry to list out all the entities in the batch diff --git a/.changeset/brown-cameras-marry.md b/.changeset/brown-cameras-marry.md deleted file mode 100644 index cfa6911842..0000000000 --- a/.changeset/brown-cameras-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added the ability to specify the listen address for the `--inspect` and `--inspect-brk` command. You can now set the `ip` and port of the `inspect` and `inspectBrk` by adding for example `--inspect=0.0.0.0:9229` diff --git a/.changeset/calm-cups-smile.md b/.changeset/calm-cups-smile.md deleted file mode 100644 index 68fcfb2d1a..0000000000 --- a/.changeset/calm-cups-smile.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -'@backstage/plugin-api-docs-module-protoc-gen-doc': patch -'@backstage/plugin-catalog-unprocessed-entities': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/integration-react': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic-dashboard': patch -'@backstage/plugin-entity-validation': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-home-react': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-opencost': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-puppetdb': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-bazaar': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-nomad': patch -'@backstage/plugin-vault': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-org': patch ---- - -Moved `@types/react` to be a regular dependency diff --git a/.changeset/calm-scissors-rescue.md b/.changeset/calm-scissors-rescue.md new file mode 100644 index 0000000000..4a5318d240 --- /dev/null +++ b/.changeset/calm-scissors-rescue.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Create unique temp directory for each `create-app` execution. diff --git a/.changeset/catalog-everybody-to-the-limit.md b/.changeset/catalog-everybody-to-the-limit.md deleted file mode 100644 index 4c0177820e..0000000000 --- a/.changeset/catalog-everybody-to-the-limit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix to the `limit` parameter on entity queries. diff --git a/.changeset/chatty-goats-mate.md b/.changeset/chatty-goats-mate.md deleted file mode 100644 index 2d4911c603..0000000000 --- a/.changeset/chatty-goats-mate.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-kubernetes-common': patch ---- - -Add AWS Annotations to Kubernetes Cluster Resource diff --git a/.changeset/flat-beans-kiss.md b/.changeset/chatty-papayas-care.md similarity index 51% rename from .changeset/flat-beans-kiss.md rename to .changeset/chatty-papayas-care.md index 4dfe06afdd..9f29e94a85 100644 --- a/.changeset/flat-beans-kiss.md +++ b/.changeset/chatty-papayas-care.md @@ -2,4 +2,4 @@ '@backstage/plugin-pagerduty': patch --- -Minor internal tweaks to improve tests +Minor fix to avoid usage of deprecated prop diff --git a/.changeset/chatty-spiders-serve.md b/.changeset/chatty-spiders-serve.md deleted file mode 100644 index e2b5e5630e..0000000000 --- a/.changeset/chatty-spiders-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Add support for discovering additional service factories during startup. diff --git a/.changeset/chilled-beds-exist.md b/.changeset/chilled-beds-exist.md deleted file mode 100644 index 2023f6fb71..0000000000 --- a/.changeset/chilled-beds-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-graphiql': patch ---- - -Add support for using the FetchApi diff --git a/.changeset/chilly-balloons-enjoy.md b/.changeset/chilly-balloons-enjoy.md deleted file mode 100644 index e541e4d4cc..0000000000 --- a/.changeset/chilly-balloons-enjoy.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/frontend-plugin-api': minor -'@backstage/frontend-app-api': minor ---- - -Initial release diff --git a/.changeset/chilly-parrots-yell.md b/.changeset/chilly-parrots-yell.md deleted file mode 100644 index fe4c760923..0000000000 --- a/.changeset/chilly-parrots-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Added title to props for `HasCards`. diff --git a/.changeset/clean-forks-love.md b/.changeset/clean-forks-love.md new file mode 100644 index 0000000000..f81fe3066b --- /dev/null +++ b/.changeset/clean-forks-love.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-sonarqube-backend': patch +--- + +Added support for the [new backend system](https://backstage.io/docs/backend-system/) diff --git a/.changeset/clean-houses-invent.md b/.changeset/clean-houses-invent.md deleted file mode 100644 index fe4a252d48..0000000000 --- a/.changeset/clean-houses-invent.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-graphiql': patch ---- - -Added experimental exports for the new frontend system under `/alpha`. diff --git a/.changeset/cold-apricots-poke.md b/.changeset/cold-apricots-poke.md deleted file mode 100644 index b050c8082b..0000000000 --- a/.changeset/cold-apricots-poke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Changed the processing loop task pipeline implementation from recursive to iterative diff --git a/.changeset/cold-pillows-glow.md b/.changeset/cold-pillows-glow.md deleted file mode 100644 index a3ff46327c..0000000000 --- a/.changeset/cold-pillows-glow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Switched the template to use TypeScript 5.2 by default. diff --git a/.changeset/cold-seas-repeat.md b/.changeset/cold-seas-repeat.md new file mode 100644 index 0000000000..0072c4327d --- /dev/null +++ b/.changeset/cold-seas-repeat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-code-coverage': patch +--- + +Fixed the coverage history statistics to compare newest with oldest record diff --git a/.changeset/create-app-1692704146.md b/.changeset/create-app-1692704146.md deleted file mode 100644 index b50d431d4b..0000000000 --- a/.changeset/create-app-1692704146.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Bumped create-app version. diff --git a/.changeset/create-app-1693311380.md b/.changeset/create-app-1693311380.md deleted file mode 100644 index b50d431d4b..0000000000 --- a/.changeset/create-app-1693311380.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Bumped create-app version. diff --git a/.changeset/cuddly-avocados-warn.md b/.changeset/cuddly-avocados-warn.md deleted file mode 100644 index aa70da287b..0000000000 --- a/.changeset/cuddly-avocados-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': patch ---- - -Expand techdocs.publisher.type with `googleGcs`,`awsS3`,`azureBlobStorage` and `openStackSwift` diff --git a/.changeset/curvy-roses-march.md b/.changeset/curvy-roses-march.md deleted file mode 100644 index cd38808165..0000000000 --- a/.changeset/curvy-roses-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Migrated the GitLab auth provider to be implemented using the new `@backstage/plugin-auth-backend-module-gitlab-provider` module. diff --git a/.changeset/cyan-roses-relate.md b/.changeset/cyan-roses-relate.md deleted file mode 100644 index e6dbeb6ed9..0000000000 --- a/.changeset/cyan-roses-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added the ability to create a plain backend module with the `new` command. diff --git a/.changeset/dirty-boxes-give.md b/.changeset/dirty-boxes-give.md deleted file mode 100644 index d339e49c98..0000000000 --- a/.changeset/dirty-boxes-give.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -Add the route name to an error message that appears when the backend -proxy wasn't well configured. This will help users to understand the -issue and fix the right configuration. diff --git a/.changeset/dirty-carrots-notice.md b/.changeset/dirty-carrots-notice.md deleted file mode 100644 index ccc31c25ca..0000000000 --- a/.changeset/dirty-carrots-notice.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Added `authPlugin` export for the new backend system. The plugin does not include any built-in auth providers, they must instead be added by installing additional modules, for example `authModuleGoogleProvider` from `@backstage/plugin-auth-backend-module-google-provider`. diff --git a/.changeset/dirty-cars-poke.md b/.changeset/dirty-cars-poke.md deleted file mode 100644 index 5412229f34..0000000000 --- a/.changeset/dirty-cars-poke.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -'@backstage/plugin-adr-backend': minor -'@backstage/plugin-airbrake-backend': minor -'@backstage/plugin-auth-backend': minor -'@backstage/plugin-azure-devops-backend': minor -'@backstage/plugin-badges-backend': minor -'@backstage/plugin-bazaar-backend': minor -'@backstage/plugin-catalog-backend-module-unprocessed': minor -'@backstage/plugin-devtools-backend': minor -'@backstage/plugin-entity-feedback-backend': minor -'@backstage/plugin-kafka-backend': minor -'@backstage/plugin-lighthouse-backend': minor -'@backstage/plugin-linguist-backend': minor -'@backstage/plugin-periskop-backend': minor -'@backstage/plugin-proxy-backend': minor -'@backstage/plugin-todo-backend': minor -'@backstage/plugin-user-settings-backend': minor ---- - -**BREAKING**: The export for the new backend system has been moved to be the `default` export. - -For example, if you are currently importing the plugin using the following pattern: - -```ts -import { examplePlugin } from '@backstage/plugin-example-backend'; - -backend.add(examplePlugin); -``` - -It should be migrated to this: - -```ts -backend.add(import('@backstage/plugin-example-backend')); -``` diff --git a/.changeset/dirty-cars-smoke.md b/.changeset/dirty-cars-smoke.md deleted file mode 100644 index 5ba8380d68..0000000000 --- a/.changeset/dirty-cars-smoke.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -'@backstage/plugin-app-backend': patch -'@backstage/plugin-auth-backend-module-gcp-iap-provider': patch -'@backstage/plugin-auth-backend-module-github-provider': patch -'@backstage/plugin-auth-backend-module-gitlab-provider': patch -'@backstage/plugin-auth-backend-module-google-provider': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-catalog-backend-module-aws': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-catalog-backend-module-gcp': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend-module-puppetdb': patch -'@backstage/plugin-events-backend': patch -'@backstage/plugin-events-backend-module-aws-sqs': patch -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-permission-backend': patch -'@backstage/plugin-permission-backend-module-allow-all-policy': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-search-backend': patch -'@backstage/plugin-search-backend-module-catalog': patch -'@backstage/plugin-search-backend-module-elasticsearch': patch -'@backstage/plugin-search-backend-module-explore': patch -'@backstage/plugin-search-backend-module-pg': patch -'@backstage/plugin-search-backend-module-techdocs': patch -'@backstage/plugin-techdocs-backend': patch ---- - -The export for the new backend system has been moved to be the `default` export. - -For example, if you are currently importing the plugin using the following pattern: - -```ts -import { examplePlugin } from '@backstage/plugin-example-backend'; - -backend.add(examplePlugin); -``` - -It should be migrated to this: - -```ts -backend.add(import('@backstage/plugin-example-backend')); -``` diff --git a/.changeset/dirty-garlics-kiss.md b/.changeset/dirty-garlics-kiss.md deleted file mode 100644 index 98a9b569cc..0000000000 --- a/.changeset/dirty-garlics-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Add names to blip entry links in the radar to improve accessibility diff --git a/.changeset/dirty-years-travel.md b/.changeset/dirty-years-travel.md deleted file mode 100644 index e6e5b8a608..0000000000 --- a/.changeset/dirty-years-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Added support for LCOV coverage reports diff --git a/.changeset/dry-wasps-occur.md b/.changeset/dry-wasps-occur.md deleted file mode 100644 index 0c7d231708..0000000000 --- a/.changeset/dry-wasps-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-gcp-iap-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a GCP IAP auth provider. diff --git a/.changeset/dry-yaks-type.md b/.changeset/dry-yaks-type.md deleted file mode 100644 index 3e9cdef474..0000000000 --- a/.changeset/dry-yaks-type.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/backend-tasks': patch ---- - -When starting a task that existed before, with a faster schedule than it -previously had, the task will now correctly obey the faster schedule -immediately. Before this fix, the new schedule was only obeyed after the next -pending (according to the old schedule) run had completed. diff --git a/.changeset/dull-bugs-build.md b/.changeset/dull-bugs-build.md new file mode 100644 index 0000000000..7acfe2a8a2 --- /dev/null +++ b/.changeset/dull-bugs-build.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/integration': patch +--- + +Ensure that all relevant config fields are properly marked as secret diff --git a/.changeset/dull-dolls-explode.md b/.changeset/dull-dolls-explode.md new file mode 100644 index 0000000000..10088e0818 --- /dev/null +++ b/.changeset/dull-dolls-explode.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-playlist-backend': patch +--- + +Added support to the playlist plugin for the new backend diff --git a/.changeset/dull-experts-kiss.md b/.changeset/dull-experts-kiss.md new file mode 100644 index 0000000000..eaea346e49 --- /dev/null +++ b/.changeset/dull-experts-kiss.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Fixed an issue causing `EntityPage` to show an error for entities containing special characters diff --git a/.changeset/dull-eyes-pay.md b/.changeset/dull-eyes-pay.md deleted file mode 100644 index 2a2b996051..0000000000 --- a/.changeset/dull-eyes-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-oauth2-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a `oauth2` auth provider. diff --git a/.changeset/dull-laws-camp.md b/.changeset/dull-laws-camp.md new file mode 100644 index 0000000000..9a9c7436c5 --- /dev/null +++ b/.changeset/dull-laws-camp.md @@ -0,0 +1,7 @@ +--- +'@backstage/create-app': patch +--- + +Change base node image from node:18-bullseye-slim to node:18-bookworm-slim due to Docker build error on bullseye. + +You can apply these change to your own `Dockerfile` by replacing `node:18-bullseye-slim` with `node:18-bookworm-slim` diff --git a/.changeset/dull-tables-joke.md b/.changeset/dull-tables-joke.md deleted file mode 100644 index e987377023..0000000000 --- a/.changeset/dull-tables-joke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Fixed an issue where `EntitySwitch` was preventing the display of entity errors. diff --git a/.changeset/early-rules-taste.md b/.changeset/early-rules-taste.md deleted file mode 100644 index 1a332dfe36..0000000000 --- a/.changeset/early-rules-taste.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Added a `fix` scripts that calls the new `backstage-cli repo fix` command. - -To apply this change to an existing app, make the following change to your root `package.json`: - -```diff - "test": "backstage-cli repo test", - "test:all": "backstage-cli repo test --coverage", -+ "fix": "backstage-cli repo fix", - "lint": "backstage-cli repo lint --since origin/master", -``` diff --git a/.changeset/early-trains.draw.md b/.changeset/early-trains.draw.md deleted file mode 100644 index 30aad1a08d..0000000000 --- a/.changeset/early-trains.draw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Fixed the width of the tech radar dialog so that the content fits diff --git a/.changeset/eight-radios-listen.md b/.changeset/eight-radios-listen.md deleted file mode 100644 index 0421a561c0..0000000000 --- a/.changeset/eight-radios-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -Fixed bug in styles that caused next and previous links in footer to overlap page content. diff --git a/.changeset/eight-timers-sin.md b/.changeset/eight-timers-sin.md deleted file mode 100644 index 28d6259cb4..0000000000 --- a/.changeset/eight-timers-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Export the `EntityAutocompletePicker` component. diff --git a/.changeset/eighty-actors-type.md b/.changeset/eighty-actors-type.md new file mode 100644 index 0000000000..5c55a7b0c6 --- /dev/null +++ b/.changeset/eighty-actors-type.md @@ -0,0 +1,5 @@ +--- +'@backstage/test-utils': patch +--- + +Removed the alpha `MockPluginProvider` export since the plugin configuration API has been removed. diff --git a/.changeset/eighty-emus-float.md b/.changeset/eighty-emus-float.md deleted file mode 100644 index c149affa09..0000000000 --- a/.changeset/eighty-emus-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Add ESM loader for the experimental backend start command. diff --git a/.changeset/eighty-fans-provide.md b/.changeset/eighty-fans-provide.md deleted file mode 100644 index b98bc39924..0000000000 --- a/.changeset/eighty-fans-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Fixed an issue causing `StructuredMetadataTable` to crash in case metadata contained `null` values. diff --git a/.changeset/empty-rings-type.md b/.changeset/empty-rings-type.md deleted file mode 100644 index 2aa41054f9..0000000000 --- a/.changeset/empty-rings-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Add examples for `publish:github` and `publish:gitlab` scaffolder actions. diff --git a/.changeset/fair-paws-flash.md b/.changeset/fair-paws-flash.md deleted file mode 100644 index d9a7b1827e..0000000000 --- a/.changeset/fair-paws-flash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch ---- - -Improve consistency of results from the `AzureDevOpsEntityProvider`. diff --git a/.changeset/few-nails-smile.md b/.changeset/few-nails-smile.md deleted file mode 100644 index 2fad9a0b40..0000000000 --- a/.changeset/few-nails-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-entity-feedback': patch ---- - -Improve README to note that Backstage identity is required to be configured diff --git a/.changeset/fifty-adults-shake.md b/.changeset/fifty-adults-shake.md deleted file mode 100644 index a21c5805ab..0000000000 --- a/.changeset/fifty-adults-shake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': minor ---- - -Allow configuring the processing interval in your app-config, under the `catalog.processingInterval` key. diff --git a/.changeset/fifty-pigs-travel.md b/.changeset/fifty-pigs-travel.md deleted file mode 100644 index 2f43badc52..0000000000 --- a/.changeset/fifty-pigs-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch ---- - -Fixed a bug where requests to the proxy endpoint would fail for clusters with `caFile` configured diff --git a/.changeset/forty-rocks-jog.md b/.changeset/forty-rocks-jog.md deleted file mode 100644 index aff3d34a4a..0000000000 --- a/.changeset/forty-rocks-jog.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch -'@backstage/test-utils': patch ---- - -Add pod exec terminal to Container Card diff --git a/.changeset/four-jars-protect.md b/.changeset/four-jars-protect.md new file mode 100644 index 0000000000..8469839856 --- /dev/null +++ b/.changeset/four-jars-protect.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-rollbar-backend': patch +--- + +ensure rollbar token is hidden diff --git a/.changeset/four-masks-fry.md b/.changeset/four-masks-fry.md deleted file mode 100644 index 94bd929016..0000000000 --- a/.changeset/four-masks-fry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Update OpenAPI schema to relax the encoding validation of all request parameters. diff --git a/.changeset/four-onions-clap.md b/.changeset/four-onions-clap.md new file mode 100644 index 0000000000..44d0cf9ae7 --- /dev/null +++ b/.changeset/four-onions-clap.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fix for the new backend `start` command to make it work on Windows. diff --git a/.changeset/fresh-candles-warn.md b/.changeset/fresh-candles-warn.md deleted file mode 100644 index 49ca2e5402..0000000000 --- a/.changeset/fresh-candles-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-node': patch ---- - -The `BackstageIdentityResponse` interface now has an optional `expiresInSeconds` field that can be used to signal session expiration. The `prepareBackstageIdentityResponse` utility will now also read the expiration from the provided token, and include it in the response. diff --git a/.changeset/fresh-kangaroos-tap.md b/.changeset/fresh-kangaroos-tap.md new file mode 100644 index 0000000000..5ac4d184eb --- /dev/null +++ b/.changeset/fresh-kangaroos-tap.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-plugin-api': minor +--- + +Removed the exprimental plugin configuration API. The `__experimentalReconfigure()` from the plugin options as well as the `__experimentalConfigure()` method on plugin instances have both been removed. diff --git a/.changeset/friendly-pugs-lick.md b/.changeset/friendly-pugs-lick.md deleted file mode 100644 index 3a82497da8..0000000000 --- a/.changeset/friendly-pugs-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/config': minor ---- - -Added a `readDurationFromConfig` function diff --git a/.changeset/friendly-teachers-attend.md b/.changeset/friendly-teachers-attend.md deleted file mode 100644 index 6d5c3cf745..0000000000 --- a/.changeset/friendly-teachers-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -The root logger is now initialized lazily, fixing a circular dependency issue with `@backstage/backend-app-api` that would result in `Cannot read properties of undefined (reading 'redacter')`. diff --git a/.changeset/funny-ligers-matter.md b/.changeset/funny-ligers-matter.md deleted file mode 100644 index 0cec3eb333..0000000000 --- a/.changeset/funny-ligers-matter.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Adds include and exclude configuration to feature discovery of backend packages -Adds alpha modules to feature discovery diff --git a/.changeset/funny-timers-retire.md b/.changeset/funny-timers-retire.md deleted file mode 100644 index 87cd4d8f0d..0000000000 --- a/.changeset/funny-timers-retire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added a new `repo fix` command that fixes auto-fixable problems in all packages. Initially the command fixes package export declarations, as well as marks all non-bundled frontend packages as side-effect free. Marking packages as free of side-effects can drastically reduce the Webpack bundle size. diff --git a/.changeset/gentle-elephants-fold.md b/.changeset/gentle-elephants-fold.md new file mode 100644 index 0000000000..480ee41e7a --- /dev/null +++ b/.changeset/gentle-elephants-fold.md @@ -0,0 +1,20 @@ +--- +'@backstage/plugin-catalog': minor +--- + +The catalog plugin no longer implements the experimental reconfiguration API. The create button title can now instead be configured using the new experimental internationalization API, via the `catalogTranslationRef` exported at `/alpha`. For example: + +```ts +import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha'; + +const app = createApp({ + __experimentalTranslations: { + resources: [ + createTranslationMessages({ + ref: catalogTranslationRef, + catalog_page_create_button_title: 'Create Software', + }), + ], + }, +}); +``` diff --git a/.changeset/gentle-spies-deny.md b/.changeset/gentle-spies-deny.md new file mode 100644 index 0000000000..f2d0ea7d79 --- /dev/null +++ b/.changeset/gentle-spies-deny.md @@ -0,0 +1,14 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +'@backstage/plugin-catalog-backend-module-puppetdb': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-gerrit': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-catalog-backend-module-aws': patch +--- + +Make sure to include the error message when ingestion fails diff --git a/.changeset/giant-coats-brush.md b/.changeset/giant-coats-brush.md deleted file mode 100644 index e4fe391b9e..0000000000 --- a/.changeset/giant-coats-brush.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -'@backstage/app-defaults': patch -'@backstage/catalog-client': patch -'@backstage/catalog-model': patch -'@backstage/config': patch -'@backstage/core-app-api': patch -'@backstage/core-components': patch -'@backstage/core-plugin-api': patch -'@backstage/dev-utils': patch -'@backstage/errors': patch -'@backstage/integration': patch -'@backstage/integration-react': patch -'@backstage/plugin-adr': patch -'@backstage/plugin-adr-common': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-analytics-module-ga': patch -'@backstage/plugin-analytics-module-ga4': patch -'@backstage/plugin-analytics-module-newrelic-browser': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-api-docs': patch -'@backstage/plugin-api-docs-module-protoc-gen-doc': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-azure-devops-common': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-azure-sites-common': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-bazaar': patch -'@backstage/plugin-bitbucket-cloud-common': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-catalog': patch -'@backstage/plugin-catalog-common': patch -'@backstage/plugin-catalog-graph': patch -'@backstage/plugin-catalog-import': patch -'@backstage/plugin-catalog-react': patch -'@backstage/plugin-catalog-unprocessed-entities': patch -'@backstage/plugin-cicd-statistics': patch -'@backstage/plugin-cicd-statistics-module-gitlab': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-cost-insights-common': patch -'@backstage/plugin-devtools': patch -'@backstage/plugin-devtools-common': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-entity-feedback': patch -'@backstage/plugin-entity-feedback-common': patch -'@backstage/plugin-entity-validation': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-explore-common': patch -'@backstage/plugin-explore-react': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/plugin-git-release-manager': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-gocd': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/plugin-home': patch -'@backstage/plugin-home-react': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-jenkins-common': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-kubernetes-common': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-lighthouse-common': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-linguist-common': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-newrelic-dashboard': patch -'@backstage/plugin-nomad': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-opencost': patch -'@backstage/plugin-org': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-pagerduty': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-permission-common': patch -'@backstage/plugin-permission-react': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-playlist-common': patch -'@backstage/plugin-puppetdb': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-scaffolder-common': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-search': patch -'@backstage/plugin-search-common': patch -'@backstage/plugin-search-react': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-sonarqube-react': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-stack-overflow': patch -'@backstage/plugin-stackstorm': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-tech-insights-common': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-techdocs-addons-test-utils': patch -'@backstage/plugin-techdocs-module-addons-contrib': patch -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-user-settings': patch -'@backstage/plugin-vault': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/release-manifests': patch -'@backstage/test-utils': patch -'@backstage/theme': patch -'@backstage/types': patch -'@backstage/version-bridge': patch ---- - -Mark package as being free of side effects, allowing more optimized Webpack builds. diff --git a/.changeset/gorgeous-coins-attack.md b/.changeset/gorgeous-coins-attack.md deleted file mode 100644 index d500459225..0000000000 --- a/.changeset/gorgeous-coins-attack.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Added delete alert popup when user delete the entity diff --git a/.changeset/great-chairs-swim.md b/.changeset/great-chairs-swim.md deleted file mode 100644 index e6b8ab0882..0000000000 --- a/.changeset/great-chairs-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-app-api': minor ---- - -Fixed two bugs in how the `OAuth2Session` type represents the underlying data. The `expiresAt` and `backstageIdentity` are now both optional, since that's what they are in practice. This is not considered a breaking change since it was effectively a bug in the modelling of the state that this type represents, and the type was not used in any other external contract. diff --git a/.changeset/grumpy-bikes-beg.md b/.changeset/grumpy-bikes-beg.md deleted file mode 100644 index 6fe44ee748..0000000000 --- a/.changeset/grumpy-bikes-beg.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Restored functionality to `OwnedEntityPicker` by converting deprecated `ui:options` input to `catalogFilter`. diff --git a/.changeset/grumpy-papayas-tie.md b/.changeset/grumpy-papayas-tie.md deleted file mode 100644 index 48580673d8..0000000000 --- a/.changeset/grumpy-papayas-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/integration': patch ---- - -Additional fix for Gitiles auth links diff --git a/.changeset/grumpy-ties-know.md b/.changeset/grumpy-ties-know.md deleted file mode 100644 index 86e3b0ec7d..0000000000 --- a/.changeset/grumpy-ties-know.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Add a notification when `yarn install` is taking a long time. diff --git a/.changeset/healthy-spiders-arrive.md b/.changeset/healthy-spiders-arrive.md deleted file mode 100644 index e8d110ccaa..0000000000 --- a/.changeset/healthy-spiders-arrive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Ensure direct relations are shown for User entities while keeping support for aggregating closest parent group ownership diff --git a/.changeset/healthy-tools-count.md b/.changeset/healthy-tools-count.md deleted file mode 100644 index 5d3f04159f..0000000000 --- a/.changeset/healthy-tools-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Deprecated several exports that are now available from `@backstage/plugin-auth-node` instead. diff --git a/.changeset/hip-seahorses-exist.md b/.changeset/hip-seahorses-exist.md deleted file mode 100644 index e8e247cc0a..0000000000 --- a/.changeset/hip-seahorses-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-home': patch ---- - -Align zod dependency to align with other packages. diff --git a/.changeset/honest-ads-rush.md b/.changeset/honest-ads-rush.md deleted file mode 100644 index 63510f7c1a..0000000000 --- a/.changeset/honest-ads-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Add examples for `publish:bitbucket` scaffolder actions. diff --git a/.changeset/hungry-cherries-speak.md b/.changeset/hungry-cherries-speak.md deleted file mode 100644 index bd67f61446..0000000000 --- a/.changeset/hungry-cherries-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-test-utils': patch ---- - -Add support for installing backend features via module imports, for example `startTestBackend({ features: [import('my-plugin')] })`. diff --git a/.changeset/hungry-dots-design.md b/.changeset/hungry-dots-design.md deleted file mode 100644 index 0dd8d415e9..0000000000 --- a/.changeset/hungry-dots-design.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/backend-common': patch ---- - -Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. diff --git a/.changeset/itchy-monkeys-reply.md b/.changeset/itchy-monkeys-reply.md new file mode 100644 index 0000000000..3773fe3ff8 --- /dev/null +++ b/.changeset/itchy-monkeys-reply.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-dev-utils': patch +--- + +Fix an issue where early IPC responses would be lost. diff --git a/.changeset/itchy-rabbits-exist.md b/.changeset/itchy-rabbits-exist.md new file mode 100644 index 0000000000..acac771a97 --- /dev/null +++ b/.changeset/itchy-rabbits-exist.md @@ -0,0 +1,7 @@ +--- +'@backstage/cli': minor +--- + +The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior, set `LEGACY_BACKEND_START` instead. + +This new command is no longer based on Webpack, but instead uses Node.js loaders to transpile on the fly. Rather than hot reloading modules the entire backend is now restarted on change, but the SQLite database state is still maintained across restarts via a parent process. diff --git a/.changeset/khaki-pigs-accept.md b/.changeset/khaki-pigs-accept.md deleted file mode 100644 index e00db1746f..0000000000 --- a/.changeset/khaki-pigs-accept.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-devtools-backend': patch -'@backstage/plugin-devtools-common': patch -'@backstage/plugin-devtools': patch ---- - -Show resource utilization in `DevTools` plugin diff --git a/.changeset/khaki-spiders-sniff.md b/.changeset/khaki-spiders-sniff.md deleted file mode 100644 index 53798a6cf0..0000000000 --- a/.changeset/khaki-spiders-sniff.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-user-settings': patch ---- - -conditionally rendering the user email in user profile card diff --git a/.changeset/large-comics-knock.md b/.changeset/large-comics-knock.md new file mode 100644 index 0000000000..860172579e --- /dev/null +++ b/.changeset/large-comics-knock.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +fixed issue related template editor fails with multiple templates per file. diff --git a/.changeset/late-cows-turn.md b/.changeset/late-cows-turn.md deleted file mode 100644 index 7fa775ce22..0000000000 --- a/.changeset/late-cows-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fixed a link to the frontend Backstage plugin that had pointed to itself. diff --git a/.changeset/late-hounds-yell.md b/.changeset/late-hounds-yell.md deleted file mode 100644 index 903b161c35..0000000000 --- a/.changeset/late-hounds-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Updated Dockerfile to include `apt-get update` when installing the SQLite dependency diff --git a/.changeset/late-papayas-push.md b/.changeset/late-papayas-push.md new file mode 100644 index 0000000000..07422e1b1b --- /dev/null +++ b/.changeset/late-papayas-push.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +Add support for `SidebarGroup` on the sidebar item extension. diff --git a/.changeset/lazy-pumas-hope.md b/.changeset/lazy-pumas-hope.md deleted file mode 100644 index 5e06014a3c..0000000000 --- a/.changeset/lazy-pumas-hope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-user-settings': patch ---- - -changed auto theme tooltip title to camel case diff --git a/.changeset/lazy-pumas-shop.md b/.changeset/lazy-pumas-shop.md deleted file mode 100644 index 13524aa741..0000000000 --- a/.changeset/lazy-pumas-shop.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-permission-backend': patch -'@backstage/plugin-techdocs-backend': patch -'@backstage/plugin-permission-node': patch ---- - -Minor `package.json` update. diff --git a/.changeset/lazy-rice-rule.md b/.changeset/lazy-rice-rule.md deleted file mode 100644 index 1c3a3c3250..0000000000 --- a/.changeset/lazy-rice-rule.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Fixed the plugin and module ID of the alpha `catalogModuleTemplateKind` export. diff --git a/.changeset/lemon-cups-wait.md b/.changeset/lemon-cups-wait.md new file mode 100644 index 0000000000..4dd08c21b0 --- /dev/null +++ b/.changeset/lemon-cups-wait.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +include owner chip in catalog search result item diff --git a/.changeset/lemon-donuts-clap.md b/.changeset/lemon-donuts-clap.md deleted file mode 100644 index 75408d2584..0000000000 --- a/.changeset/lemon-donuts-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-plugin-api': patch ---- - -Ensure that root scoped services cannot accept (at a type level) plugin scoped deps diff --git a/.changeset/lemon-masks-greet.md b/.changeset/lemon-masks-greet.md new file mode 100644 index 0000000000..79c7b7e92b --- /dev/null +++ b/.changeset/lemon-masks-greet.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +The `TabbedLayout` component will now also navigate when clicking the active tab, which allows for navigation back from any sub routes. diff --git a/.changeset/light-clocks-listen.md b/.changeset/light-clocks-listen.md deleted file mode 100644 index e3d841ad7d..0000000000 --- a/.changeset/light-clocks-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -Avoid eager use of `TextEncoder` in order not to break tests. diff --git a/.changeset/light-drinks-rush.md b/.changeset/light-drinks-rush.md deleted file mode 100644 index 08383ab089..0000000000 --- a/.changeset/light-drinks-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Add experimental support for frontend package discovery. diff --git a/.changeset/long-flowers-sort.md b/.changeset/long-flowers-sort.md deleted file mode 100644 index 2f25260030..0000000000 --- a/.changeset/long-flowers-sort.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Entity relations toggle should by default be aggregated for User entities diff --git a/.changeset/loud-apricots-destroy.md b/.changeset/loud-apricots-destroy.md deleted file mode 100644 index e60be6dccf..0000000000 --- a/.changeset/loud-apricots-destroy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Add description property for Rings which will be shown in the footer. diff --git a/.changeset/lovely-coins-occur.md b/.changeset/lovely-coins-occur.md new file mode 100644 index 0000000000..34a6774388 --- /dev/null +++ b/.changeset/lovely-coins-occur.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Fixes a bug where eagerly deleted entities did not properly trigger re-stitching of entities that they had relations to. diff --git a/.changeset/lovely-fans-sniff.md b/.changeset/lovely-fans-sniff.md new file mode 100644 index 0000000000..af8aebb89b --- /dev/null +++ b/.changeset/lovely-fans-sniff.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-radar': patch +--- + +Added experimental support for the declarative integration. diff --git a/.changeset/lovely-years-sniff.md b/.changeset/lovely-years-sniff.md deleted file mode 100644 index 09b86f7112..0000000000 --- a/.changeset/lovely-years-sniff.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-app-api': minor ---- - -The `OAuth` class which is used by all OAuth providers will now consider both the session expiration of both the Backstage identity as well as the upstream identity provider, and refresh the session with either of them is about to expire. diff --git a/.changeset/lucky-chicken-hear.md b/.changeset/lucky-chicken-hear.md deleted file mode 100644 index b7f0d6ec48..0000000000 --- a/.changeset/lucky-chicken-hear.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Replace `express-xml-bodyparser` with `body-parser-xml`. - -`express-xml-bodyparser` was last updated 8 years ago -and currently depends on a version of `xml2js` which -contains a vulnerability. - -This change will swap it out in favor of `body-parser-xml` -which is more maintained and depends on a more recent `xml2js` -version without the vulnerability. diff --git a/.changeset/lucky-chicken-lie.md b/.changeset/lucky-chicken-lie.md deleted file mode 100644 index 6edb3a36f6..0000000000 --- a/.changeset/lucky-chicken-lie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-gitlab-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a GitLab auth provider. diff --git a/.changeset/many-swans-eat.md b/.changeset/many-swans-eat.md new file mode 100644 index 0000000000..86580d7cfe --- /dev/null +++ b/.changeset/many-swans-eat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-badges-backend': patch +--- + +Make sure the default badge factory is used if nothing is defined diff --git a/.changeset/many-tips-attend.md b/.changeset/many-tips-attend.md deleted file mode 100644 index 34b5898803..0000000000 --- a/.changeset/many-tips-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-search-react': patch ---- - -Optionally initializes the search context with default settings for search queries only when the config is defined, rather than always overriding it. diff --git a/.changeset/mean-carpets-provide.md b/.changeset/mean-carpets-provide.md deleted file mode 100644 index b5e9f551d4..0000000000 --- a/.changeset/mean-carpets-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch ---- - -Remove duplications from Azure search before committing the new locations to the catalog. diff --git a/.changeset/mean-planes-smoke.md b/.changeset/mean-planes-smoke.md deleted file mode 100644 index b082023cde..0000000000 --- a/.changeset/mean-planes-smoke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-app-api': patch ---- - -Internal refactor diff --git a/.changeset/mean-queens-act.md b/.changeset/mean-queens-act.md deleted file mode 100644 index a895ba5705..0000000000 --- a/.changeset/mean-queens-act.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-newrelic': patch ---- - -Fixed bug in NewRelicComponent component where table would not sort correctly for numerical values. diff --git a/.changeset/mighty-crabs-cheat.md b/.changeset/mighty-crabs-cheat.md deleted file mode 100644 index ef2abbada4..0000000000 --- a/.changeset/mighty-crabs-cheat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Added the ability to disable the built-in auth providers by passing `disableDefaultProviderFactories` to `createRouter`. diff --git a/.changeset/modern-trees-add.md b/.changeset/modern-trees-add.md deleted file mode 100644 index bb5ea78a5b..0000000000 --- a/.changeset/modern-trees-add.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-techdocs': minor -'@backstage/plugin-catalog': minor ---- - -This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. diff --git a/.changeset/moody-lobsters-rescue.md b/.changeset/moody-lobsters-rescue.md new file mode 100644 index 0000000000..c739e995c5 --- /dev/null +++ b/.changeset/moody-lobsters-rescue.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bump `cypress` to fix the end-to-end tests diff --git a/.changeset/nasty-cherries-exercise.md b/.changeset/nasty-cherries-exercise.md deleted file mode 100644 index bb4386e978..0000000000 --- a/.changeset/nasty-cherries-exercise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch ---- - -fix "undefined" kind for custom resources diff --git a/.changeset/nasty-forks-beg.md b/.changeset/nasty-forks-beg.md deleted file mode 100644 index 0662431453..0000000000 --- a/.changeset/nasty-forks-beg.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@backstage/plugin-search-react': minor -'@backstage/plugin-search': minor ---- - -The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: - -```yaml -search: - query: - pageLimit: 50 -``` - -Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. diff --git a/.changeset/nasty-snails-complain.md b/.changeset/nasty-snails-complain.md deleted file mode 100644 index d7d2cac319..0000000000 --- a/.changeset/nasty-snails-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -fix logs dialog min height diff --git a/.changeset/nasty-worms-share.md b/.changeset/nasty-worms-share.md deleted file mode 100644 index 4be8315cce..0000000000 --- a/.changeset/nasty-worms-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Fix a bug that led to errors being thrown in guest mode diff --git a/.changeset/nervous-hounds-sleep.md b/.changeset/nervous-hounds-sleep.md new file mode 100644 index 0000000000..530ff348f7 --- /dev/null +++ b/.changeset/nervous-hounds-sleep.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Make themes configurable through extensions, and switched default themes to use extensions instead. diff --git a/.changeset/new-frogs-punch.md b/.changeset/new-frogs-punch.md deleted file mode 100644 index f4390e72c6..0000000000 --- a/.changeset/new-frogs-punch.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': minor ---- - -Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. - -**BREAKING** on the slight chance you were using the `setAuthTranslatorMap` method on `KubernetesBuilder`, it has been removed along with the entire `KubernetesAuthTranslator` interface. This notion has been replaced with the more focused concept of an `AuthenticationStrategy`. Converting a translator to a strategy should not be especially difficult. diff --git a/.changeset/new-sheep-cover.md b/.changeset/new-sheep-cover.md deleted file mode 100644 index 390de1a9b3..0000000000 --- a/.changeset/new-sheep-cover.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': patch ---- - -When creating the router using `createRouterFromConfig` or using the plugin for the new backend system the `linguist.useSourceLocation` configuration is now optional. diff --git a/.changeset/nice-clocks-smash.md b/.changeset/nice-clocks-smash.md new file mode 100644 index 0000000000..8a289370e5 --- /dev/null +++ b/.changeset/nice-clocks-smash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend': patch +--- + +Increase the maximum allowed length of an entity filter for tech insights fact schemas. diff --git a/.changeset/nice-dancers-explain.md b/.changeset/nice-dancers-explain.md new file mode 100644 index 0000000000..5e54a66c05 --- /dev/null +++ b/.changeset/nice-dancers-explain.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-github-provider': patch +--- + +Fixed a bug where the GitHub authenticator did not properly persist granted OAuth scopes. diff --git a/.changeset/nice-forks-remain.md b/.changeset/nice-forks-remain.md deleted file mode 100644 index 6d833ff283..0000000000 --- a/.changeset/nice-forks-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage': patch ---- - -Use fetchApi to ensure authorization is used when fetching code-coverage data diff --git a/.changeset/nine-taxis-study.md b/.changeset/nine-taxis-study.md deleted file mode 100644 index 693534c2be..0000000000 --- a/.changeset/nine-taxis-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Minor internal tweak to handle `classnames` update diff --git a/.changeset/ninety-horses-remember.md b/.changeset/ninety-horses-remember.md deleted file mode 100644 index 22ef53b340..0000000000 --- a/.changeset/ninety-horses-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -The experimental backend feature discovery now only considers default exports from packages. It no longer filters packages to include based on the package role, except that `'cli'` packages are ignored. However, the `"backstage"` field is still required in `package.json`. diff --git a/.changeset/ninety-news-visit.md b/.changeset/ninety-news-visit.md deleted file mode 100644 index 1b990f9ac7..0000000000 --- a/.changeset/ninety-news-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -The algorithm used when generating Backstage tokens can be configured via `auth.identityTokenAlgorithm`. diff --git a/.changeset/old-geese-drive.md b/.changeset/old-geese-drive.md deleted file mode 100644 index ddaa7ad30a..0000000000 --- a/.changeset/old-geese-drive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-test-utils': patch ---- - -Extended `mockService` to also include mocked variants, for example `mockServices.lifecycle.mock()`. The returned mocked implementation will have a `factory` property which is a service factory for itself. You can also pass a partial implementation of the service to the mock function to use a mock implementation of specific methods. diff --git a/.changeset/old-windows-argue.md b/.changeset/old-windows-argue.md deleted file mode 100644 index f687d1b08c..0000000000 --- a/.changeset/old-windows-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-import': minor ---- - -Slight change to the `PreparePullRequestFormProps`, because of an update to `react-hook-form`. diff --git a/.changeset/olive-cars-rescue.md b/.changeset/olive-cars-rescue.md new file mode 100644 index 0000000000..fd6c8fe331 --- /dev/null +++ b/.changeset/olive-cars-rescue.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search': patch +--- + +Create an experimental search plugin that is compatible with the declarative integration system, it is exported from `/alpha` subpath. diff --git a/.changeset/orange-houses-fly.md b/.changeset/orange-houses-fly.md deleted file mode 100644 index 546484304c..0000000000 --- a/.changeset/orange-houses-fly.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/integration': patch ---- - -Gitiles: Fixed auth prefix issue diff --git a/.changeset/late-roses-dream.md b/.changeset/perfect-pumas-protect.md similarity index 60% rename from .changeset/late-roses-dream.md rename to .changeset/perfect-pumas-protect.md index b0c2316c95..7d6bf8d6d7 100644 --- a/.changeset/late-roses-dream.md +++ b/.changeset/perfect-pumas-protect.md @@ -2,4 +2,4 @@ '@backstage/plugin-code-coverage-backend': patch --- -Add text body parser for LCOV reports +Added option to set body size limit diff --git a/.changeset/pink-cups-rescue.md b/.changeset/pink-cups-rescue.md deleted file mode 100644 index abb69e88b7..0000000000 --- a/.changeset/pink-cups-rescue.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -'@backstage/plugin-auth-node': minor ---- - -Introduced a new system for building auth providers for `@backstage/plugin-auth-backend`, which both increases the amount of code re-use across providers, and also works better with the new backend system. - -Many existing types have been moved from `@backstage/plugin-auth-backend` in order to avoid a direct dependency on the plugin from modules. - -Auth provider integrations are now primarily implemented through a pattern of creating "authenticators", which are in turn specific to each kind of integrations. Initially there are two types: `createOAuthAuthenticator` and `createProxyAuthenticator`. These come paired with functions that let you create the corresponding route handlers, `createOAuthRouteHandlers` and `createProxyAuthRouteHandlers`, as well as provider factories, `createOAuthProviderFactory` and `createProxyAuthProviderFactory`. This new authenticator pattern allows the sign-in logic to be separated from the auth integration logic, allowing it to be completely re-used across all providers of the same kind. - -The new provider factories also implement a new declarative way to configure sign-in resolvers, rather than configuration through code. Sign-in resolvers can now be configured through the `resolvers` configuration key, where the first resolver that provides an identity will be used, for example: - -```yaml -auth: - providers: - google: - development: - clientId: ... - clientSecret: ... - signIn: - resolvers: - - resolver: emailMatchingUserEntityAnnotation - - resolver: emailLocalPartMatchingUserEntityName -``` - -These configurable resolvers are created with a new `createSignInResolverFactory` function, which creates a sign-in resolver factory, optionally with an options schema that will be used both when configuring the sign-in resolver through configuration and code. - -The internal helpers from `@backstage/plugin-auth-backend` that were used to implement auth providers using passport strategies have now also been made available as public API, through `PassportHelpers` and `PassportOAuthAuthenticatorHelper`. diff --git a/.changeset/pink-months-hammer.md b/.changeset/pink-months-hammer.md deleted file mode 100644 index 20a484a389..0000000000 --- a/.changeset/pink-months-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-backend': patch ---- - -Moved `permissionModuleAllowAllPolicy` to `@backstage/plugin-permission-backend-module-allow-all-policy` diff --git a/.changeset/plenty-lamps-pump.md b/.changeset/plenty-lamps-pump.md deleted file mode 100644 index 04d0f2f4f0..0000000000 --- a/.changeset/plenty-lamps-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-adr': patch ---- - -support for i18n feature diff --git a/.changeset/plenty-llamas-double.md b/.changeset/plenty-llamas-double.md new file mode 100644 index 0000000000..b2691a2f17 --- /dev/null +++ b/.changeset/plenty-llamas-double.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-node': patch +--- + +Fix for persisted scopes not being properly restored on sign-in. diff --git a/.changeset/polite-cooks-perform.md b/.changeset/polite-cooks-perform.md new file mode 100644 index 0000000000..40766c84a3 --- /dev/null +++ b/.changeset/polite-cooks-perform.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': minor +--- + +The `createApp` config option has been replaced by a new `configLoader` option. There is now also a `pluginLoader` option that can be used to dynamically load plugins into the app. diff --git a/.changeset/polite-donuts-fail.md b/.changeset/polite-donuts-fail.md new file mode 100644 index 0000000000..9c03faaf44 --- /dev/null +++ b/.changeset/polite-donuts-fail.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Internal refactors, laying the foundation for later introducing deferred stitching (see #18062). diff --git a/.changeset/polite-forks-grin.md b/.changeset/polite-forks-grin.md deleted file mode 100644 index 8f6570ccbc..0000000000 --- a/.changeset/polite-forks-grin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fixed validation of the `fullTextFilterFields` query parameter. diff --git a/.changeset/polite-plums-share.md b/.changeset/polite-plums-share.md deleted file mode 100644 index 09c980b921..0000000000 --- a/.changeset/polite-plums-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Added some examples to the catalog OpenAPI definition diff --git a/.changeset/poor-olives-own.md b/.changeset/poor-olives-own.md deleted file mode 100644 index 6eb8b5ac2b..0000000000 --- a/.changeset/poor-olives-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fixes an issue where `order` was not a recognized parameter for the `/entities` endpoint. diff --git a/.changeset/poor-years-appear.md b/.changeset/poor-years-appear.md deleted file mode 100644 index d5b53a7051..0000000000 --- a/.changeset/poor-years-appear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-entity-feedback-backend': patch ---- - -Improve backend logging if method calls fail diff --git a/.changeset/popular-clocks-whisper.md b/.changeset/popular-clocks-whisper.md deleted file mode 100644 index 7c1d86ab03..0000000000 --- a/.changeset/popular-clocks-whisper.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Fixed a bug where package exports entry points could not be `.tsx` files. diff --git a/.changeset/popular-coins-tap.md b/.changeset/popular-coins-tap.md deleted file mode 100644 index 3ece9e20b1..0000000000 --- a/.changeset/popular-coins-tap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-tasks': patch ---- - -Use `readDurationFromConfig` from the config package diff --git a/.changeset/popular-dots-design.md b/.changeset/popular-dots-design.md new file mode 100644 index 0000000000..c333ce0105 --- /dev/null +++ b/.changeset/popular-dots-design.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Changed SupportButton menuitems to support text wrap diff --git a/.changeset/popular-readers-allow.md b/.changeset/popular-readers-allow.md deleted file mode 100644 index b89e0c264e..0000000000 --- a/.changeset/popular-readers-allow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-plugin-api': minor ---- - -Added the optional `expiresAt` field that may now be part of a `BackstageIdentityResponse`. diff --git a/.changeset/pre.json b/.changeset/pre.json index d824680e8f..46230574ed 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,399 +1,297 @@ { - "mode": "exit", + "mode": "pre", "tag": "next", "initialVersions": { - "example-app": "0.2.86", - "@backstage/app-defaults": "1.4.2", - "example-backend": "0.2.86", - "@backstage/backend-app-api": "0.5.0", - "@backstage/backend-common": "0.19.2", - "@backstage/backend-defaults": "0.2.0", + "example-app": "0.2.87", + "@backstage/app-defaults": "1.4.3", + "example-app-next": "0.0.1", + "app-next-example-plugin": "0.0.1", + "example-backend": "0.2.87", + "@backstage/backend-app-api": "0.5.3", + "@backstage/backend-common": "0.19.5", + "@backstage/backend-defaults": "0.2.3", "@backstage/backend-dev-utils": "0.1.1", - "example-backend-next": "0.0.14", - "@backstage/backend-openapi-utils": "0.0.3", - "@backstage/backend-plugin-api": "0.6.0", - "@backstage/backend-tasks": "0.5.5", - "@backstage/backend-test-utils": "0.2.0", - "@backstage/catalog-client": "1.4.3", - "@backstage/catalog-model": "1.4.1", - "@backstage/cli": "0.22.10", + "example-backend-next": "0.0.15", + "@backstage/backend-openapi-utils": "0.0.4", + "@backstage/backend-plugin-api": "0.6.3", + "@backstage/backend-plugin-manager": "0.0.1", + "@backstage/backend-tasks": "0.5.8", + "@backstage/backend-test-utils": "0.2.3", + "@backstage/catalog-client": "1.4.4", + "@backstage/catalog-model": "1.4.2", + "@backstage/cli": "0.22.13", "@backstage/cli-common": "0.1.12", - "@backstage/cli-node": "0.1.3", + "@backstage/cli-node": "0.1.4", "@backstage/codemods": "0.1.45", - "@backstage/config": "1.0.8", - "@backstage/config-loader": "1.4.0", - "@backstage/core-app-api": "1.9.1", - "@backstage/core-components": "0.13.4", - "@backstage/core-plugin-api": "1.5.3", - "@backstage/create-app": "0.5.4", - "@backstage/dev-utils": "1.0.18", - "e2e-test": "0.2.6", - "@backstage/errors": "1.2.1", + "@backstage/config": "1.1.0", + "@backstage/config-loader": "1.5.0", + "@backstage/core-app-api": "1.10.0", + "@backstage/core-components": "0.13.5", + "@backstage/core-plugin-api": "1.6.0", + "@backstage/create-app": "0.5.5", + "@backstage/dev-utils": "1.0.21", + "e2e-test": "0.2.7", + "@backstage/errors": "1.2.2", "@backstage/eslint-plugin": "0.1.3", - "@backstage/integration": "1.6.0", - "@backstage/integration-aws-node": "0.1.5", - "@backstage/integration-react": "1.1.16", - "@backstage/release-manifests": "0.0.9", - "@backstage/repo-tools": "0.3.3", - "@techdocs/cli": "1.4.5", - "techdocs-cli-embedded-app": "0.2.85", - "@backstage/test-utils": "1.4.2", - "@backstage/theme": "0.4.1", - "@backstage/types": "1.1.0", - "@backstage/version-bridge": "1.0.4", - "@backstage/plugin-adr": "0.6.4", - "@backstage/plugin-adr-backend": "0.3.6", - "@backstage/plugin-adr-common": "0.2.12", - "@backstage/plugin-airbrake": "0.3.21", - "@backstage/plugin-airbrake-backend": "0.2.21", - "@backstage/plugin-allure": "0.1.37", - "@backstage/plugin-analytics-module-ga": "0.1.32", - "@backstage/plugin-analytics-module-ga4": "0.1.3", - "@backstage/plugin-analytics-module-newrelic-browser": "0.0.1", - "@backstage/plugin-apache-airflow": "0.2.14", - "@backstage/plugin-api-docs": "0.9.7", - "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.2", - "@backstage/plugin-apollo-explorer": "0.1.14", - "@backstage/plugin-app-backend": "0.3.48", - "@backstage/plugin-app-node": "0.1.0", - "@backstage/plugin-auth-backend": "0.18.6", - "@backstage/plugin-auth-node": "0.2.17", - "@backstage/plugin-azure-devops": "0.3.3", - "@backstage/plugin-azure-devops-backend": "0.3.27", - "@backstage/plugin-azure-devops-common": "0.3.0", - "@backstage/plugin-azure-sites": "0.1.10", - "@backstage/plugin-azure-sites-backend": "0.1.10", - "@backstage/plugin-azure-sites-common": "0.1.0", - "@backstage/plugin-badges": "0.2.45", - "@backstage/plugin-badges-backend": "0.2.3", - "@backstage/plugin-bazaar": "0.2.12", - "@backstage/plugin-bazaar-backend": "0.2.11", - "@backstage/plugin-bitbucket-cloud-common": "0.2.9", - "@backstage/plugin-bitrise": "0.1.48", - "@backstage/plugin-catalog": "1.12.1", - "@backstage/plugin-catalog-backend": "1.12.0", - "@backstage/plugin-catalog-backend-module-aws": "0.2.3", - "@backstage/plugin-catalog-backend-module-azure": "0.1.19", - "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.15", - "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.15", - "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.13", - "@backstage/plugin-catalog-backend-module-gcp": "0.1.0", - "@backstage/plugin-catalog-backend-module-gerrit": "0.1.16", - "@backstage/plugin-catalog-backend-module-github": "0.3.3", - "@backstage/plugin-catalog-backend-module-gitlab": "0.2.4", - "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.4.1", - "@backstage/plugin-catalog-backend-module-ldap": "0.5.15", - "@backstage/plugin-catalog-backend-module-msgraph": "0.5.7", - "@backstage/plugin-catalog-backend-module-openapi": "0.1.14", - "@backstage/plugin-catalog-backend-module-puppetdb": "0.1.5", - "@backstage/plugin-catalog-backend-module-unprocessed": "0.2.0", - "@backstage/plugin-catalog-common": "1.0.15", - "@internal/plugin-catalog-customized": "0.0.13", - "@backstage/plugin-catalog-graph": "0.2.33", - "@backstage/plugin-catalog-graphql": "0.3.22", - "@backstage/plugin-catalog-import": "0.9.11", - "@backstage/plugin-catalog-node": "1.4.1", - "@backstage/plugin-catalog-react": "1.8.1", - "@backstage/plugin-catalog-unprocessed-entities": "0.1.2", - "@backstage/plugin-cicd-statistics": "0.1.23", - "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.17", - "@backstage/plugin-circleci": "0.3.21", - "@backstage/plugin-cloudbuild": "0.3.21", - "@backstage/plugin-code-climate": "0.1.21", - "@backstage/plugin-code-coverage": "0.2.14", - "@backstage/plugin-code-coverage-backend": "0.2.14", - "@backstage/plugin-codescene": "0.1.16", - "@backstage/plugin-config-schema": "0.1.44", - "@backstage/plugin-cost-insights": "0.12.10", - "@backstage/plugin-cost-insights-common": "0.1.1", - "@backstage/plugin-devtools": "0.1.3", - "@backstage/plugin-devtools-backend": "0.1.3", - "@backstage/plugin-devtools-common": "0.1.3", - "@backstage/plugin-dynatrace": "7.0.1", - "@backstage/plugin-entity-feedback": "0.2.4", - "@backstage/plugin-entity-feedback-backend": "0.1.6", - "@backstage/plugin-entity-feedback-common": "0.1.2", - "@backstage/plugin-entity-validation": "0.1.6", - "@backstage/plugin-events-backend": "0.2.9", - "@backstage/plugin-events-backend-module-aws-sqs": "0.2.3", - "@backstage/plugin-events-backend-module-azure": "0.1.10", - "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.10", - "@backstage/plugin-events-backend-module-gerrit": "0.1.10", - "@backstage/plugin-events-backend-module-github": "0.1.10", - "@backstage/plugin-events-backend-module-gitlab": "0.1.10", - "@backstage/plugin-events-backend-test-utils": "0.1.10", - "@backstage/plugin-events-node": "0.2.9", - "@internal/plugin-todo-list": "1.0.16", - "@internal/plugin-todo-list-backend": "1.0.16", - "@internal/plugin-todo-list-common": "1.0.12", - "@backstage/plugin-explore": "0.4.7", - "@backstage/plugin-explore-backend": "0.0.10", - "@backstage/plugin-explore-common": "0.0.1", - "@backstage/plugin-explore-react": "0.0.30", - "@backstage/plugin-firehydrant": "0.2.5", - "@backstage/plugin-fossa": "0.2.53", - "@backstage/plugin-gcalendar": "0.3.17", - "@backstage/plugin-gcp-projects": "0.3.40", - "@backstage/plugin-git-release-manager": "0.3.34", - "@backstage/plugin-github-actions": "0.6.2", - "@backstage/plugin-github-deployments": "0.1.52", - "@backstage/plugin-github-issues": "0.2.10", - "@backstage/plugin-github-pull-requests-board": "0.1.15", - "@backstage/plugin-gitops-profiles": "0.3.39", - "@backstage/plugin-gocd": "0.1.27", - "@backstage/plugin-graphiql": "0.2.53", - "@backstage/plugin-graphql-backend": "0.1.38", - "@backstage/plugin-graphql-voyager": "0.1.6", - "@backstage/plugin-home": "0.5.5", - "@backstage/plugin-home-react": "0.1.2", - "@backstage/plugin-ilert": "0.2.10", - "@backstage/plugin-jenkins": "0.8.3", - "@backstage/plugin-jenkins-backend": "0.2.3", - "@backstage/plugin-jenkins-common": "0.1.18", - "@backstage/plugin-kafka": "0.3.21", - "@backstage/plugin-kafka-backend": "0.2.41", - "@backstage/plugin-kubernetes": "0.10.0", - "@backstage/plugin-kubernetes-backend": "0.11.3", - "@backstage/plugin-kubernetes-common": "0.6.5", - "@backstage/plugin-lighthouse": "0.4.6", - "@backstage/plugin-lighthouse-backend": "0.2.4", - "@backstage/plugin-lighthouse-common": "0.1.2", - "@backstage/plugin-linguist": "0.1.6", - "@backstage/plugin-linguist-backend": "0.4.0", - "@backstage/plugin-linguist-common": "0.1.1", - "@backstage/plugin-microsoft-calendar": "0.1.6", - "@backstage/plugin-newrelic": "0.3.39", - "@backstage/plugin-newrelic-dashboard": "0.2.14", - "@backstage/plugin-nomad": "0.1.2", - "@backstage/plugin-nomad-backend": "0.1.2", - "@backstage/plugin-octopus-deploy": "0.2.3", - "@backstage/plugin-org": "0.6.11", - "@backstage/plugin-org-react": "0.1.10", - "@backstage/plugin-pagerduty": "0.6.2", - "@backstage/plugin-periskop": "0.1.19", - "@backstage/plugin-periskop-backend": "0.1.19", - "@backstage/plugin-permission-backend": "0.5.23", - "@backstage/plugin-permission-common": "0.7.7", - "@backstage/plugin-permission-node": "0.7.11", - "@backstage/plugin-permission-react": "0.4.14", - "@backstage/plugin-playlist": "0.1.13", - "@backstage/plugin-playlist-backend": "0.3.4", - "@backstage/plugin-playlist-common": "0.1.9", - "@backstage/plugin-proxy-backend": "0.3.0", - "@backstage/plugin-puppetdb": "0.1.4", - "@backstage/plugin-rollbar": "0.4.21", - "@backstage/plugin-rollbar-backend": "0.1.45", - "@backstage/plugin-scaffolder": "1.14.2", - "@backstage/plugin-scaffolder-backend": "1.16.0", - "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.2.1", - "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.24", - "@backstage/plugin-scaffolder-backend-module-gitlab": "0.2.3", - "@backstage/plugin-scaffolder-backend-module-rails": "0.4.17", - "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.8", - "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.21", - "@backstage/plugin-scaffolder-common": "1.4.0", - "@backstage/plugin-scaffolder-node": "0.2.0", - "@backstage/plugin-scaffolder-react": "1.5.2", - "@backstage/plugin-search": "1.3.4", - "@backstage/plugin-search-backend": "1.4.0", - "@backstage/plugin-search-backend-module-catalog": "0.1.4", - "@backstage/plugin-search-backend-module-elasticsearch": "1.3.3", - "@backstage/plugin-search-backend-module-explore": "0.1.4", - "@backstage/plugin-search-backend-module-pg": "0.5.9", - "@backstage/plugin-search-backend-module-techdocs": "0.1.4", - "@backstage/plugin-search-backend-node": "1.2.4", - "@backstage/plugin-search-common": "1.2.5", - "@backstage/plugin-search-react": "1.6.4", - "@backstage/plugin-sentry": "0.5.6", - "@backstage/plugin-shortcuts": "0.3.13", - "@backstage/plugin-sonarqube": "0.7.2", - "@backstage/plugin-sonarqube-backend": "0.2.2", - "@backstage/plugin-sonarqube-react": "0.1.7", - "@backstage/plugin-splunk-on-call": "0.4.10", - "@backstage/plugin-stack-overflow": "0.1.19", - "@backstage/plugin-stack-overflow-backend": "0.2.4", - "@backstage/plugin-stackstorm": "0.1.5", - "@backstage/plugin-tech-insights": "0.3.13", - "@backstage/plugin-tech-insights-backend": "0.5.14", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.32", - "@backstage/plugin-tech-insights-common": "0.2.11", - "@backstage/plugin-tech-insights-node": "0.4.6", - "@backstage/plugin-tech-radar": "0.6.7", - "@backstage/plugin-techdocs": "1.6.6", - "@backstage/plugin-techdocs-addons-test-utils": "1.0.17", - "@backstage/plugin-techdocs-backend": "1.6.5", - "@backstage/plugin-techdocs-module-addons-contrib": "1.0.16", - "@backstage/plugin-techdocs-node": "1.7.4", - "@backstage/plugin-techdocs-react": "1.1.9", - "@backstage/plugin-todo": "0.2.23", - "@backstage/plugin-todo-backend": "0.2.0", - "@backstage/plugin-user-settings": "0.7.6", - "@backstage/plugin-user-settings-backend": "0.1.12", - "@backstage/plugin-vault": "0.1.15", - "@backstage/plugin-vault-backend": "0.3.4", - "@backstage/plugin-xcmetrics": "0.2.41", - "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.0.0", - "@backstage/plugin-auth-backend-module-github-provider": "0.0.0", - "@backstage/plugin-auth-backend-module-google-provider": "0.0.0", - "@backstage/plugin-opencost": "0.1.0", - "example-app-next": "0.0.0", - "@backstage/frontend-app-api": "0.0.0", - "@backstage/frontend-plugin-api": "0.0.0", - "@backstage/plugin-auth-backend-module-gitlab-provider": "0.0.0", - "@backstage/backend-plugin-manager": "0.0.0", - "@backstage/plugin-permission-backend-module-allow-all-policy": "0.0.0", - "app-next-example-plugin": "0.0.0", - "@backstage/plugin-auth-backend-module-oauth2-provider": "0.0.0", - "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.0.0" + "@backstage/frontend-app-api": "0.1.0", + "@backstage/frontend-plugin-api": "0.1.0", + "@backstage/integration": "1.7.0", + "@backstage/integration-aws-node": "0.1.6", + "@backstage/integration-react": "1.1.19", + "@backstage/release-manifests": "0.0.10", + "@backstage/repo-tools": "0.3.4", + "@techdocs/cli": "1.5.0", + "techdocs-cli-embedded-app": "0.2.86", + "@backstage/test-utils": "1.4.3", + "@backstage/theme": "0.4.2", + "@backstage/types": "1.1.1", + "@backstage/version-bridge": "1.0.5", + "@backstage/plugin-adr": "0.6.7", + "@backstage/plugin-adr-backend": "0.4.0", + "@backstage/plugin-adr-common": "0.2.15", + "@backstage/plugin-airbrake": "0.3.24", + "@backstage/plugin-airbrake-backend": "0.3.0", + "@backstage/plugin-allure": "0.1.40", + "@backstage/plugin-analytics-module-ga": "0.1.33", + "@backstage/plugin-analytics-module-ga4": "0.1.4", + "@backstage/plugin-analytics-module-newrelic-browser": "0.0.2", + "@backstage/plugin-apache-airflow": "0.2.15", + "@backstage/plugin-api-docs": "0.9.11", + "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.3", + "@backstage/plugin-apollo-explorer": "0.1.15", + "@backstage/plugin-app-backend": "0.3.51", + "@backstage/plugin-app-node": "0.1.3", + "@backstage/plugin-auth-backend": "0.19.0", + "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.1.0", + "@backstage/plugin-auth-backend-module-github-provider": "0.1.0", + "@backstage/plugin-auth-backend-module-gitlab-provider": "0.1.0", + "@backstage/plugin-auth-backend-module-google-provider": "0.1.0", + "@backstage/plugin-auth-backend-module-oauth2-provider": "0.1.0", + "@backstage/plugin-auth-node": "0.3.0", + "@backstage/plugin-azure-devops": "0.3.6", + "@backstage/plugin-azure-devops-backend": "0.4.0", + "@backstage/plugin-azure-devops-common": "0.3.1", + "@backstage/plugin-azure-sites": "0.1.13", + "@backstage/plugin-azure-sites-backend": "0.1.13", + "@backstage/plugin-azure-sites-common": "0.1.1", + "@backstage/plugin-badges": "0.2.48", + "@backstage/plugin-badges-backend": "0.3.0", + "@backstage/plugin-bazaar": "0.2.16", + "@backstage/plugin-bazaar-backend": "0.3.0", + "@backstage/plugin-bitbucket-cloud-common": "0.2.12", + "@backstage/plugin-bitrise": "0.1.51", + "@backstage/plugin-catalog": "1.13.0", + "@backstage/plugin-catalog-backend": "1.13.0", + "@backstage/plugin-catalog-backend-module-aws": "0.2.6", + "@backstage/plugin-catalog-backend-module-azure": "0.1.22", + "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.18", + "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.18", + "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.16", + "@backstage/plugin-catalog-backend-module-gcp": "0.1.3", + "@backstage/plugin-catalog-backend-module-gerrit": "0.1.19", + "@backstage/plugin-catalog-backend-module-github": "0.4.0", + "@backstage/plugin-catalog-backend-module-gitlab": "0.3.0", + "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.4.6", + "@backstage/plugin-catalog-backend-module-ldap": "0.5.18", + "@backstage/plugin-catalog-backend-module-msgraph": "0.5.10", + "@backstage/plugin-catalog-backend-module-openapi": "0.1.19", + "@backstage/plugin-catalog-backend-module-puppetdb": "0.1.8", + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.1.0", + "@backstage/plugin-catalog-backend-module-unprocessed": "0.3.0", + "@backstage/plugin-catalog-common": "1.0.16", + "@internal/plugin-catalog-customized": "0.0.14", + "@backstage/plugin-catalog-graph": "0.2.36", + "@backstage/plugin-catalog-graphql": "0.3.23", + "@backstage/plugin-catalog-import": "0.10.0", + "@backstage/plugin-catalog-node": "1.4.4", + "@backstage/plugin-catalog-react": "1.8.4", + "@backstage/plugin-catalog-unprocessed-entities": "0.1.3", + "@backstage/plugin-cicd-statistics": "0.1.26", + "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.20", + "@backstage/plugin-circleci": "0.3.24", + "@backstage/plugin-cloudbuild": "0.3.24", + "@backstage/plugin-code-climate": "0.1.24", + "@backstage/plugin-code-coverage": "0.2.17", + "@backstage/plugin-code-coverage-backend": "0.2.17", + "@backstage/plugin-codescene": "0.1.17", + "@backstage/plugin-config-schema": "0.1.45", + "@backstage/plugin-cost-insights": "0.12.13", + "@backstage/plugin-cost-insights-common": "0.1.2", + "@backstage/plugin-devtools": "0.1.4", + "@backstage/plugin-devtools-backend": "0.2.0", + "@backstage/plugin-devtools-common": "0.1.4", + "@backstage/plugin-dynatrace": "7.0.4", + "@backstage/plugin-entity-feedback": "0.2.7", + "@backstage/plugin-entity-feedback-backend": "0.2.0", + "@backstage/plugin-entity-feedback-common": "0.1.3", + "@backstage/plugin-entity-validation": "0.1.9", + "@backstage/plugin-events-backend": "0.2.12", + "@backstage/plugin-events-backend-module-aws-sqs": "0.2.6", + "@backstage/plugin-events-backend-module-azure": "0.1.13", + "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.13", + "@backstage/plugin-events-backend-module-gerrit": "0.1.13", + "@backstage/plugin-events-backend-module-github": "0.1.13", + "@backstage/plugin-events-backend-module-gitlab": "0.1.13", + "@backstage/plugin-events-backend-test-utils": "0.1.13", + "@backstage/plugin-events-node": "0.2.12", + "@internal/plugin-todo-list": "1.0.17", + "@internal/plugin-todo-list-backend": "1.0.17", + "@internal/plugin-todo-list-common": "1.0.13", + "@backstage/plugin-explore": "0.4.10", + "@backstage/plugin-explore-backend": "0.0.13", + "@backstage/plugin-explore-common": "0.0.2", + "@backstage/plugin-explore-react": "0.0.31", + "@backstage/plugin-firehydrant": "0.2.8", + "@backstage/plugin-fossa": "0.2.56", + "@backstage/plugin-gcalendar": "0.3.18", + "@backstage/plugin-gcp-projects": "0.3.41", + "@backstage/plugin-git-release-manager": "0.3.37", + "@backstage/plugin-github-actions": "0.6.5", + "@backstage/plugin-github-deployments": "0.1.55", + "@backstage/plugin-github-issues": "0.2.13", + "@backstage/plugin-github-pull-requests-board": "0.1.18", + "@backstage/plugin-gitops-profiles": "0.3.40", + "@backstage/plugin-gocd": "0.1.30", + "@backstage/plugin-graphiql": "0.2.54", + "@backstage/plugin-graphql-backend": "0.1.41", + "@backstage/plugin-graphql-voyager": "0.1.7", + "@backstage/plugin-home": "0.5.8", + "@backstage/plugin-home-react": "0.1.3", + "@backstage/plugin-ilert": "0.2.13", + "@backstage/plugin-jenkins": "0.8.6", + "@backstage/plugin-jenkins-backend": "0.2.6", + "@backstage/plugin-jenkins-common": "0.1.19", + "@backstage/plugin-kafka": "0.3.24", + "@backstage/plugin-kafka-backend": "0.3.0", + "@backstage/plugin-kubernetes": "0.10.3", + "@backstage/plugin-kubernetes-backend": "0.12.0", + "@backstage/plugin-kubernetes-common": "0.6.6", + "@backstage/plugin-lighthouse": "0.4.9", + "@backstage/plugin-lighthouse-backend": "0.3.0", + "@backstage/plugin-lighthouse-common": "0.1.3", + "@backstage/plugin-linguist": "0.1.9", + "@backstage/plugin-linguist-backend": "0.5.0", + "@backstage/plugin-linguist-common": "0.1.2", + "@backstage/plugin-microsoft-calendar": "0.1.7", + "@backstage/plugin-newrelic": "0.3.40", + "@backstage/plugin-newrelic-dashboard": "0.2.17", + "@backstage/plugin-nomad": "0.1.5", + "@backstage/plugin-nomad-backend": "0.1.5", + "@backstage/plugin-octopus-deploy": "0.2.6", + "@backstage/plugin-opencost": "0.2.0", + "@backstage/plugin-org": "0.6.14", + "@backstage/plugin-org-react": "0.1.13", + "@backstage/plugin-pagerduty": "0.6.5", + "@backstage/plugin-periskop": "0.1.22", + "@backstage/plugin-periskop-backend": "0.2.0", + "@backstage/plugin-permission-backend": "0.5.26", + "@backstage/plugin-permission-backend-module-allow-all-policy": "0.1.0", + "@backstage/plugin-permission-common": "0.7.8", + "@backstage/plugin-permission-node": "0.7.14", + "@backstage/plugin-permission-react": "0.4.15", + "@backstage/plugin-playlist": "0.1.16", + "@backstage/plugin-playlist-backend": "0.3.7", + "@backstage/plugin-playlist-common": "0.1.10", + "@backstage/plugin-proxy-backend": "0.4.0", + "@backstage/plugin-puppetdb": "0.1.7", + "@backstage/plugin-rollbar": "0.4.24", + "@backstage/plugin-rollbar-backend": "0.1.48", + "@backstage/plugin-scaffolder": "1.15.0", + "@backstage/plugin-scaffolder-backend": "1.17.0", + "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.2.4", + "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.27", + "@backstage/plugin-scaffolder-backend-module-gitlab": "0.2.6", + "@backstage/plugin-scaffolder-backend-module-rails": "0.4.20", + "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.11", + "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.24", + "@backstage/plugin-scaffolder-common": "1.4.1", + "@backstage/plugin-scaffolder-node": "0.2.3", + "@backstage/plugin-scaffolder-react": "1.5.5", + "@backstage/plugin-search": "1.4.0", + "@backstage/plugin-search-backend": "1.4.3", + "@backstage/plugin-search-backend-module-catalog": "0.1.7", + "@backstage/plugin-search-backend-module-elasticsearch": "1.3.6", + "@backstage/plugin-search-backend-module-explore": "0.1.7", + "@backstage/plugin-search-backend-module-pg": "0.5.12", + "@backstage/plugin-search-backend-module-techdocs": "0.1.7", + "@backstage/plugin-search-backend-node": "1.2.7", + "@backstage/plugin-search-common": "1.2.6", + "@backstage/plugin-search-react": "1.7.0", + "@backstage/plugin-sentry": "0.5.9", + "@backstage/plugin-shortcuts": "0.3.14", + "@backstage/plugin-sonarqube": "0.7.5", + "@backstage/plugin-sonarqube-backend": "0.2.5", + "@backstage/plugin-sonarqube-react": "0.1.8", + "@backstage/plugin-splunk-on-call": "0.4.13", + "@backstage/plugin-stack-overflow": "0.1.20", + "@backstage/plugin-stack-overflow-backend": "0.2.7", + "@backstage/plugin-stackstorm": "0.1.6", + "@backstage/plugin-tech-insights": "0.3.16", + "@backstage/plugin-tech-insights-backend": "0.5.17", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.35", + "@backstage/plugin-tech-insights-common": "0.2.12", + "@backstage/plugin-tech-insights-node": "0.4.9", + "@backstage/plugin-tech-radar": "0.6.8", + "@backstage/plugin-techdocs": "1.7.0", + "@backstage/plugin-techdocs-addons-test-utils": "1.0.21", + "@backstage/plugin-techdocs-backend": "1.7.0", + "@backstage/plugin-techdocs-module-addons-contrib": "1.1.0", + "@backstage/plugin-techdocs-node": "1.8.0", + "@backstage/plugin-techdocs-react": "1.1.11", + "@backstage/plugin-todo": "0.2.27", + "@backstage/plugin-todo-backend": "0.3.1", + "@backstage/plugin-user-settings": "0.7.10", + "@backstage/plugin-user-settings-backend": "0.2.1", + "@backstage/plugin-vault": "0.1.19", + "@backstage/plugin-vault-backend": "0.3.8", + "@backstage/plugin-xcmetrics": "0.2.43", + "@backstage/e2e-test-utils": "0.0.0" }, "changesets": [ - "big-bananas-sleep", - "big-masks-divide", - "big-spies-agree", - "blue-rats-drop", - "brave-books-pretend", - "brave-carrots-occur", - "calm-cups-smile", - "catalog-everybody-to-the-limit", - "chatty-goats-mate", - "chatty-spiders-serve", - "chilly-balloons-enjoy", - "chilly-parrots-yell", - "clean-houses-invent", - "cold-apricots-poke", - "create-app-1692704146", - "create-app-1693311380", - "cuddly-avocados-warn", - "curvy-roses-march", - "cyan-roses-relate", - "dirty-boxes-give", - "dirty-carrots-notice", - "dirty-cars-poke", - "dirty-cars-smoke", - "dirty-garlics-kiss", - "dirty-years-travel", - "dry-wasps-occur", - "dull-eyes-pay", - "dull-tables-joke", - "early-rules-taste", - "early-trains.draw", - "eight-radios-listen", - "eight-timers-sin", - "eighty-emus-float", - "eighty-fans-provide", - "empty-rings-type", - "fair-paws-flash", - "few-nails-smile", - "fifty-adults-shake", - "forty-rocks-jog", - "four-masks-fry", - "fresh-candles-warn", - "friendly-pugs-lick", - "funny-ligers-matter", - "funny-timers-retire", - "giant-coats-brush", - "gorgeous-coins-attack", - "great-chairs-swim", - "grumpy-bikes-beg", - "grumpy-papayas-tie", - "grumpy-ties-know", - "healthy-spiders-arrive", - "healthy-tools-count", - "hip-seahorses-exist", - "honest-ads-rush", - "hungry-cherries-speak", - "hungry-dots-design", - "khaki-pigs-accept", - "khaki-spiders-sniff", - "late-cows-turn", - "late-hounds-yell", - "late-roses-dream", - "lazy-pumas-hope", - "lazy-pumas-shop", - "lazy-rice-rule", - "lemon-donuts-clap", - "light-drinks-rush", - "long-flowers-sort", - "loud-apricots-destroy", - "lovely-years-sniff", - "lucky-chicken-hear", - "lucky-chicken-lie", - "many-tips-attend", - "mean-carpets-provide", - "mean-planes-smoke", - "mean-queens-act", - "mighty-crabs-cheat", - "modern-trees-add", - "nasty-cherries-exercise", - "nasty-forks-beg", - "nasty-snails-complain", - "nasty-worms-share", - "new-sheep-cover", - "nice-forks-remain", - "ninety-horses-remember", - "ninety-news-visit", - "old-geese-drive", - "orange-houses-fly", - "pink-cups-rescue", - "pink-months-hammer", - "plenty-lamps-pump", - "polite-forks-grin", - "polite-plums-share", - "poor-olives-own", - "poor-years-appear", - "popular-clocks-whisper", - "popular-coins-tap", - "popular-readers-allow", - "pretty-otters-whisper", - "proud-lamps-cross", - "red-pens-knock", - "renovate-2ebf420", - "renovate-36e7f58", - "renovate-76185f9", - "renovate-b129f45", - "renovate-bbda8e8", - "repo-p-lisa", - "repo-tools-boo-descriptions-two-electric-boogaloo", - "repo-tools-boo-descriptions", - "repo-tools-ci-toldya-so", - "rotten-bees-wave", - "rude-dolphins-reply", - "short-planets-argue", - "silent-icons-deny", - "silent-numbers-retire", - "silly-emus-remain", - "six-radios-smile", - "six-wolves-admire", - "slow-ducks-hunt", - "slow-queens-visit", - "smart-islands-jog", - "stale-points-breathe", - "strange-frogs-count", - "stupid-ants-change", - "sweet-hairs-complain", - "sweet-pens-hunt", - "swift-frogs-drop", - "tall-countries-float", - "tall-items-clap", - "tall-peas-visit", - "tame-jokes-do", - "tender-garlics-report", - "thick-pets-drive", - "thin-dryers-repeat", - "three-hounds-wonder", - "tricky-melons-fold", - "twelve-elephants-pay", - "twenty-worms-enjoy", - "warm-llamas-bake", - "warm-panthers-lick", - "weak-tomatoes-dance", - "wet-donuts-fry", - "wise-tables-add", - "witty-ants-cover", - "witty-pans-flash", - "yellow-trains-protect", - "yellow-yaks-behave", - "young-ants-nail", - "young-panthers-mix" + "angry-badgers-beg", + "big-spies-beam", + "calm-scissors-rescue", + "chatty-papayas-care", + "clean-forks-love", + "dull-bugs-build", + "dull-dolls-explode", + "dull-experts-kiss", + "dull-laws-camp", + "eighty-actors-type", + "four-jars-protect", + "four-onions-clap", + "fresh-kangaroos-tap", + "gentle-elephants-fold", + "gentle-spies-deny", + "itchy-rabbits-exist", + "large-comics-knock", + "lemon-cups-wait", + "lovely-coins-occur", + "lovely-fans-sniff", + "moody-lobsters-rescue", + "nice-clocks-smash", + "nice-dancers-explain", + "perfect-pumas-protect", + "plenty-llamas-double", + "polite-cooks-perform", + "polite-donuts-fail", + "pretty-apes-sneeze", + "pretty-steaks-serve", + "purple-chefs-wait", + "quick-weeks-explode", + "shy-clouds-reflect", + "silent-years-bake", + "small-pugs-build", + "spotty-badgers-wash", + "stupid-eagles-shave", + "tasty-doors-switch", + "ten-seals-wait", + "thirty-coins-sneeze", + "tiny-garlics-cheer", + "twelve-clouds-design", + "wet-olives-wave", + "wet-timers-chew", + "wild-jobs-greet", + "yellow-rings-invent" ] } diff --git a/.changeset/pretty-apes-sneeze.md b/.changeset/pretty-apes-sneeze.md new file mode 100644 index 0000000000..a1008dc951 --- /dev/null +++ b/.changeset/pretty-apes-sneeze.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-user-settings': patch +--- + +Fixed a bug where the theme icons would not be colored according to their active state. diff --git a/.changeset/pretty-otters-whisper.md b/.changeset/pretty-otters-whisper.md deleted file mode 100644 index 7019596b38..0000000000 --- a/.changeset/pretty-otters-whisper.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-techdocs-node': minor -'@backstage/plugin-techdocs-backend': minor ---- - -Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. diff --git a/.changeset/pretty-steaks-serve.md b/.changeset/pretty-steaks-serve.md new file mode 100644 index 0000000000..8ec78e0aea --- /dev/null +++ b/.changeset/pretty-steaks-serve.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Added a template for creating `node-library` packages with `yarn new`. diff --git a/.changeset/proud-lamps-cross.md b/.changeset/proud-lamps-cross.md deleted file mode 100644 index cd2528a94c..0000000000 --- a/.changeset/proud-lamps-cross.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Include auth token when fetching entity diff --git a/.changeset/purple-chefs-wait.md b/.changeset/purple-chefs-wait.md new file mode 100644 index 0000000000..9a8b1f9799 --- /dev/null +++ b/.changeset/purple-chefs-wait.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +Adding `requestInterceptor` option to `api-docs` and pass it to SwaggerUI. This will enable to configure a proxy or headers to be sent to all the request made through the `Try it out` button on SwaggerUI. diff --git a/.changeset/purple-forks-fetch.md b/.changeset/purple-forks-fetch.md new file mode 100644 index 0000000000..022fc32e71 --- /dev/null +++ b/.changeset/purple-forks-fetch.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Register default api implementations when creating declarative integrated apps. diff --git a/.changeset/quick-weeks-explode.md b/.changeset/quick-weeks-explode.md new file mode 100644 index 0000000000..fcc88263ec --- /dev/null +++ b/.changeset/quick-weeks-explode.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Remove third type parameter used for `MockInstance`, in order to be compatible with older versions of `@types/jest`. diff --git a/.changeset/red-bees-try.md b/.changeset/red-bees-try.md new file mode 100644 index 0000000000..de7eacfe14 --- /dev/null +++ b/.changeset/red-bees-try.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fixed an issue where the new backend start command would not gracefully shut down the backend process on Windows. diff --git a/.changeset/red-pens-knock.md b/.changeset/red-pens-knock.md deleted file mode 100644 index 98ee51b894..0000000000 --- a/.changeset/red-pens-knock.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -'@backstage/plugin-analytics-module-newrelic-browser': patch -'@backstage/plugin-techdocs-module-addons-contrib': patch -'@backstage/plugin-catalog-unprocessed-entities': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/plugin-techdocs-addons-test-utils': patch -'@backstage/plugin-analytics-module-ga4': patch -'@backstage/plugin-analytics-module-ga': patch -'@backstage/plugin-git-release-manager': patch -'@backstage/integration-react': patch -'@backstage/release-manifests': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-entity-validation': patch -'@backstage/core-components': patch -'@backstage/core-plugin-api': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-entity-feedback': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/config-loader': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-badges-backend': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-stack-overflow': patch -'@backstage/app-defaults': patch -'@backstage/core-app-api': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-explore-react': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-user-settings': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/create-app': patch -'@backstage/test-utils': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-firehydrant': patch -'@backstage/dev-utils': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-home-react': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-stackstorm': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-pagerduty': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-api-docs': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-devtools': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-puppetdb': patch -'@backstage/plugin-techdocs': patch -'@backstage/config': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-search': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-nomad': patch -'@backstage/plugin-vault': patch -'@backstage/cli': patch -'@backstage/plugin-gocd': patch -'@backstage/plugin-home': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-adr': patch -'@backstage/plugin-org': patch ---- - -Removed `@types/node` dependency diff --git a/.changeset/renovate-2ebf420.md b/.changeset/renovate-2ebf420.md deleted file mode 100644 index cbd1e76538..0000000000 --- a/.changeset/renovate-2ebf420.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/core-components': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-sonarqube': patch ---- - -Updated dependency `rc-progress` to `3.5.1`. diff --git a/.changeset/renovate-36e7f58.md b/.changeset/renovate-36e7f58.md deleted file mode 100644 index ed84727e2d..0000000000 --- a/.changeset/renovate-36e7f58.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@backstage/plugin-home-react': patch -'@backstage/plugin-home': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-scaffolder': patch ---- - -Updated dependency `@rjsf/utils` to `5.13.0`. -Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. -Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. -Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. diff --git a/.changeset/renovate-76185f9.md b/.changeset/renovate-76185f9.md deleted file mode 100644 index 5e23f3cfda..0000000000 --- a/.changeset/renovate-76185f9.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-cost-insights': patch ---- - -Updated dependency `@types/pluralize` to `^0.0.30`. diff --git a/.changeset/renovate-a1c52e8.md b/.changeset/renovate-a1c52e8.md new file mode 100644 index 0000000000..c11c866b68 --- /dev/null +++ b/.changeset/renovate-a1c52e8.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-cost-insights': patch +--- + +Updated dependency `@types/pluralize` to `^0.0.31`. diff --git a/.changeset/renovate-b129f45.md b/.changeset/renovate-b129f45.md deleted file mode 100644 index 0f747fba5b..0000000000 --- a/.changeset/renovate-b129f45.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Updated dependency `run-script-webpack-plugin` to `^0.2.0`. diff --git a/.changeset/renovate-bbda8e8.md b/.changeset/renovate-bbda8e8.md deleted file mode 100644 index a43e1c55a9..0000000000 --- a/.changeset/renovate-bbda8e8.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -Updated dependency `use-immer` to `^0.9.0`. diff --git a/.changeset/repo-p-lisa.md b/.changeset/repo-p-lisa.md deleted file mode 100644 index d6a0fa56f4..0000000000 --- a/.changeset/repo-p-lisa.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -The `generate-catalog-info` command now uses the first listed `CODEOWNER` as Component owner when initially -creating the `catalog-info.yaml` file. It continues to allow any one listed `CODEOWNER` when updating -entity metadata. diff --git a/.changeset/repo-tools-boo-descriptions-two-electric-boogaloo.md b/.changeset/repo-tools-boo-descriptions-two-electric-boogaloo.md deleted file mode 100644 index 8cb6d49153..0000000000 --- a/.changeset/repo-tools-boo-descriptions-two-electric-boogaloo.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Fixed a bug with the `generate-catalog-info` command that could cause `metadata.description` values to be overwritten by `package.json` description values only because unrelated attributes were being changed. diff --git a/.changeset/repo-tools-boo-descriptions.md b/.changeset/repo-tools-boo-descriptions.md deleted file mode 100644 index 5973dd7127..0000000000 --- a/.changeset/repo-tools-boo-descriptions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Fixed a bug with the `generate-catalog-info` command that could cause the `--dry-run` flag to indicate changes to files when no changes would actually be made if the command were run without the flag. diff --git a/.changeset/repo-tools-ci-toldya-so.md b/.changeset/repo-tools-ci-toldya-so.md deleted file mode 100644 index 20425fc631..0000000000 --- a/.changeset/repo-tools-ci-toldya-so.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Added a `--ci` flag to the `generate-catalog-info` command. This flag behaves similarly to the same flag on `api-reports`: if `catalog-info.yaml` files would have been added or modified, then the process exits with status code `1`, and instructions are printed. diff --git a/.changeset/rotten-bees-wave.md b/.changeset/rotten-bees-wave.md deleted file mode 100644 index a5ce8cae85..0000000000 --- a/.changeset/rotten-bees-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': minor ---- - -Added a `catalogModuleGithubOrgEntityProvider` for the new backend system diff --git a/.changeset/rude-dolphins-reply.md b/.changeset/rude-dolphins-reply.md deleted file mode 100644 index 89545cde1f..0000000000 --- a/.changeset/rude-dolphins-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-module-addons-contrib': minor ---- - -Enable zoom icon for techdocs images inside lightbox diff --git a/.changeset/short-planets-argue.md b/.changeset/short-planets-argue.md deleted file mode 100644 index c3134a59eb..0000000000 --- a/.changeset/short-planets-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -When running `version:bump` it will now log duplicates instead of throwing an error diff --git a/.changeset/shy-clouds-reflect.md b/.changeset/shy-clouds-reflect.md new file mode 100644 index 0000000000..2861bad9f3 --- /dev/null +++ b/.changeset/shy-clouds-reflect.md @@ -0,0 +1,5 @@ +--- +'@backstage/config-loader': patch +--- + +The `FileConfigSource` will now retry file reading after a short delay if it reads an empty file. This is to avoid flakiness during watch mode where change events can trigger before the file content has been written. diff --git a/.changeset/shy-seas-sip.md b/.changeset/shy-seas-sip.md new file mode 100644 index 0000000000..dfbc4ff0e0 --- /dev/null +++ b/.changeset/shy-seas-sip.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +Make sure the archived projects are skipped with the Gitlab API diff --git a/.changeset/silent-icons-deny.md b/.changeset/silent-icons-deny.md deleted file mode 100644 index 3dd7d75c90..0000000000 --- a/.changeset/silent-icons-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Extension points are now tracked via their ID rather than reference, in order to support package duplication. diff --git a/.changeset/silent-numbers-retire.md b/.changeset/silent-numbers-retire.md deleted file mode 100644 index ff5f11ecee..0000000000 --- a/.changeset/silent-numbers-retire.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-vault-backend': patch -'@backstage/plugin-vault': patch ---- - -Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` diff --git a/.changeset/silent-years-bake.md b/.changeset/silent-years-bake.md new file mode 100644 index 0000000000..4f50c37c31 --- /dev/null +++ b/.changeset/silent-years-bake.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-scaffolder-backend-module-rails': patch +'@techdocs/cli': patch +'@backstage/cli': patch +'@backstage/cli-common': patch +'@backstage/create-app': patch +'@backstage/codemods': patch +'@backstage/repo-tools': patch +--- + +Bumped dev dependencies `@types/node` and `mock-fs`. diff --git a/.changeset/silly-emus-remain.md b/.changeset/silly-emus-remain.md deleted file mode 100644 index 4fe605080a..0000000000 --- a/.changeset/silly-emus-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Add examples for `github:actions:dispatch` scaffolder actions. diff --git a/.changeset/silly-swans-invent.md b/.changeset/silly-swans-invent.md new file mode 100644 index 0000000000..68b094aba7 --- /dev/null +++ b/.changeset/silly-swans-invent.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +Added `createThemeExtension` and `coreExtensionData.theme`. diff --git a/.changeset/silver-bananas-kick.md b/.changeset/silver-bananas-kick.md deleted file mode 100644 index b678f403a4..0000000000 --- a/.changeset/silver-bananas-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-test-utils': patch ---- - -Serialize test database shutdown, and add logging diff --git a/.changeset/six-radios-smile.md b/.changeset/six-radios-smile.md deleted file mode 100644 index e4f4eed450..0000000000 --- a/.changeset/six-radios-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch ---- - -Correct the line hits calculation for Cobertura reports diff --git a/.changeset/six-wolves-admire.md b/.changeset/six-wolves-admire.md deleted file mode 100644 index efc80826c2..0000000000 --- a/.changeset/six-wolves-admire.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@backstage/integration': minor ---- - -Added `AzureDevOpsCredentialsProvider` to support multiple Azure DevOps organizations and **deprecated** `AzureIntegrationConfig.credential` and `AzureIntegrationConfig.token` in favour of `AzureIntegrationConfig.credentials`. You can now use specific credentials for different Azure DevOps (Server) organizations by specifying the `organizations` field on a credential: - -```yaml -integrations: - azure: - - host: dev.azure.com - credentials: - - organizations: - - my-org - - my-other-org - clientId: ${AZURE_CLIENT_ID} - clientSecret: ${AZURE_CLIENT_SECRET} - tenantId: ${AZURE_TENANT_ID} - - organizations: - - yet-another-org - personalAccessToken: ${PERSONAL_ACCESS_TOKEN} -``` - -See the [Azure integration documentation](https://backstage.io/docs/integrations/azure/locations) for more information. diff --git a/.changeset/slow-ducks-hunt.md b/.changeset/slow-ducks-hunt.md deleted file mode 100644 index 0aac3056cf..0000000000 --- a/.changeset/slow-ducks-hunt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added support for the `dev/index` entry point for backend plugins and modules. diff --git a/.changeset/slow-queens-visit.md b/.changeset/slow-queens-visit.md deleted file mode 100644 index 2df948e477..0000000000 --- a/.changeset/slow-queens-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-opencost': minor ---- - -New OpenCost plugin provides an port of the latest OpenCost UI to Backstage with updated dependencies. The plugin's README covers installation and configuration diff --git a/.changeset/slow-suits-rescue.md b/.changeset/slow-suits-rescue.md deleted file mode 100644 index 96a963f19f..0000000000 --- a/.changeset/slow-suits-rescue.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gcp': patch ---- - -Fix GKE endpoint parsing - -Endpoint is an IP, not url. It is always https on default (443) port -ref: https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1/projects.locations.clusters#Cluster diff --git a/.changeset/small-pugs-build.md b/.changeset/small-pugs-build.md new file mode 100644 index 0000000000..d1640340ba --- /dev/null +++ b/.changeset/small-pugs-build.md @@ -0,0 +1,7 @@ +--- +'@backstage/create-app': patch +--- + +Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build. + +You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bullseye-slim` diff --git a/.changeset/smart-islands-jog.md b/.changeset/smart-islands-jog.md deleted file mode 100644 index 50bc36191f..0000000000 --- a/.changeset/smart-islands-jog.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix OpenAPI schema for the facets endpoint diff --git a/.changeset/spicy-chairs-film.md b/.changeset/spicy-chairs-film.md new file mode 100644 index 0000000000..475d786330 --- /dev/null +++ b/.changeset/spicy-chairs-film.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-kubernetes-common': minor +'@backstage/plugin-kubernetes-react': minor +'@backstage/plugin-kubernetes': minor +--- + +Refactor Kubernetes plugins in line with ADR 11, no breaking changes yet diff --git a/.changeset/spotty-badgers-wash.md b/.changeset/spotty-badgers-wash.md new file mode 100644 index 0000000000..1ce9c66aee --- /dev/null +++ b/.changeset/spotty-badgers-wash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Instrumenting some missing metrics with `OpenTelemetry` diff --git a/.changeset/stale-points-breathe.md b/.changeset/stale-points-breathe.md deleted file mode 100644 index 36c01697d0..0000000000 --- a/.changeset/stale-points-breathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Fixed `RadarTimeline` text formatting. diff --git a/.changeset/strange-frogs-count.md b/.changeset/strange-frogs-count.md deleted file mode 100644 index 94fa6b9fb6..0000000000 --- a/.changeset/strange-frogs-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Add loading indicator to Table diff --git a/.changeset/strong-falcons-tickle.md b/.changeset/strong-falcons-tickle.md new file mode 100644 index 0000000000..d6fa0eb565 --- /dev/null +++ b/.changeset/strong-falcons-tickle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-adr': patch +--- + +Create an experimental `AdrSearchResultItemExtension` for declarative integration with Backstage; it can be accessed via the `/alpha` import. diff --git a/.changeset/stupid-ants-change.md b/.changeset/stupid-ants-change.md deleted file mode 100644 index c78c5e4250..0000000000 --- a/.changeset/stupid-ants-change.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-insights-backend-module-jsonfc': patch ---- - -Handle extracting facts from 'not' conditions too diff --git a/.changeset/stupid-drinks-trade.md b/.changeset/stupid-drinks-trade.md new file mode 100644 index 0000000000..a9eeacec8a --- /dev/null +++ b/.changeset/stupid-drinks-trade.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Add kind column by default to TechDocsTable diff --git a/.changeset/stupid-eagles-shave.md b/.changeset/stupid-eagles-shave.md new file mode 100644 index 0000000000..9bd88290ee --- /dev/null +++ b/.changeset/stupid-eagles-shave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-code-coverage': patch +--- + +Updated layout to improve contrasts and consistency with other plugins diff --git a/.changeset/sweet-hairs-complain.md b/.changeset/sweet-hairs-complain.md deleted file mode 100644 index 56dede5617..0000000000 --- a/.changeset/sweet-hairs-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-google-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a Google auth provider. diff --git a/.changeset/sweet-pens-hunt.md b/.changeset/sweet-pens-hunt.md deleted file mode 100644 index 03e79ecebb..0000000000 --- a/.changeset/sweet-pens-hunt.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@backstage/config-loader': minor ---- - -Deep visibility now also applies to values that are not covered by the configuration schema. - -For example, given the following configuration schema: - -```ts -// plugins/a/config.schema.ts -export interface Config { - /** @deepVisibility frontend */ - a?: unknown; -} - -// plugins/a/config.schema.ts -export interface Config { - a?: { - b?: string; - }; -} -``` - -All values under `a` are now visible to the frontend, while previously only `a` and `a/b` would've been visible. diff --git a/.changeset/swift-frogs-drop.md b/.changeset/swift-frogs-drop.md deleted file mode 100644 index 3edff21ca2..0000000000 --- a/.changeset/swift-frogs-drop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Limit the use of the same playlist name when adding a playlist diff --git a/.changeset/tall-countries-float.md b/.changeset/tall-countries-float.md deleted file mode 100644 index d6c6946b7a..0000000000 --- a/.changeset/tall-countries-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Add `"sideEffects": false` to `package.json` in frontend package templates. This can be added to existing packages using the new `yarn fix` command. diff --git a/.changeset/tall-items-clap.md b/.changeset/tall-items-clap.md deleted file mode 100644 index 613c280cbe..0000000000 --- a/.changeset/tall-items-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-backend-module-allow-all-policy': minor ---- - -Created package with policy `permissionModuleAllowAllPolicy` diff --git a/.changeset/tall-peas-visit.md b/.changeset/tall-peas-visit.md deleted file mode 100644 index 3e3ca76e46..0000000000 --- a/.changeset/tall-peas-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix issue with `catalogFileName` not being a required property for `/analyze-location` diff --git a/.changeset/tame-jokes-do.md b/.changeset/tame-jokes-do.md deleted file mode 100644 index 8e9b5a6056..0000000000 --- a/.changeset/tame-jokes-do.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': minor ---- - -Improved the `parseEntityRef` Scaffolder filter by introducing the ability for users to provide default kind and/or namespace values. The filter now takes -2 arguments, similarly to the original [parseEntityRef](https://github.com/backstage/backstage/blob/v1.17.2/packages/catalog-model/src/entity/ref.ts#L77). diff --git a/.changeset/tasty-avocados-hope.md b/.changeset/tasty-avocados-hope.md new file mode 100644 index 0000000000..0772b55683 --- /dev/null +++ b/.changeset/tasty-avocados-hope.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Migrate catalog api to declarative integration system, it is exported from `/alpha` subpath. diff --git a/.changeset/tasty-doors-switch.md b/.changeset/tasty-doors-switch.md new file mode 100644 index 0000000000..e35bf9cfa4 --- /dev/null +++ b/.changeset/tasty-doors-switch.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Explicitly set `exports: 'named'` for CJS builds, ensuring that they have e.g. `exports["default"] = catalogPlugin;` diff --git a/.changeset/ten-seals-wait.md b/.changeset/ten-seals-wait.md new file mode 100644 index 0000000000..780422449c --- /dev/null +++ b/.changeset/ten-seals-wait.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-cost-insights': patch +--- + +The experimental plugin configuration has been removed. The trend line can now instead be hidden by setting `costInsights.hideTrendLine` to `true` in the configuration. diff --git a/.changeset/ten-wasps-serve.md b/.changeset/ten-wasps-serve.md deleted file mode 100644 index ee93c82c3b..0000000000 --- a/.changeset/ten-wasps-serve.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/core-components': patch -'@backstage/plugin-search-react': patch -'@backstage/plugin-playlist': patch ---- - -Internal restructure to avoid circular imports diff --git a/.changeset/tender-garlics-report.md b/.changeset/tender-garlics-report.md deleted file mode 100644 index 919af4d4f8..0000000000 --- a/.changeset/tender-garlics-report.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Removed the experimental `package fix` command that was used to automatically add dependencies to `package.json`, but has since been replaced by the `no-undeclared-imports` rule from `@backstage/eslint-plugin`. diff --git a/.changeset/tender-seals-yawn.md b/.changeset/tender-seals-yawn.md deleted file mode 100644 index c709d9b6fb..0000000000 --- a/.changeset/tender-seals-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/test-utils': patch ---- - -Add a new `MockTranslationApi` as an `/alpha` export. diff --git a/.changeset/thick-pets-drive.md b/.changeset/thick-pets-drive.md deleted file mode 100644 index ee09f8af06..0000000000 --- a/.changeset/thick-pets-drive.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gitlab': minor ---- - -Fix Gitlab.com user ingestion by scoping GitlabOrgDiscoveryEntityProvider to a group. - -**BREAKING** The `group` parameter is now required Gitlab.com Org Data integrations and the backend will fail to start without this option configured. - -```diff -catalog: - providers: - gitlab: - yourProviderId: - host: gitlab.com - orgEnabled: true -+ group: org/teams -``` diff --git a/.changeset/thin-dryers-repeat.md b/.changeset/thin-dryers-repeat.md deleted file mode 100644 index bcf62f21de..0000000000 --- a/.changeset/thin-dryers-repeat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Add support for installing features as package imports, for example `backend.add(import('my-plugin'))`. diff --git a/.changeset/thin-ladybugs-lick.md b/.changeset/thin-ladybugs-lick.md deleted file mode 100644 index 41707e22d0..0000000000 --- a/.changeset/thin-ladybugs-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Minor internal refactor diff --git a/.changeset/thirty-coins-sneeze.md b/.changeset/thirty-coins-sneeze.md new file mode 100644 index 0000000000..58a93065b8 --- /dev/null +++ b/.changeset/thirty-coins-sneeze.md @@ -0,0 +1,5 @@ +--- +'@backstage/e2e-test-utils': minor +--- + +Initial release. diff --git a/.changeset/three-hounds-wonder.md b/.changeset/three-hounds-wonder.md deleted file mode 100644 index fd4cb486bc..0000000000 --- a/.changeset/three-hounds-wonder.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': minor ---- - -adding a .zip download to dry run results page, including zip.js as dependency diff --git a/.changeset/tiny-bulldogs-grow.md b/.changeset/tiny-bulldogs-grow.md deleted file mode 100644 index 3c999b8762..0000000000 --- a/.changeset/tiny-bulldogs-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': minor ---- - -set azure annotation `dev.azure.com/project-repo` in `AnnotateScmSlugEntityProcessor` to find the project and repo information for the repos that contains `dev.azure.com` in the url diff --git a/.changeset/tiny-garlics-cheer.md b/.changeset/tiny-garlics-cheer.md new file mode 100644 index 0000000000..992ed7f007 --- /dev/null +++ b/.changeset/tiny-garlics-cheer.md @@ -0,0 +1,5 @@ +--- +'@techdocs/cli': patch +--- + +Restructured tests. diff --git a/.changeset/tricky-melons-fold.md b/.changeset/tricky-melons-fold.md deleted file mode 100644 index 036413ea8e..0000000000 --- a/.changeset/tricky-melons-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Backend startup will now fail if any circular service dependencies are detected. diff --git a/.changeset/twelve-clouds-design.md b/.changeset/twelve-clouds-design.md new file mode 100644 index 0000000000..d71d6caec0 --- /dev/null +++ b/.changeset/twelve-clouds-design.md @@ -0,0 +1,9 @@ +--- +'@backstage/create-app': patch +--- + +The E2E test setup based on Cypress has been replaced with one based on [Playwright](https://playwright.dev/). Migrating existing apps is not required as this is a standalone setup, only do so if you also want to switch from Cypress to Playwright. + +The scripts to run the E2E tests have been removed from `packages/app/package.json`, as they are now instead run from the root. Instead, a new script has been added to the root `package.json`, `yarn test:e2e`, which runs the E2E tests in development mode, unless `CI` is set in the environment. + +The Playwright setup uses utilities from the new `@backstage/e2e-test-utils` package to find and include all packages in the monorepo that have an `e2e-tests` folder. diff --git a/.changeset/twelve-elephants-pay.md b/.changeset/twelve-elephants-pay.md deleted file mode 100644 index 08fb983b6f..0000000000 --- a/.changeset/twelve-elephants-pay.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': minor -'@backstage/plugin-techdocs-node': minor -'@techdocs/cli': minor ---- - -Add optional config and cli option for techdocs to specify default mkdocs plugins. diff --git a/.changeset/twenty-worms-enjoy.md b/.changeset/twenty-worms-enjoy.md deleted file mode 100644 index ef820a3c9e..0000000000 --- a/.changeset/twenty-worms-enjoy.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': minor ---- - -**DEPRECATION**: Deprecated `ScaffolderEntitiesProcessor`, which should now instead be imported from `@backstage/plugin-catalog-backend-module-scaffolder-entity-model`. - -`catalogModuleTemplateKind` was also moved to that package and renamed to `catalogModuleScaffolderEntityModel`, without any deprecation since it was an alpha export. diff --git a/.changeset/violet-beers-cross.md b/.changeset/violet-beers-cross.md new file mode 100644 index 0000000000..bdbb9da64e --- /dev/null +++ b/.changeset/violet-beers-cross.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Change overlay header colors in the mobile menu to use navigation color from the theme diff --git a/.changeset/warm-drinks-argue.md b/.changeset/warm-drinks-argue.md new file mode 100644 index 0000000000..5bd4fa63f1 --- /dev/null +++ b/.changeset/warm-drinks-argue.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-explore': patch +--- + +Create an experimental `ExploreSearchResultItemExtension` for declarative integration with Backstage; it can be accessed via the `/alpha` import. diff --git a/.changeset/warm-llamas-bake.md b/.changeset/warm-llamas-bake.md deleted file mode 100644 index 3da4a9b94d..0000000000 --- a/.changeset/warm-llamas-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/config-loader': patch ---- - -Do not unnecessarily notify subscribers when no-op updates to config happen diff --git a/.changeset/warm-panthers-lick.md b/.changeset/warm-panthers-lick.md deleted file mode 100644 index b06809fac1..0000000000 --- a/.changeset/warm-panthers-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-github-provider': minor ---- - -New module for `@backstage/plugin-auth-backend` that adds a GitHub auth provider. diff --git a/.changeset/weak-tomatoes-dance.md b/.changeset/weak-tomatoes-dance.md deleted file mode 100644 index 446051e16f..0000000000 --- a/.changeset/weak-tomatoes-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': patch ---- - -Properly support custom `userTransformer` returning `undefined` in `GithubMultiOrgEntityProvider` diff --git a/.changeset/wet-donuts-fry.md b/.changeset/wet-donuts-fry.md deleted file mode 100644 index 1f4c8dc4fc..0000000000 --- a/.changeset/wet-donuts-fry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-scaffolder-entity-model': minor ---- - -Added a dedicated module to collect the `ScaffolderEntitiesProcessor` and `catalogModuleTemplateKind`. diff --git a/.changeset/wet-olives-wave.md b/.changeset/wet-olives-wave.md new file mode 100644 index 0000000000..5b35e0ad90 --- /dev/null +++ b/.changeset/wet-olives-wave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +added aria-label on api definition button for better a11y. diff --git a/.changeset/wet-timers-chew.md b/.changeset/wet-timers-chew.md new file mode 100644 index 0000000000..3be6368331 --- /dev/null +++ b/.changeset/wet-timers-chew.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +The `useHotCleanup` and `useHotMemoize` helpers are now deprecated, since hot module reloads for backend are being phased out. diff --git a/.changeset/wicked-rings-flash.md b/.changeset/wicked-rings-flash.md new file mode 100644 index 0000000000..b872c0c71f --- /dev/null +++ b/.changeset/wicked-rings-flash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-react': patch +--- + +Create `createSearchResultListItem` alpha version that only supports declarative integration. diff --git a/.changeset/wild-jobs-greet.md b/.changeset/wild-jobs-greet.md new file mode 100644 index 0000000000..fdbe6d56ac --- /dev/null +++ b/.changeset/wild-jobs-greet.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Prevents root extension override and duplicated plugin extensions. diff --git a/.changeset/wise-boxes-kiss.md b/.changeset/wise-boxes-kiss.md deleted file mode 100644 index ea3abd594d..0000000000 --- a/.changeset/wise-boxes-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Include default alpha export during package detection diff --git a/.changeset/wise-tables-add.md b/.changeset/wise-tables-add.md deleted file mode 100644 index 987c74cf53..0000000000 --- a/.changeset/wise-tables-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-plugin-api': patch ---- - -Service factory functions are now marked as feature factories that can be installed in the backend. diff --git a/.changeset/witty-ants-cover.md b/.changeset/witty-ants-cover.md deleted file mode 100644 index 7f499a88ae..0000000000 --- a/.changeset/witty-ants-cover.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-home': patch ---- - -Allow specifying static widgets to custom home page diff --git a/.changeset/witty-pans-flash.md b/.changeset/witty-pans-flash.md deleted file mode 100644 index 107ef90973..0000000000 --- a/.changeset/witty-pans-flash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Fix the Ui style of the search bar diff --git a/.changeset/yellow-rings-invent.md b/.changeset/yellow-rings-invent.md new file mode 100644 index 0000000000..f0335ff492 --- /dev/null +++ b/.changeset/yellow-rings-invent.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +MissingAnnotationEmptyState component can now dynamically generate a YAML example based off the current entity being used. diff --git a/.changeset/yellow-trains-protect.md b/.changeset/yellow-trains-protect.md deleted file mode 100644 index 4b8c50ac3e..0000000000 --- a/.changeset/yellow-trains-protect.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@backstage/plugin-code-coverage-backend': patch -'@backstage/plugin-tech-insights-backend': patch -'@backstage/plugin-linguist-backend': patch -'@backstage/backend-common': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/backend-tasks': patch -'@backstage/plugin-app-backend': patch -'@backstage/plugin-bazaar-backend': patch -'@backstage/plugin-scaffolder-backend': patch ---- - -Changes needed to support MySQL diff --git a/.changeset/yellow-yaks-behave.md b/.changeset/yellow-yaks-behave.md deleted file mode 100644 index 546d74c3e4..0000000000 --- a/.changeset/yellow-yaks-behave.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/core-plugin-api': minor -'@backstage/core-app-api': minor -'@backstage/plugin-user-settings': patch ---- - -Introduced experimental support for internationalization. diff --git a/.changeset/young-ants-nail.md b/.changeset/young-ants-nail.md deleted file mode 100644 index 6648098687..0000000000 --- a/.changeset/young-ants-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': patch ---- - -Allow github user and team transforms to return any Entity diff --git a/.changeset/young-panthers-mix.md b/.changeset/young-panthers-mix.md deleted file mode 100644 index cbaf3b3704..0000000000 --- a/.changeset/young-panthers-mix.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@backstage/plugin-tech-insights-backend': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/backend-tasks': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/plugin-ilert': patch ---- - -Update to handle invalid luxon values diff --git a/.dockerignore b/.dockerignore index e43b5fab1e..78aa97942d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,7 +2,6 @@ .yarn/cache .yarn/install-state.gz docs -cypress microsite node_modules packages/*/src diff --git a/.eslintignore b/.eslintignore index 46bb1ad2b2..5ccd2d1ba0 100644 --- a/.eslintignore +++ b/.eslintignore @@ -9,3 +9,4 @@ **/microsite/** **/templates/** **/sample-templates/** +playwright.config.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 922f7588a5..cb8101e1b1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,10 +5,9 @@ # https://help.github.com/articles/about-codeowners/ * @backstage/maintainers @backstage/reviewers -yarn.lock @backstage/maintainers @backstage/reviewers @backstage-service -*/yarn.lock @backstage/maintainers @backstage/reviewers @backstage-service +yarn.lock @backstage/maintainers @backstage-service +*/yarn.lock @backstage/maintainers @backstage-service /.changeset/*.md -/cypress/src/integration/plugins/techdocs.spec.ts @backstage/techdocs-maintainers /docs/assets/search @backstage/discoverability-maintainers /docs/features/search @backstage/discoverability-maintainers /docs/features/techdocs @backstage/techdocs-maintainers @@ -22,6 +21,7 @@ yarn.lock @backstage/maintainers @backst /plugins/azure-devops @backstage/maintainers @backstage/reviewers @awanlin /plugins/azure-devops-backend @backstage/maintainers @backstage/reviewers @awanlin /plugins/azure-devops-common @backstage/maintainers @backstage/reviewers @awanlin +/plugins/analytics-module-newrelic-browser @backstage/maintainers @backstage/reviewers @jmezach /plugins/bitbucket-cloud-common @backstage/maintainers @backstage/reviewers @pjungermann /plugins/bitrise @backstage/maintainers @backstage/reviewers @backstage/sda-se-reviewers /plugins/catalog @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers @@ -63,6 +63,7 @@ yarn.lock @backstage/maintainers @backst /plugins/linguist @backstage/maintainers @backstage/reviewers @awanlin /plugins/linguist-backend @backstage/maintainers @backstage/reviewers @awanlin /plugins/linguist-common @backstage/maintainers @backstage/reviewers @awanlin +/plugins/octopus-deploy @backstage/maintainers @backstage/reviewers @jmezach /plugins/permission-* @backstage/permission-maintainers /plugins/playlist @backstage/maintainers @backstage/reviewers @kuangp /plugins/playlist-* @backstage/maintainers @backstage/reviewers @kuangp diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index 0229ed8e12..aadbaa3985 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -180,6 +180,7 @@ jsx JWTs Kaewkasi Kaswell +keepalive Keyv Knex Koyeb @@ -267,12 +268,14 @@ parseable Patrik pattison Peloton +PEP performant Performant periskop Periskop permissioned permissioning +pipx plantuml Platformize Podman @@ -398,6 +401,7 @@ tooltip tooltips touchpoint transpilation +transpile transpiled transpiler transpilers diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index d636a06eb8..16bf11dd1a 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: Verify ${{ matrix.node-version }} steps: @@ -26,7 +26,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: Test ${{ matrix.node-version }} steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4afe9c88ce..12c19075a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true @@ -49,7 +49,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true @@ -139,7 +139,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: Test ${{ matrix.node-version }} services: diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index ce9a2648ee..2329101eb0 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] services: postgres13: @@ -130,7 +130,7 @@ jobs: strategy: matrix: - node-version: [16.x] + node-version: [18.x] env: CI: 'true' diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 62c693de6f..6fe4ab0f9e 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -61,6 +61,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@00e563ead9f72a8461b24876bee2d0c2e8bd2ee8 # v2.21.5 + uses: github/codeql-action/upload-sarif@ddccb873888234080b77e9bc2d4764d5ccaaccf9 # v2.21.9 with: sarif_file: results.sarif diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index 8cf6991aaf..df8d3909f4 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -10,7 +10,7 @@ jobs: # Setup node & install deps before checkout, keeping install quick - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18.x - name: Install dependencies # Just the deps for the assemble manifest script run: npm install semver@7.3.5 fs-extra@10.0.0 @manypkg/get-packages@1.1.1 diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 6d662ea05f..127c11791d 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -15,7 +15,8 @@ jobs: steps: - uses: actions/checkout@v3 with: - fetch-depth: 0 + fetch-depth: 20000 + fetch-tags: true token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - name: Install Dependencies run: yarn --immutable diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index a018537daf..1bcd5ebcd8 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -25,13 +25,13 @@ jobs: - name: setup-node uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x registry-url: https://registry.npmjs.org/ - name: yarn install uses: backstage/actions/yarn-install@v0.6.4 with: - cache-prefix: linux-v16 + cache-prefix: linux-v18 - name: Use Uffizzi's backstage app config run: | diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index 11c0ca41b6..32ded3bd3a 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -20,14 +20,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Use Node.js 16.x + - name: Use Node.js 18.x uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x - name: yarn install uses: backstage/actions/yarn-install@v0.6.4 with: - cache-prefix: ${{ runner.os }}-v16.x + cache-prefix: ${{ runner.os }}-v18.x - name: run Lighthouse CI run: | yarn dlx @lhci/cli@0.11.x autorun diff --git a/.github/workflows/verify_e2e-kubernetes-noop.yml b/.github/workflows/verify_e2e-kubernetes-noop.yml index ac49fbc469..bedf357079 100644 --- a/.github/workflows/verify_e2e-kubernetes-noop.yml +++ b/.github/workflows/verify_e2e-kubernetes-noop.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: Kubernetes ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-kubernetes.yml b/.github/workflows/verify_e2e-kubernetes.yml index 4c25c259c5..0c78c1f933 100644 --- a/.github/workflows/verify_e2e-kubernetes.yml +++ b/.github/workflows/verify_e2e-kubernetes.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index 57dc75c272..1384b83378 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: E2E Linux ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 33cc4f83ec..61ce55e385 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -31,7 +31,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index bf46d2c954..fd5c4f0956 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index a10722e865..f042c350c2 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -17,7 +17,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] name: E2E Windows ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index 5a2f0a5fc1..b1decefd10 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true @@ -48,6 +48,7 @@ jobs: uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} + registry-url: https://registry.npmjs.org/ # Needed for auth - name: setup python uses: actions/setup-python@v4 @@ -72,7 +73,9 @@ jobs: uses: browser-actions/setup-chrome@latest - name: yarn install - run: yarn install --immutable + uses: backstage/actions/yarn-install@v0.6.4 + with: + cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} - run: yarn tsc - run: yarn backstage-cli repo build diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index b1d370ec3f..bcb0cfe178 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -23,7 +23,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - node-version: [16.x] + node-version: [18.x] name: Storybook steps: diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index 916dd53366..e5d3adf013 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x] env: CI: true diff --git a/.gitignore b/.gitignore index c0bf195947..7149dbabc1 100644 --- a/.gitignore +++ b/.gitignore @@ -144,15 +144,15 @@ site # Sensitive credentials *-credentials.yaml -# e2e tests -cypress/cypress/* - # Possible leftover from build:api-reports tsconfig.tmp.json # vscode database functionality support files *.session.sql +# E2E test reports +e2e-test-report/ + # Lighthouse CI Reports **/.lighthouseci/* !**/.lighthouseci/scripts diff --git a/.yarn/patches/jest-haste-map-npm-29.4.3-19b03fcef3.patch b/.yarn/patches/jest-haste-map-npm-29.4.3-19b03fcef3.patch new file mode 100644 index 0000000000..e0dd8bfa8c --- /dev/null +++ b/.yarn/patches/jest-haste-map-npm-29.4.3-19b03fcef3.patch @@ -0,0 +1,13 @@ +diff --git a/build/watchers/FSEventsWatcher.js b/build/watchers/FSEventsWatcher.js +index 2273a6cbd2110ddbbd1525820289c3d93ab46cac..d637a644239ae4a7db407ce779f43b4dec9a44ed 100644 +--- a/build/watchers/FSEventsWatcher.js ++++ b/build/watchers/FSEventsWatcher.js +@@ -103,7 +103,7 @@ function _interopRequireWildcard(obj, nodeInterop) { + // @ts-ignore: this is for CI which runs linux and might not have this + let fsevents = null; + try { +- fsevents = require('fsevents'); ++ // fsevents = require('fsevents'); + } catch { + // Optional dependency, only supported on Darwin. + } diff --git a/.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch b/.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch new file mode 100644 index 0000000000..ed5555203b --- /dev/null +++ b/.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch @@ -0,0 +1,13 @@ +diff --git a/lib/binding.js b/lib/binding.js +index a4a3e6cdc197bd0f12fe2d060640e91ac58ab457..ab04ce3115fe93073a3e25008730272b6fa21bd7 100644 +--- a/lib/binding.js ++++ b/lib/binding.js +@@ -165,6 +165,8 @@ function Binding(system) { + this.trackDescriptor(stderr); + } + ++Binding.prototype.readFileSync = path => require('fs').readFileSync(path).toString('utf8'); ++ + /** + * Get the file system underlying this binding. + * @return {FileSystem} The underlying file system. diff --git a/ADOPTERS.md b/ADOPTERS.md index 0481653a87..444e7a9339 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -5,7 +5,7 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | Organization | Contact | Description of Use | |-----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Spotify](https://www.spotify.com) | [@leemills83](https://github.com/leemills83) | Main interface towards all of Spotify's infrastructure and technical documentation. | +| [Spotify](https://www.spotify.com) | [@helengreul](https://github.com/helengreul) | Main interface towards all of Spotify's infrastructure and technical documentation. | | [bol.com](https://www.bol.com) | [@acierto](https://github.com/acierto), [@clanghout](https://github.com/clanghout) | Initial work being done to unify platform tooling. | | [DFDS](https://www.dfds.com) | [@carlsendk](https://github.com/carlsendk) | V2 self-service platform. | | [Roadie](https://roadie.io) | [@dtuite](https://github.com/dtuite) | Hosted, managed Backstage with easy set-up | @@ -261,3 +261,4 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [V2 Digital](https://v2.digital) | [Joe Patterson](https://github.com/jrwpatterson)| We will be using it to be a corporate dashboard plus our software catalog. | | [AppsFlyer](https://www.appsflyer.com/) | [Shahar Shmaram](https://github.com/shmaram) | Internal Developer Portal, a catalog of all company resources, custom providers and processors, scaffolder for generating new resources. | [Gynzy](https://gynzy.com) | [Stef Louwers](https://github.com/fhp) | We are building an internal developer portal to get an overview of all our software components. | +| [Cielo](https://www.cielo.com.br) | [@Alex Silva](https://github.com/narokwq) | We are using as our Internal Developer Portal, it provides developers with the resources, information, and tools they need to build high-quality applications and adhere to organizational standards and security practices. | diff --git a/app-config.yaml b/app-config.yaml index 9e153e5763..a2ee232516 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -291,9 +291,6 @@ catalog: target: ../../plugins/scaffolder-backend/sample-templates/all-templates.yaml rules: - allow: [Template] - # Backstage end-to-end tests of TechDocs - - type: file - target: ../../cypress/e2e-fixture.catalog.info.yaml scaffolder: # Use to customize default commit author info used when new components are created # defaultAuthor: diff --git a/cypress/.eslintrc.js b/cypress/.eslintrc.js deleted file mode 100644 index 07f264452d..0000000000 --- a/cypress/.eslintrc.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - extends: [require.resolve('@backstage/cli/config/eslint.backend')], - rules: { - 'no-console': 0, - 'jest/valid-expect': 'off', - 'jest/expect-expect': 'off', - 'no-restricted-syntax': 'off', - }, -}; diff --git a/cypress/.npmrc b/cypress/.npmrc deleted file mode 100644 index c3c66347fd..0000000000 --- a/cypress/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -registry=https://registry.npmjs.org/ -engine-strict=true diff --git a/cypress/.yarnrc b/cypress/.yarnrc deleted file mode 100644 index a2c82b2833..0000000000 --- a/cypress/.yarnrc +++ /dev/null @@ -1,5 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - -registry "https://registry.npmjs.org/" -network-timeout 300000 diff --git a/cypress/README.md b/cypress/README.md deleted file mode 100644 index be2960e63c..0000000000 --- a/cypress/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Cypress Tests for Backstage - -Hey 👋 Welcome to the Cypress tests for Backstage. They're designed to be run against the `packages/app` folder in the main repo, and be some form of smoke tests to make sure that we don't break any core functionality. - -### Running Locally - -In order to make typescript happy, this `cypress` package is separate from all the Jest dependencies in the monorepo workspaces setup. - -You can run the e2e tests locally pointing at your local running version like so: - -```sh -cd cypress -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:backend -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. - -```sh -CYPRESS_baseUrl="http://demo.backstage.io" yarn cypress run -``` diff --git a/cypress/cypress.json b/cypress/cypress.json deleted file mode 100644 index 7335d0f62a..0000000000 --- a/cypress/cypress.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "baseUrl": "http://localhost:7007", - "integrationFolder": "./src/integration", - "supportFile": "./src/support", - "fixturesFolder": "./src/fixtures", - "pluginsFile": "./src/plugins", - "defaultCommandTimeout": 10000, - "viewportHeight": 900, - "viewportWidth": 1440 -} diff --git a/cypress/e2e-fixture.catalog.info.yaml b/cypress/e2e-fixture.catalog.info.yaml deleted file mode 100644 index 31502e415d..0000000000 --- a/cypress/e2e-fixture.catalog.info.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: techdocs-e2e-fixture - description: Used for end-to-end tests of TechDocs in Backstage. - annotations: - backstage.io/techdocs-ref: dir:./fixtures -spec: - type: service - lifecycle: experimental - owner: user:guest diff --git a/cypress/fixtures/docs/index.md b/cypress/fixtures/docs/index.md deleted file mode 100644 index d7ff14b46d..0000000000 --- a/cypress/fixtures/docs/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Home page - -This is a basic documentation used for end-to-end tests. diff --git a/cypress/fixtures/docs/sub-page-one.md b/cypress/fixtures/docs/sub-page-one.md deleted file mode 100644 index 7c451efeb5..0000000000 --- a/cypress/fixtures/docs/sub-page-one.md +++ /dev/null @@ -1,109 +0,0 @@ -# Sub-page 1 - -## Section 1.1 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -## Section 1.2 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -## Section 1.3 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! diff --git a/cypress/fixtures/docs/sub-page-three.md b/cypress/fixtures/docs/sub-page-three.md deleted file mode 100644 index e9a439ed98..0000000000 --- a/cypress/fixtures/docs/sub-page-three.md +++ /dev/null @@ -1,121 +0,0 @@ -# Sub-page 3 - -## Section 3.1 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -## Section 3.2 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -### Sub-Section 3.2.1 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -### Sub-Section 3.2.2 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -## Section 3.3 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! diff --git a/cypress/fixtures/docs/sub-page-two.md b/cypress/fixtures/docs/sub-page-two.md deleted file mode 100644 index eb2344e9c3..0000000000 --- a/cypress/fixtures/docs/sub-page-two.md +++ /dev/null @@ -1,146 +0,0 @@ -# Sub-page 2 - -## Section 2.1 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -## Section 2.2 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -### Sub-Section 2.2.1 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -### Sub-Section 2.2.2 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -## Section 2.3 - -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! -To next page! - -[Link to Section 1.1](sub-page-one.md#section-11) diff --git a/cypress/fixtures/mkdocs.yml b/cypress/fixtures/mkdocs.yml deleted file mode 100644 index 071d147509..0000000000 --- a/cypress/fixtures/mkdocs.yml +++ /dev/null @@ -1,13 +0,0 @@ -site_name: e2e Fixture Documentation -site_description: Documentation used for end-to-end tests of TechDocs in Backstage. -repo_url: https://github.com/backstage/backstage -edit_uri: edit/master/cypress/fixtures/docs - -nav: - - Home: index.md - - Sub-page 1: sub-page-one.md - - Sub-page 2: sub-page-two.md - - Nested Sub-pages: - - Sub-page 3: sub-page-three.md -plugins: - - techdocs-core diff --git a/cypress/package.json b/cypress/package.json deleted file mode 100644 index cc66949d28..0000000000 --- a/cypress/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "@backstage/cypress-tests", - "version": "1.0.0", - "main": "index.js", - "license": "MIT", - "private": true, - "dependencies": { - "cypress": "^10.0.0", - "typescript": "^4.1.3" - } -} diff --git a/cypress/src/fixtures/.gitkeep b/cypress/src/fixtures/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cypress/src/integration/integrations.spec.ts b/cypress/src/integration/integrations.spec.ts deleted file mode 100644 index 4703c18881..0000000000 --- a/cypress/src/integration/integrations.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/// -import 'os'; - -describe('Integrations', () => { - describe('ReadTree', () => { - it('should work for github', () => { - cy.loginAsGuest(); - - cy.request('POST', '/api/catalog/locations', { - target: - 'https://github.com/backstage-verification/test-repo/blob/main/**/*', - type: 'url', - }); - - cy.wait(5000); - - cy.visit('/catalog'); - cy.get('[data-testid="user-picker-all"]').click(); - cy.get('table').should('contain', 'github-repo'); - cy.get('table').should('contain', 'github-repo-nested'); - }); - - // it('should work for azure', () => { - // cy.loginAsGuest(); - - // cy.request('POST', '/api/catalog/locations', { - // target: - // 'https://dev.azure.com/backstage-verification/_git/test-repo?path=*', - // type: 'url', - // }); - // }); - - it('should work for gitlab', () => { - cy.loginAsGuest(); - - cy.request('POST', '/api/catalog/locations', { - target: - 'https://gitlab.com/backstage-verification/test-repo/-/tree/master/**/*', - type: 'url', - }); - - cy.wait(5000); - - cy.visit('/catalog'); - cy.get('[data-testid="user-picker-all"]').click(); - cy.get('table').should('contain', 'gitlab-repo'); - cy.get('table').should('contain', 'gitlab-repo-nested'); - }); - - it('should work for bitbucket', () => { - cy.loginAsGuest(); - - cy.request('POST', '/api/catalog/locations', { - target: - 'https://bitbucket.org/backstage-verification/test-repo/src/master/**/*', - type: 'url', - }); - - cy.wait(5000); - - cy.visit('/catalog'); - cy.get('[data-testid="user-picker-all"]').click(); - cy.get('table').should('contain', 'bitbucket-repo'); - cy.get('table').should('contain', 'bitbucket-repo-nested'); - }); - }); -}); diff --git a/cypress/src/integration/plugins/catalog.spec.ts b/cypress/src/integration/plugins/catalog.spec.ts deleted file mode 100644 index 50ef3145e5..0000000000 --- a/cypress/src/integration/plugins/catalog.spec.ts +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/// -import 'os'; - -describe('Catalog', () => { - describe('default entities', () => { - it('displays the correct amount of entities from default config', () => { - cy.loginAsGuest(); - - cy.visit('/catalog'); - - cy.contains('Owned (10)').should('be.visible'); - }); - - it('Should navigate to a docs tab', () => { - cy.loginAsGuest(); - - cy.visit('/catalog'); - - cy.contains('techdocs-e2e-fixture').click(); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/catalog/default/component/techdocs-e2e-fixture', - ); - }); - - cy.getCatalogDocsTab().click(); - - cy.getTechDocsShadowRoot() - .find('h1') - .contains('Home page') - .should('be.visible'); - }); - - it('Should navigate to a sub-route in docs tab', () => { - cy.loginAsGuest(); - - cy.visit('/catalog'); - - cy.contains('techdocs-e2e-fixture').click(); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/catalog/default/component/techdocs-e2e-fixture', - ); - }); - - cy.getCatalogDocsTab().click(); - - cy.getTechDocsShadowRoot() - .find('h1') - .contains('Home page') - .should('be.visible'); - - cy.getTechDocsShadowRoot().within(() => { - cy.getTechDocsNavigation().find('a').contains('Sub-page 1').click(); - }); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/catalog/default/component/techdocs-e2e-fixture/docs/sub-page-one/', - ); - }); - - cy.getTechDocsShadowRoot() - .find('h1') - .contains('Sub-page 1') - .should('be.visible'); - }); - - it('Should render addons on docs tab homepage', () => { - cy.loginAsGuest(); - - cy.visit('/catalog'); - - cy.contains('techdocs-e2e-fixture').click(); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/catalog/default/component/techdocs-e2e-fixture', - ); - }); - - cy.getCatalogDocsTab().click(); - - cy.wait(300); - - cy.getTechDocsShadowRoot() - .find('h1') - .contains('Home page') - .should('be.visible'); - - // highlight a snippet of text - cy.getTechDocsShadowRoot() - .find('article > p') - .then($el => { - const el = $el[0]; - const document = el.ownerDocument; - const range = document.createRange(); - range.selectNodeContents(el); - document?.getSelection()?.removeAllRanges(); - document?.getSelection()?.addRange(range); - }); - - cy.document().trigger('selectionchange'); - - // wait for new issue default debounce time - cy.wait(600); - - // assert that the new issue button has a right url - cy.getTechDocsShadowRoot() - .contains('Open new Github issue') - .should( - 'have.attr', - 'href', - 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.&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%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.%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%3A7007%2Fcatalog%2Fdefault%2Fcomponent%2Ftechdocs-e2e-fixture%2Fdocs%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Findex.md%3E', - ); - }); - - it('Should render addons on docs tab sup-page', () => { - cy.loginAsGuest(); - - cy.visit('/catalog'); - - cy.contains('techdocs-e2e-fixture').click(); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/catalog/default/component/techdocs-e2e-fixture', - ); - }); - - cy.getCatalogDocsTab().click(); - - cy.wait(300); - - cy.getTechDocsShadowRoot() - .find('h1') - .contains('Home page') - .should('be.visible'); - - cy.getTechDocsShadowRoot().within(() => { - cy.getTechDocsNavigation().find('a').contains('Sub-page 1').click(); - }); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/catalog/default/component/techdocs-e2e-fixture/docs/sub-page-one/', - ); - }); - - cy.getTechDocsShadowRoot() - .find('h1') - .contains('Sub-page 1') - .should('be.visible'); - - // highlight a snippet of text - cy.getTechDocsShadowRoot() - .find('#section-11') - .then($el => { - const el = $el[0]; - const document = el.ownerDocument; - const range = document.createRange(); - range.selectNodeContents(el); - document?.getSelection()?.removeAllRanges(); - document?.getSelection()?.addRange(range); - }); - - cy.document().trigger('selectionchange'); - - // wait for new issue default debounce time - cy.wait(600); - - // assert that the new issue button has a right url - cy.getTechDocsShadowRoot() - .contains('Open new Github issue') - .should( - 'have.attr', - 'href', - 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20Section%201.1%C2%B6&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%20Section%201.1%C2%B6%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%3A7007%2Fcatalog%2Fdefault%2Fcomponent%2Ftechdocs-e2e-fixture%2Fdocs%2Fsub-page-one%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Fsub-page-one.md%3E', - ); - }); - }); -}); diff --git a/cypress/src/integration/plugins/score-card.spec.ts b/cypress/src/integration/plugins/score-card.spec.ts deleted file mode 100644 index 5871a094e1..0000000000 --- a/cypress/src/integration/plugins/score-card.spec.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/// -import 'os'; - -describe('score-card', () => { - describe('Score board', () => { - it('displays the score board based on sample data', () => { - cy.loginAsGuest(); - - cy.visit('/score-board'); - cy.screenshot({ capture: 'viewport' }); - - cy.contains('System scores overview').should('be.visible'); - cy.checkForErrors(); - cy.get('span:contains("1-2 of 2")').should('be.visible'); // beware, there is also a hidden

element - cy.contains('audio-playback').should('be.visible'); - cy.contains('team-c').should('be.visible'); - cy.contains('non-valid-system').should('be.visible'); - cy.contains('Name').should('be.visible'); - cy.contains('Date').should('be.visible'); - cy.contains('Code').should('be.visible'); - cy.contains('Documentation').should('be.visible'); - cy.contains('Operations').should('be.visible'); - cy.contains('Quality').should('be.visible'); - cy.contains('Security').should('be.visible'); - cy.contains('Total').should('be.visible'); - cy.contains('50 %').should('be.visible'); - cy.contains('75 %').should('be.visible'); - cy.log('navigating to score card detail for audio-playback'); - cy.get('a[data-id="audio-playback"]').should('be.visible').click(); - cy.screenshot({ capture: 'viewport' }); - - cy.url().should( - 'include', - '/catalog/default/System/audio-playback/score', - ); - cy.contains('Scoring').should('be.visible'); - cy.contains('Total score: 57 %').should('be.visible'); - cy.contains('Code').should('be.visible'); - cy.contains('90 %').should('be.visible'); - cy.contains('Documentation').should('be.visible'); - cy.contains('75 %').should('be.visible'); - cy.contains('Operations').should('be.visible'); - cy.contains('50 %').should('be.visible'); - cy.contains('Quality').should('be.visible'); - cy.contains('25 %').should('be.visible'); - cy.contains('Security'); - cy.contains('10 %').should('be.visible'); - cy.checkForErrors(); - - cy.log( - 'Clicking on button [>] that is first child of the element (td) with value=Code', - ); - cy.get('[value="Code"] > button:first-child').click(); - cy.checkForErrors(); - cy.screenshot({ capture: 'viewport' }); - - cy.log('Clicking on link for Code'); - cy.contains('hints: Gitflow: 100%').should('be.visible'); - cy.get('a[data-id="2157"]') - .should('be.visible') - .should( - 'have.attr', - 'href', - 'https://TBD/XXX/_wiki/wikis/XXX.wiki/2157', - ); - }); - }); -}); diff --git a/cypress/src/integration/plugins/techdocs.spec.ts b/cypress/src/integration/plugins/techdocs.spec.ts deleted file mode 100644 index 31094cb128..0000000000 --- a/cypress/src/integration/plugins/techdocs.spec.ts +++ /dev/null @@ -1,259 +0,0 @@ -/* - * 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 'os'; - -describe('TechDocs', () => { - beforeEach(() => { - cy.loginAsGuest(); - cy.mockSockJSNode(); - cy.interceptTechDocsAPICalls(); - }); - - describe('Navigating to TechDocs', () => { - it('should navigate to the TechDocs home page via the primary navigation bar', () => { - cy.visit('/'); - cy.wait(500); - - cy.get('[data-testid="sidebar-root"]') - .get('div') - .get('a[href="/docs"]') - .click(); - - cy.contains('Documentation'); - }); - - it('should navigate to the TechDocs home page from the URL', () => { - cy.visit('/docs'); - - cy.wait(500); - - cy.contains('Documentation'); - }); - - it('should navigate to a specific TechDocs entity from the "Overview" tab', () => { - cy.visit('/docs'); - - cy.contains('techdocs-e2e-fixture').click(); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/docs/default/component/techdocs-e2e-fixture', - ); - }); - }); - - it('should navigate to a specific TechDocs entity page from a URL', () => { - cy.visit('/docs/default/Component/techdocs-e2e-fixture'); - cy.waitHomePage(); - - cy.contains('e2e Fixture Documentation'); - cy.contains( - 'Documentation used for end-to-end tests of TechDocs in Backstage.', - ); - cy.getTechDocsShadowRoot().contains('Home page'); - }); - - it('should navigate to a specific TechDocs section from a URL', () => { - cy.visit('/docs/default/Component/techdocs-e2e-fixture/sub-page-two'); - cy.waitSectionTwoPage(); - - cy.window().its('scrollY').should('equal', 0); - - cy.getTechDocsShadowRoot().within(() => { - cy.contains('Sub-page 2'); - }); - }); - - it('should navigate to a specific TechDocs fragment from a URL', () => { - cy.visit( - '/docs/default/Component/techdocs-e2e-fixture/sub-page-two#section-23', - ); - - // This is used to test the post-render behavior of the techdocs Reader - cy.wait(500); - - cy.getTechDocsShadowRoot().within(() => { - cy.isInViewport('#section-23'); - }); - }); - - it('should navigate to a wrong TechDocs entity page from a URL', () => { - cy.visit('/docs/default/Component/wrong-component'); - - cy.get('[data-testid=error]').should('be.visible'); - }); - }); - - describe('Rendering TechDocs Addons', () => { - it('should render a content addon in homepage', () => { - cy.visit('/docs/default/Component/techdocs-e2e-fixture'); - - cy.contains('e2e Fixture Documentation'); - - // highlight a snippet of text - cy.getTechDocsShadowRoot() - .find('article > p') - .then($el => { - const el = $el[0]; - const document = el.ownerDocument; - const range = document.createRange(); - range.selectNodeContents(el); - document?.getSelection()?.removeAllRanges(); - document?.getSelection()?.addRange(range); - }); - - cy.document().trigger('selectionchange'); - - // wait for new issue default debounce time - cy.wait(600); - - // assert that the new issue button has a right url - cy.getTechDocsShadowRoot() - .contains('Open new Github issue') - .should( - 'have.attr', - 'href', - 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.&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%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.%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%3A7007%2Fdocs%2Fdefault%2FComponent%2Ftechdocs-e2e-fixture%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Findex.md%3E', - ); - }); - - it('should render a content addon in sub-pages', () => { - cy.visit('/docs/default/Component/techdocs-e2e-fixture'); - - cy.contains('e2e Fixture Documentation'); - - // open sub-page - cy.getTechDocsShadowRoot().within(() => { - cy.getTechDocsNavigation().find('a').contains('Sub-page 1').click(); - }); - - // highlight a snippet of text - cy.getTechDocsShadowRoot() - .find('#section-11') - .then($el => { - const el = $el[0]; - const document = el.ownerDocument; - const range = document.createRange(); - range.selectNodeContents(el); - document?.getSelection()?.removeAllRanges(); - document?.getSelection()?.addRange(range); - }); - - cy.document().trigger('selectionchange'); - - // wait for new issue default debounce time - cy.wait(600); - - // assert that the new issue button has a right url - cy.getTechDocsShadowRoot() - .contains('Open new Github issue') - .should( - 'have.attr', - 'href', - 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20Section%201.1%C2%B6&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%20Section%201.1%C2%B6%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%3A7007%2Fdocs%2Fdefault%2FComponent%2Ftechdocs-e2e-fixture%2Fsub-page-one%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Fsub-page-one.md%3E', - ); - }); - }); - - describe('Navigating within TechDocs', () => { - it('should navigate to a specific TechDocs page via the navigation bar', () => { - cy.visit('/docs/default/Component/techdocs-e2e-fixture'); - - cy.getTechDocsShadowRoot().within(() => { - cy.getTechDocsNavigation() - .find('> div > div > [data-md-level="0"] > ul > li:nth-child(2) > a') - .click(); - cy.contains('Sub-page 1'); - cy.window().its('scrollY').should('eq', 0); - }); - }); - - describe('Navigating within a TechDocs page', () => { - beforeEach(() => { - cy.visit('/docs/default/Component/techdocs-e2e-fixture/sub-page-two'); - }); - - it('should navigate to a specific fragment within the page via the table of contents - Level 1', () => { - return cy.getTechDocsShadowRoot().within(() => { - // Section 3 - cy.getTechDocsTableOfContents() - .find('a') - .contains('Section 2.3') - .click(); - - // wait scroll timeout - cy.wait(500); - - cy.isInViewport('#section-23'); - }); - }); - - it('should navigate to a specific fragment within the page via the table of contents - Level 2', () => { - return cy.getTechDocsShadowRoot().within(() => { - cy.isNotInViewport('#sub-section-222'); - // Section 2.2 - cy.getTechDocsTableOfContents() - .find('a') - .contains('Section 2.2.2') - .click(); - - // wait scroll timeout - cy.wait(500); - - cy.isInViewport('#sub-section-222'); - }); - }); - - it('should navigate to a specific TechDocs page fragment from a link', () => { - return cy.getTechDocsShadowRoot().within(() => { - cy.get('article').contains('Link to Section 1.1').click(); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/docs/default/Component/techdocs-e2e-fixture/sub-page-one/', - ); - expect(loc.hash).to.eq('#section-11'); - }); - }); - }); - - it('should navigate to the next page within a TechDocs entity', () => { - return cy.getTechDocsShadowRoot().within(() => { - cy.get('footer a').contains('Sub-page 3').click(); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/docs/default/Component/techdocs-e2e-fixture/sub-page-three/', - ); - }); - }); - }); - - it('should navigate to the previous page within a TechDocs entity', () => { - return cy.getTechDocsShadowRoot().within(() => { - cy.get('footer a').contains('Sub-page 1').click(); - - cy.location().should(loc => { - expect(loc.pathname).to.eq( - '/docs/default/Component/techdocs-e2e-fixture/sub-page-one/', - ); - }); - }); - }); - }); - }); -}); diff --git a/cypress/src/support/commands.ts b/cypress/src/support/commands.ts deleted file mode 100644 index 62e21a5bef..0000000000 --- a/cypress/src/support/commands.ts +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* eslint-disable jest/no-standalone-expect */ -/// -import 'os'; - -Cypress.Commands.add('loginAsGuest', () => { - cy.visit('/', { - onLoad: (win: Window) => - win.localStorage.setItem('@backstage/core:SignInPage:provider', 'guest'), - }); -}); - -Cypress.Commands.add('getTechDocsShadowRoot', () => { - cy.get('[data-testid="techdocs-native-shadowroot"]').shadow(); -}); - -Cypress.Commands.add('isNotInViewport', element => { - cy.get(element).then($el => { - const bottom = Cypress.config(`viewportHeight`); - const rect = $el[0].getBoundingClientRect(); - - if (bottom) { - expect(rect.top).to.be.greaterThan(bottom); - expect(rect.bottom).to.be.greaterThan(bottom); - expect(rect.top).to.be.greaterThan(bottom); - expect(rect.bottom).to.be.greaterThan(bottom); - } - }); -}); - -Cypress.Commands.add('isInViewport', element => { - cy.get(element).then($el => { - const bottom = Cypress.config(`viewportHeight`); - const rect = $el[0].getBoundingClientRect(); - - if (bottom) { - expect(rect.top).not.to.be.greaterThan(bottom); - expect(rect.bottom).not.to.be.greaterThan(bottom); - expect(rect.top).not.to.be.greaterThan(bottom); - expect(rect.bottom).not.to.be.greaterThan(bottom); - } - }); -}); - -Cypress.Commands.add('getTechDocsTableOfContents', () => { - cy.get('[data-md-type="toc"]'); -}); - -Cypress.Commands.add('getTechDocsNavigation', () => { - cy.get('[data-md-type="navigation"]'); -}); - -Cypress.Commands.add('getCatalogDocsTab', () => { - cy.get('button[role="tab"]').contains('Docs'); -}); - -Cypress.Commands.add('mockSockJSNode', () => { - cy.intercept('GET', '**/sockjs-node/info**', { - body: { - websocket: true, - origins: ['*:*'], - cookie_needed: false, - entropy: 2882389500, - }, - }); -}); - -Cypress.Commands.add('interceptTechDocsAPICalls', () => { - cy.intercept( - 'GET', - '**/techdocs/metadata/entity/default/Component/techdocs-e2e-fixture', - ).as('entityMetadata'); - - cy.intercept( - 'GET', - '**/techdocs/metadata/techdocs/default/Component/techdocs-e2e-fixture', - ).as('techdocsMetadata'); - - cy.intercept( - 'GET', - '**/techdocs/sync/default/Component/techdocs-e2e-fixture', - ).as('syncEntity'); - - cy.intercept( - 'GET', - '**/techdocs/static/docs/default/Component/techdocs-e2e-fixture/sub-page-two/index.html', - ).as('sectionTwoHTML'); - - cy.intercept( - 'GET', - '**/techdocs/static/docs/default/Component/techdocs-e2e-fixture/index.html', - ).as('homeHTML'); -}); - -Cypress.Commands.add('waitSectionTwoPage', () => { - cy.wait([ - '@entityMetadata', - '@syncEntity', - '@techdocsMetadata', - '@sectionTwoHTML', - ]); -}); - -Cypress.Commands.add('waitHomePage', () => { - cy.wait(['@entityMetadata', '@syncEntity', '@techdocsMetadata', '@homeHTML']); -}); - -Cypress.Commands.add('checkForErrors', () => { - // when an error occurs there is a

with an "alert" role attribute. This can change ofc => we shall add also some positive ("when error occurs") test - cy.get('div[role="alert"]').should('not.exist'); -}); diff --git a/cypress/src/support/index.ts b/cypress/src/support/index.ts deleted file mode 100644 index 6d1051a793..0000000000 --- a/cypress/src/support/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/// -import './commands'; diff --git a/cypress/src/types.d.ts b/cypress/src/types.d.ts deleted file mode 100644 index dca22112e9..0000000000 --- a/cypress/src/types.d.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -declare module 'zombie'; -declare module 'pgtools'; -declare namespace Cypress { - interface Chainable { - /** - * Login as guest - * @example cy.loginAsGuests - */ - loginAsGuest(): Chainable; - /** - * Get the TechDocs shadow root element - * @example cy.getTechDocsShadowRoot - */ - getTechDocsShadowRoot(): Chainable; - /** - * Mock TechDocs backend API - * @example cy.mockTechDocs - */ - mockTechDocs(): void; - /** - * Get the TechDocs table of contents element - * @example cy.getTechDocsShadowRoot - */ - getTechDocsTableOfContents(): Chainable; - /** - * Get the TechDocs navigation element - * @example cy.getTechDocsNavigation - */ - getTechDocsNavigation(): Chainable; - /** - * Get the Catalog docs tab - * @example cy.getCatalogDocsTab - */ - getCatalogDocsTab(): Chainable; - /** - * Intercept the TechDocs API calls - * @example cy.interceptTechDocsAPICalls - */ - interceptTechDocsAPICalls(): Chainable; - /** - * Mock SockJS-Node call - * @example cy.mockSockJSNode - */ - mockSockJSNode(): Chainable; - /** - * Wait TechDocs API response for home page - * @example cy.waitHomePage - */ - waitHomePage(): Chainable; - /** - * Wait TechDocs API response for Section 2 page - * @example cy.waitSectionTwoPage - */ - waitSectionTwoPage(): Chainable; - /** - * Check if the element is in viewport - * @example cy.isInViewport - */ - isInViewport(element: string): Chainable; - /** - * Check if the element is not in viewport - * @example cy.isNotInViewport - */ - isNotInViewport(element: string): Chainable; - /** - * Check if we have not caused error by our last action - * @example cy.checkForErrors - */ - checkForErrors(): Chainable; - } -} diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts deleted file mode 100644 index fd4db77d61..0000000000 --- a/cypress/support/commands.ts +++ /dev/null @@ -1,52 +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. - */ - -// *********************************************** -// This example commands.ts shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -// -// declare global { -// namespace Cypress { -// interface Chainable { -// login(email: string, password: string): Chainable -// drag(subject: string, options?: Partial): Chainable -// dismiss(subject: string, options?: Partial): Chainable -// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable -// } -// } -// } diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts deleted file mode 100644 index c71790471e..0000000000 --- a/cypress/support/e2e.ts +++ /dev/null @@ -1,35 +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. - */ - -// This example support/e2e.ts is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands'; - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json deleted file mode 100644 index 9c4a63b76c..0000000000 --- a/cypress/tsconfig.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "compilerOptions": { - "allowJs": true, - "declaration": true, - "declarationMap": false, - "esModuleInterop": true, - "experimentalDecorators": false, - "forceConsistentCasingInFileNames": true, - "importHelpers": false, - "incremental": true, - "isolatedModules": true, - "jsx": "react", - "lib": ["DOM", "DOM.Iterable", "ScriptHost", "ES2021", "ESNext.Promise"], - "module": "ESNext", - "moduleResolution": "node", - "noEmit": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "pretty": true, - "removeComments": false, - "resolveJsonModule": true, - "sourceMap": false, - "skipLibCheck": false, - "strict": true, - "strictBindCallApply": true, - "strictFunctionTypes": true, - "strictNullChecks": true, - "strictPropertyInitialization": true, - "stripInternal": true, - "target": "ES2021", - "types": ["node", "cypress"] - } -} diff --git a/cypress/yarn.lock b/cypress/yarn.lock deleted file mode 100644 index 290f441c4c..0000000000 --- a/cypress/yarn.lock +++ /dev/null @@ -1,1526 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@backstage/cypress-tests@workspace:.": - version: 0.0.0-use.local - resolution: "@backstage/cypress-tests@workspace:." - dependencies: - cypress: ^10.0.0 - typescript: ^4.1.3 - languageName: unknown - linkType: soft - -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 - languageName: node - linkType: hard - -"@cypress/request@npm:^2.88.10": - version: 2.88.10 - resolution: "@cypress/request@npm:2.88.10" - dependencies: - aws-sign2: ~0.7.0 - aws4: ^1.8.0 - caseless: ~0.12.0 - combined-stream: ~1.0.6 - extend: ~3.0.2 - forever-agent: ~0.6.1 - form-data: ~2.3.2 - http-signature: ~1.3.6 - is-typedarray: ~1.0.0 - isstream: ~0.1.2 - json-stringify-safe: ~5.0.1 - mime-types: ~2.1.19 - performance-now: ^2.1.0 - qs: ~6.5.2 - safe-buffer: ^5.1.2 - tough-cookie: ~2.5.0 - tunnel-agent: ^0.6.0 - uuid: ^8.3.2 - checksum: 69c3e3b332e9be4866a900f6bcca5d274d8cea6c99707fbcce061de8dbab11c9b1e39f4c017f6e83e6e682717781d4f6106fd6b7cf9546580fcfac353b6676cf - languageName: node - linkType: hard - -"@cypress/xvfb@npm:^1.2.4": - version: 1.2.4 - resolution: "@cypress/xvfb@npm:1.2.4" - dependencies: - debug: ^3.1.0 - lodash.once: ^4.1.1 - checksum: 7bdcdaeb1bb692ec9d9bf8ec52538aa0bead6764753f4a067a171a511807a43fab016f7285a56bef6a606c2467ff3f1365e1ad2d2d583b81beed849ee1573fd1 - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 18.7.14 - resolution: "@types/node@npm:18.7.14" - checksum: 99cf28ff854100158de875cca23c7acc3cc01dfee526a52b90b7f36767c821bcbaf2be0a98a70f06f3b78f3c60639168ff949d725b61e2e124f9f71f1fb8043d - languageName: node - linkType: hard - -"@types/node@npm:^14.14.31": - version: 14.18.26 - resolution: "@types/node@npm:14.18.26" - checksum: c6ac3f9d4f6f77c0fa5ac17757779ad4d9835abfe3af5708b7552597cb5c7c1103e83499ccaf767a1cfa70040990bcf3f58761c547051dc8d5077f3c419091b1 - languageName: node - linkType: hard - -"@types/sinonjs__fake-timers@npm:8.1.1": - version: 8.1.1 - resolution: "@types/sinonjs__fake-timers@npm:8.1.1" - checksum: ca09d54d47091d87020824a73f026300fa06b17cd9f2f9b9387f28b549364b141ef194ee28db762f6588de71d8febcd17f753163cb7ea116b8387c18e80ebd5c - languageName: node - linkType: hard - -"@types/sizzle@npm:^2.3.2": - version: 2.3.3 - resolution: "@types/sizzle@npm:2.3.3" - checksum: 586a9fb1f6ff3e325e0f2cc1596a460615f0bc8a28f6e276ac9b509401039dd242fa8b34496d3a30c52f5b495873922d09a9e76c50c2ab2bcc70ba3fb9c4e160 - languageName: node - linkType: hard - -"@types/yauzl@npm:^2.9.1": - version: 2.10.0 - resolution: "@types/yauzl@npm:2.10.0" - dependencies: - "@types/node": "*" - checksum: 55d27ae5d346ea260e40121675c24e112ef0247649073848e5d4e03182713ae4ec8142b98f61a1c6cbe7d3b72fa99bbadb65d8b01873e5e605cdc30f1ff70ef2 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ansi-colors@npm:^4.1.1": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.3.0": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"arch@npm:^2.2.0": - version: 2.2.0 - resolution: "arch@npm:2.2.0" - checksum: e21b7635029fe8e9cdd5a026f9a6c659103e63fff423834323cdf836a1bb240a72d0c39ca8c470f84643385cf581bd8eda2cad8bf493e27e54bd9783abe9101f - languageName: node - linkType: hard - -"asn1@npm:~0.2.3": - version: 0.2.6 - resolution: "asn1@npm:0.2.6" - dependencies: - safer-buffer: ~2.1.0 - checksum: 39f2ae343b03c15ad4f238ba561e626602a3de8d94ae536c46a4a93e69578826305366dc09fbb9b56aec39b4982a463682f259c38e59f6fa380cd72cd61e493d - languageName: node - linkType: hard - -"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": - version: 1.0.0 - resolution: "assert-plus@npm:1.0.0" - checksum: 19b4340cb8f0e6a981c07225eacac0e9d52c2644c080198765d63398f0075f83bbc0c8e95474d54224e297555ad0d631c1dcd058adb1ddc2437b41a6b424ac64 - languageName: node - linkType: hard - -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 - languageName: node - linkType: hard - -"async@npm:^3.2.0": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"aws-sign2@npm:~0.7.0": - version: 0.7.0 - resolution: "aws-sign2@npm:0.7.0" - checksum: b148b0bb0778098ad8cf7e5fc619768bcb51236707ca1d3e5b49e41b171166d8be9fdc2ea2ae43d7decf02989d0aaa3a9c4caa6f320af95d684de9b548a71525 - languageName: node - linkType: hard - -"aws4@npm:^1.8.0": - version: 1.11.0 - resolution: "aws4@npm:1.11.0" - checksum: 5a00d045fd0385926d20ebebcfba5ec79d4482fe706f63c27b324d489a04c68edb0db99ed991e19eda09cb8c97dc2452059a34d97545cebf591d7a2b5a10999f - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - -"bcrypt-pbkdf@npm:^1.0.0": - version: 1.0.2 - resolution: "bcrypt-pbkdf@npm:1.0.2" - dependencies: - tweetnacl: ^0.14.3 - checksum: 4edfc9fe7d07019609ccf797a2af28351736e9d012c8402a07120c4453a3b789a15f2ee1530dc49eee8f7eb9379331a8dd4b3766042b9e502f74a68e7f662291 - languageName: node - linkType: hard - -"blob-util@npm:^2.0.2": - version: 2.0.2 - resolution: "blob-util@npm:2.0.2" - checksum: d543e6b92e4ca715ca33c78e89a07a2290d43e5b2bc897d7ec588c5c7bbf59df93e45225ac0c9258aa6ce4320358990f99c9288f1c48280f8ec5d7a2e088d19b - languageName: node - linkType: hard - -"bluebird@npm:^3.7.2": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c - languageName: node - linkType: hard - -"buffer@npm:^5.6.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.1.13 - checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 - languageName: node - linkType: hard - -"cachedir@npm:^2.3.0": - version: 2.3.0 - resolution: "cachedir@npm:2.3.0" - checksum: ec90cb0f2e6336e266aa748dbadf3da9e0b20e843e43f1591acab7a3f1451337dc2f26cb9dd833ae8cfefeffeeb43ef5b5ff62782a685f4e3c2305dd98482fcb - languageName: node - linkType: hard - -"caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: b43bd4c440aa1e8ee6baefee8063b4850fd0d7b378f6aabc796c9ec8cb26d27fb30b46885350777d9bd079c5256c0e1329ad0dc7c2817e0bb466810ebb353751 - languageName: node - linkType: hard - -"chalk@npm:^4.1.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"check-more-types@npm:^2.24.0": - version: 2.24.0 - resolution: "check-more-types@npm:2.24.0" - checksum: b09080ec3404d20a4b0ead828994b2e5913236ef44ed3033a27062af0004cf7d2091fbde4b396bf13b7ce02fb018bc9960b48305e6ab2304cd82d73ed7a51ef4 - languageName: node - linkType: hard - -"ci-info@npm:^3.2.0": - version: 3.3.2 - resolution: "ci-info@npm:3.3.2" - checksum: fd81f1edd2d3b0f6cb077b2e84365136d87b9db8c055928c1ad69da8a76c2c2f19cba8ea51b90238302157ca927f91f92b653e933f2398dde4867500f08d6e62 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: ^3.1.0 - checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 - languageName: node - linkType: hard - -"cli-table3@npm:~0.6.1": - version: 0.6.2 - resolution: "cli-table3@npm:0.6.2" - dependencies: - "@colors/colors": 1.5.0 - string-width: ^4.2.0 - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 2f82391698b8a2a2a5e45d2adcfea5d93e557207f90455a8d4c1aac688e9b18a204d9eb4ba1d322fa123b17d64ea3dc5e11de8b005529f3c3e7dbeb27cb4d9be - languageName: node - linkType: hard - -"cli-truncate@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-truncate@npm:2.1.0" - dependencies: - slice-ansi: ^3.0.0 - string-width: ^4.2.0 - checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"colorette@npm:^2.0.16": - version: 2.0.19 - resolution: "colorette@npm:2.0.19" - checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.6, combined-stream@npm:~1.0.6": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"commander@npm:^5.1.0": - version: 5.1.0 - resolution: "commander@npm:5.1.0" - checksum: 0b7fec1712fbcc6230fcb161d8d73b4730fa91a21dc089515489402ad78810547683f058e2a9835929c212fead1d6a6ade70db28bbb03edbc2829a9ab7d69447 - languageName: node - linkType: hard - -"common-tags@npm:^1.8.0": - version: 1.8.2 - resolution: "common-tags@npm:1.8.2" - checksum: 767a6255a84bbc47df49a60ab583053bb29a7d9687066a18500a516188a062c4e4cd52de341f22de0b07062e699b1b8fe3cfa1cb55b241cb9301aeb4f45b4dff - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"core-util-is@npm:1.0.2": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 7a4c925b497a2c91421e25bf76d6d8190f0b2359a9200dbeed136e63b2931d6294d3b1893eda378883ed363cd950f44a12a401384c609839ea616befb7927dab - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"cypress@npm:^10.0.0": - version: 10.11.0 - resolution: "cypress@npm:10.11.0" - dependencies: - "@cypress/request": ^2.88.10 - "@cypress/xvfb": ^1.2.4 - "@types/node": ^14.14.31 - "@types/sinonjs__fake-timers": 8.1.1 - "@types/sizzle": ^2.3.2 - arch: ^2.2.0 - blob-util: ^2.0.2 - bluebird: ^3.7.2 - buffer: ^5.6.0 - cachedir: ^2.3.0 - chalk: ^4.1.0 - check-more-types: ^2.24.0 - cli-cursor: ^3.1.0 - cli-table3: ~0.6.1 - commander: ^5.1.0 - common-tags: ^1.8.0 - dayjs: ^1.10.4 - debug: ^4.3.2 - enquirer: ^2.3.6 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: ^4.1.1 - extract-zip: 2.0.1 - figures: ^3.2.0 - fs-extra: ^9.1.0 - getos: ^3.2.1 - is-ci: ^3.0.0 - is-installed-globally: ~0.4.0 - lazy-ass: ^1.6.0 - listr2: ^3.8.3 - lodash: ^4.17.21 - log-symbols: ^4.0.0 - minimist: ^1.2.6 - ospath: ^1.2.2 - pretty-bytes: ^5.6.0 - proxy-from-env: 1.0.0 - request-progress: ^3.0.0 - semver: ^7.3.2 - supports-color: ^8.1.1 - tmp: ~0.2.1 - untildify: ^4.0.0 - yauzl: ^2.10.0 - bin: - cypress: bin/cypress - checksum: 938cc6a20f7eeace5c8e850d234904ee1651cbb36d94666fe600cf17ce964e73d4f7d8d944aab677491702a57364e6aceeb4fe8bcbd96147ff5e2b575a956fb2 - languageName: node - linkType: hard - -"dashdash@npm:^1.12.0": - version: 1.14.1 - resolution: "dashdash@npm:1.14.1" - dependencies: - assert-plus: ^1.0.0 - checksum: 3634c249570f7f34e3d34f866c93f866c5b417f0dd616275decae08147dcdf8fccfaa5947380ccfb0473998ea3a8057c0b4cd90c875740ee685d0624b2983598 - languageName: node - linkType: hard - -"dayjs@npm:^1.10.4": - version: 1.11.5 - resolution: "dayjs@npm:1.11.5" - checksum: e3bbaa7b4883b31be4bf75a181f1447fbb19800c29b332852125aab96baeff3ac232dcba8b88c4ea17d3b636c99dac5fb9d1af4bb6ae26615698bbc4a852dffb - languageName: node - linkType: hard - -"debug@npm:^3.1.0": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - -"debug@npm:^4.1.1, debug@npm:^4.3.2": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"ecc-jsbn@npm:~0.1.1": - version: 0.1.2 - resolution: "ecc-jsbn@npm:0.1.2" - dependencies: - jsbn: ~0.1.0 - safer-buffer: ^2.1.0 - checksum: 22fef4b6203e5f31d425f5b711eb389e4c6c2723402e389af394f8411b76a488fa414d309d866e2b577ce3e8462d344205545c88a8143cc21752a5172818888a - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - -"enquirer@npm:^2.3.6": - version: 2.3.6 - resolution: "enquirer@npm:2.3.6" - dependencies: - ansi-colors: ^4.1.1 - checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"eventemitter2@npm:6.4.7": - version: 6.4.7 - resolution: "eventemitter2@npm:6.4.7" - checksum: 1b36a77e139d6965ebf3a36c01fa00c089ae6b80faa1911e52888f40b3a7057b36a2cc45dcd1ad87cda3798fe7b97a0aabcbb8175a8b96092a23bb7d0f039e66 - languageName: node - linkType: hard - -"execa@npm:4.1.0": - version: 4.1.0 - resolution: "execa@npm:4.1.0" - dependencies: - cross-spawn: ^7.0.0 - get-stream: ^5.0.0 - human-signals: ^1.1.1 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.0 - onetime: ^5.1.0 - signal-exit: ^3.0.2 - strip-final-newline: ^2.0.0 - checksum: e30d298934d9c52f90f3847704fd8224e849a081ab2b517bbc02f5f7732c24e56a21f14cb96a08256deffeb2d12b2b7cb7e2b014a12fb36f8d3357e06417ed55 - languageName: node - linkType: hard - -"executable@npm:^4.1.1": - version: 4.1.1 - resolution: "executable@npm:4.1.1" - dependencies: - pify: ^2.2.0 - checksum: f01927ce59bccec804e171bf859a26e362c1f50aa9ebc69f7cafdcce3859d29d4b6267fd47237c18b0a1830614bd3f0ee14b7380d9bad18a4e7af9b5f0b6984f - languageName: node - linkType: hard - -"extend@npm:~3.0.2": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 - languageName: node - linkType: hard - -"extract-zip@npm:2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": ^2.9.1 - debug: ^4.1.1 - get-stream: ^5.1.0 - yauzl: ^2.10.0 - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 - languageName: node - linkType: hard - -"extsprintf@npm:1.3.0": - version: 1.3.0 - resolution: "extsprintf@npm:1.3.0" - checksum: cee7a4a1e34cffeeec18559109de92c27517e5641991ec6bab849aa64e3081022903dd53084f2080d0d2530803aa5ee84f1e9de642c365452f9e67be8f958ce2 - languageName: node - linkType: hard - -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: a2f29b241914a8d2bad64363de684821b6b1609d06ae68d5b539e4de6b28659715b5bea94a7265201603713b7027d35399d10b0548f09071c5513e65e8323d33 - languageName: node - linkType: hard - -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: ~1.2.0 - checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 - languageName: node - linkType: hard - -"figures@npm:^3.2.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: ^1.0.5 - checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b - languageName: node - linkType: hard - -"forever-agent@npm:~0.6.1": - version: 0.6.1 - resolution: "forever-agent@npm:0.6.1" - checksum: 766ae6e220f5fe23676bb4c6a99387cec5b7b62ceb99e10923376e27bfea72f3c3aeec2ba5f45f3f7ba65d6616965aa7c20b15002b6860833bb6e394dea546a8 - languageName: node - linkType: hard - -"form-data@npm:~2.3.2": - version: 2.3.3 - resolution: "form-data@npm:2.3.3" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 10c1780fa13dbe1ff3100114c2ce1f9307f8be10b14bf16e103815356ff567b6be39d70fc4a40f8990b9660012dc24b0f5e1dde1b6426166eb23a445ba068ca3 - languageName: node - linkType: hard - -"fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - -"getos@npm:^3.2.1": - version: 3.2.1 - resolution: "getos@npm:3.2.1" - dependencies: - async: ^3.2.0 - checksum: 42fd78a66d47cebd3e09de5566cc0044e034b08f4a000a310dbd89a77b02c65d8f4002554bfa495ea5bdc4fa9d515f5ac785a7cc474ba45383cc697f865eeaf1 - languageName: node - linkType: hard - -"getpass@npm:^0.1.1": - version: 0.1.7 - resolution: "getpass@npm:0.1.7" - dependencies: - assert-plus: ^1.0.0 - checksum: ab18d55661db264e3eac6012c2d3daeafaab7a501c035ae0ccb193c3c23e9849c6e29b6ac762b9c2adae460266f925d55a3a2a3a3c8b94be2f222df94d70c046 - languageName: node - linkType: hard - -"glob@npm:^7.1.3": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"global-dirs@npm:^3.0.0": - version: 3.0.0 - resolution: "global-dirs@npm:3.0.0" - dependencies: - ini: 2.0.0 - checksum: 953c17cf14bf6ee0e2100ae82a0d779934eed8a3ec5c94a7a4f37c5b3b592c31ea015fb9a15cf32484de13c79f4a814f3015152f3e1d65976cfbe47c1bfe4a88 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"http-signature@npm:~1.3.6": - version: 1.3.6 - resolution: "http-signature@npm:1.3.6" - dependencies: - assert-plus: ^1.0.0 - jsprim: ^2.0.2 - sshpk: ^1.14.1 - checksum: 10be2af4764e71fee0281392937050201ee576ac755c543f570d6d87134ce5e858663fe999a7adb3e4e368e1e356d0d7fec6b9542295b875726ff615188e7a0c - languageName: node - linkType: hard - -"human-signals@npm:^1.1.1": - version: 1.1.1 - resolution: "human-signals@npm:1.1.1" - checksum: d587647c9e8ec24e02821b6be7de5a0fc37f591f6c4e319b3054b43fd4c35a70a94c46fc74d8c1a43c47fde157d23acd7421f375e1c1365b09a16835b8300205 - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ini@npm:2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: e7aadc5fb2e4aefc666d74ee2160c073995a4061556b1b5b4241ecb19ad609243b9cceafe91bae49c219519394bbd31512516cb22a3b1ca6e66d869e0447e84e - languageName: node - linkType: hard - -"is-ci@npm:^3.0.0": - version: 3.0.1 - resolution: "is-ci@npm:3.0.1" - dependencies: - ci-info: ^3.2.0 - bin: - is-ci: bin.js - checksum: 192c66dc7826d58f803ecae624860dccf1899fc1f3ac5505284c0a5cf5f889046ffeb958fa651e5725d5705c5bcb14f055b79150ea5fcad7456a9569de60260e - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-installed-globally@npm:~0.4.0": - version: 0.4.0 - resolution: "is-installed-globally@npm:0.4.0" - dependencies: - global-dirs: ^3.0.0 - is-path-inside: ^3.0.2 - checksum: 3359840d5982d22e9b350034237b2cda2a12bac1b48a721912e1ab8e0631dd07d45a2797a120b7b87552759a65ba03e819f1bd63f2d7ab8657ec0b44ee0bf399 - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.2": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"is-typedarray@npm:~1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 1eb2fe63a729f7bdd8a559ab552c69055f4f48eb5c2f03724430587c6f450783c8f1cd936c1c952d0a927925180fcc892ebd5b174236cf1065d4bd5bdb37e963 - languageName: node - linkType: hard - -"jsbn@npm:~0.1.0": - version: 0.1.1 - resolution: "jsbn@npm:0.1.1" - checksum: e5ff29c1b8d965017ef3f9c219dacd6e40ad355c664e277d31246c90545a02e6047018c16c60a00f36d561b3647215c41894f5d869ada6908a2e0ce4200c88f2 - languageName: node - linkType: hard - -"json-schema@npm:0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 66389434c3469e698da0df2e7ac5a3281bcff75e797a5c127db7c5b56270e01ae13d9afa3c03344f76e32e81678337a8c912bdbb75101c62e487dc3778461d72 - languageName: node - linkType: hard - -"json-stringify-safe@npm:~5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 - languageName: node - linkType: hard - -"jsprim@npm:^2.0.2": - version: 2.0.2 - resolution: "jsprim@npm:2.0.2" - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - checksum: d175f6b1991e160cb0aa39bc857da780e035611986b5492f32395411879fdaf4e513d98677f08f7352dac93a16b66b8361c674b86a3fa406e2e7af6b26321838 - languageName: node - linkType: hard - -"lazy-ass@npm:^1.6.0": - version: 1.6.0 - resolution: "lazy-ass@npm:1.6.0" - checksum: 5a3ebb17915b03452320804466345382a6c25ac782ec4874fecdb2385793896cd459be2f187dc7def8899180c32ee0ab9a1aa7fe52193ac3ff3fe29bb0591729 - languageName: node - linkType: hard - -"listr2@npm:^3.8.3": - version: 3.14.0 - resolution: "listr2@npm:3.14.0" - dependencies: - cli-truncate: ^2.1.0 - colorette: ^2.0.16 - log-update: ^4.0.0 - p-map: ^4.0.0 - rfdc: ^1.3.0 - rxjs: ^7.5.1 - through: ^2.3.8 - wrap-ansi: ^7.0.0 - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: fdb8b2d6bdf5df9371ebd5082bee46c6d0ca3d1e5f2b11fbb5a127839855d5f3da9d4968fce94f0a5ec67cac2459766abbb1faeef621065ebb1829b11ef9476d - languageName: node - linkType: hard - -"lodash.once@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 - languageName: node - linkType: hard - -"lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - -"log-symbols@npm:^4.0.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: ^4.1.0 - is-unicode-supported: ^0.1.0 - checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - languageName: node - linkType: hard - -"log-update@npm:^4.0.0": - version: 4.0.0 - resolution: "log-update@npm:4.0.0" - dependencies: - ansi-escapes: ^4.3.0 - cli-cursor: ^3.1.0 - slice-ansi: ^4.0.0 - wrap-ansi: ^6.2.0 - checksum: ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimist@npm:^1.2.6": - version: 1.2.6 - resolution: "minimist@npm:1.2.6" - checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.0": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"onetime@npm:^5.1.0": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 - languageName: node - linkType: hard - -"ospath@npm:^1.2.2": - version: 1.2.2 - resolution: "ospath@npm:1.2.2" - checksum: 505f48a4f4f1c557d6c656ec985707726e3714721680139be037613e903aa8c8fa4ddd8d1342006f9b2dc0065e6e20f8b7bea2ee05354f31257044790367b347 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d - languageName: node - linkType: hard - -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 - languageName: node - linkType: hard - -"pify@npm:^2.2.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba - languageName: node - linkType: hard - -"pretty-bytes@npm:^5.6.0": - version: 5.6.0 - resolution: "pretty-bytes@npm:5.6.0" - checksum: 9c082500d1e93434b5b291bd651662936b8bd6204ec9fa17d563116a192d6d86b98f6d328526b4e8d783c07d5499e2614a807520249692da9ec81564b2f439cd - languageName: node - linkType: hard - -"proxy-from-env@npm:1.0.0": - version: 1.0.0 - resolution: "proxy-from-env@npm:1.0.0" - checksum: 292e28d1de0c315958d71d8315eb546dd3cd8c8cbc2dab7c54eeb9f5c17f421771964ad0b5e1f77011bab2305bdae42e1757ce33bdb1ccc3e87732322a8efcf1 - languageName: node - linkType: hard - -"psl@npm:^1.1.28": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 - languageName: node - linkType: hard - -"punycode@npm:^2.1.1": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 - languageName: node - linkType: hard - -"qs@npm:~6.5.2": - version: 6.5.3 - resolution: "qs@npm:6.5.3" - checksum: 6f20bf08cabd90c458e50855559539a28d00b2f2e7dddcb66082b16a43188418cb3cb77cbd09268bcef6022935650f0534357b8af9eeb29bf0f27ccb17655692 - languageName: node - linkType: hard - -"request-progress@npm:^3.0.0": - version: 3.0.0 - resolution: "request-progress@npm:3.0.0" - dependencies: - throttleit: ^1.0.0 - checksum: 6ea1761dcc8a8b7b5894afd478c0286aa31bd69438d7050294bd4fd0d0b3e09b5cde417d38deef9c49809039c337d8744e4bb49d8632b0c3e4ffa5e8a687e0fd - languageName: node - linkType: hard - -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 - checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 - languageName: node - linkType: hard - -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 - languageName: node - linkType: hard - -"rimraf@npm:^3.0.0": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"rxjs@npm:^7.5.1": - version: 7.5.6 - resolution: "rxjs@npm:7.5.6" - dependencies: - tslib: ^2.1.0 - checksum: fc05f01364a74dac57490fb3e07ea63b422af04017fae1db641a009073f902ef69f285c5daac31359620dc8d9aee7d81e42b370ca2a8573d1feae0b04329383b - languageName: node - linkType: hard - -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.2": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"semver@npm:^7.3.2": - version: 7.5.3 - resolution: "semver@npm:7.5.3" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 9d58db16525e9f749ad0a696a1f27deabaa51f66e91d2fa2b0db3de3e9644e8677de3b7d7a03f4c15bc81521e0c3916d7369e0572dbde250d9bedf5194e2a8a7 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"slice-ansi@npm:^3.0.0": - version: 3.0.0 - resolution: "slice-ansi@npm:3.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24 - languageName: node - linkType: hard - -"slice-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "slice-ansi@npm:4.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 - languageName: node - linkType: hard - -"sshpk@npm:^1.14.1": - version: 1.17.0 - resolution: "sshpk@npm:1.17.0" - dependencies: - asn1: ~0.2.3 - assert-plus: ^1.0.0 - bcrypt-pbkdf: ^1.0.0 - dashdash: ^1.12.0 - ecc-jsbn: ~0.1.1 - getpass: ^0.1.1 - jsbn: ~0.1.0 - safer-buffer: ^2.0.2 - tweetnacl: ~0.14.0 - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: ba109f65c8e6c35133b8e6ed5576abeff8aa8d614824b7275ec3ca308f081fef483607c28d97780c1e235818b0f93ed8c8b56d0a5968d5a23fd6af57718c7597 - languageName: node - linkType: hard - -"string-width@npm:^4.1.0, string-width@npm:^4.2.0": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-color@npm:^8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: ^4.0.0 - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 - languageName: node - linkType: hard - -"throttleit@npm:^1.0.0": - version: 1.0.0 - resolution: "throttleit@npm:1.0.0" - checksum: 1b2db4d2454202d589e8236c07a69d2fab838876d370030ebea237c34c0a7d1d9cf11c29f994531ebb00efd31e9728291042b7754f2798a8352ec4463455b659 - languageName: node - linkType: hard - -"through@npm:^2.3.8": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd - languageName: node - linkType: hard - -"tmp@npm:~0.2.1": - version: 0.2.1 - resolution: "tmp@npm:0.2.1" - dependencies: - rimraf: ^3.0.0 - checksum: 8b1214654182575124498c87ca986ac53dc76ff36e8f0e0b67139a8d221eaecfdec108c0e6ec54d76f49f1f72ab9325500b246f562b926f85bcdfca8bf35df9e - languageName: node - linkType: hard - -"tough-cookie@npm:~2.5.0": - version: 2.5.0 - resolution: "tough-cookie@npm:2.5.0" - dependencies: - psl: ^1.1.28 - punycode: ^2.1.1 - checksum: 16a8cd090224dd176eee23837cbe7573ca0fa297d7e468ab5e1c02d49a4e9a97bb05fef11320605eac516f91d54c57838a25864e8680e27b069a5231d8264977 - languageName: node - linkType: hard - -"tslib@npm:^2.1.0": - version: 2.4.0 - resolution: "tslib@npm:2.4.0" - checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 - languageName: node - linkType: hard - -"tunnel-agent@npm:^0.6.0": - version: 0.6.0 - resolution: "tunnel-agent@npm:0.6.0" - dependencies: - safe-buffer: ^5.0.1 - checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711 - languageName: node - linkType: hard - -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": - version: 0.14.5 - resolution: "tweetnacl@npm:0.14.5" - checksum: 6061daba1724f59473d99a7bb82e13f211cdf6e31315510ae9656fefd4779851cb927adad90f3b488c8ed77c106adc0421ea8055f6f976ff21b27c5c4e918487 - languageName: node - linkType: hard - -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 - languageName: node - linkType: hard - -"typescript@npm:^4.1.3": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.1.3#~builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=a1c5e5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20 - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 - languageName: node - linkType: hard - -"untildify@npm:^4.0.0": - version: 4.0.0 - resolution: "untildify@npm:4.0.0" - checksum: 39ced9c418a74f73f0a56e1ba4634b4d959422dff61f4c72a8e39f60b99380c1b45ed776fbaa0a4101b157e4310d873ad7d114e8534ca02609b4916bb4187fb9 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df - languageName: node - linkType: hard - -"verror@npm:1.10.0": - version: 1.10.0 - resolution: "verror@npm:1.10.0" - dependencies: - assert-plus: ^1.0.0 - core-util-is: 1.0.2 - extsprintf: ^1.2.0 - checksum: c431df0bedf2088b227a4e051e0ff4ca54df2c114096b0c01e1cbaadb021c30a04d7dd5b41ab277bcd51246ca135bf931d4c4c796ecae7a4fef6d744ecef36ea - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a - languageName: node - linkType: hard - -"wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: ~0.2.3 - fd-slicer: ~1.1.0 - checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b - languageName: node - linkType: hard diff --git a/docs/FAQ.md b/docs/FAQ.md index 3b3ae4bf73..7b935140e6 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -162,9 +162,9 @@ APIs in TypeScript, but aren't forcing it on individual plugins. ### How do I find out if a plugin already exists? You can browse and search for all available plugins in the -[Plugin Marketplace](https://backstage.io/plugins). +[Plugin Directory](https://backstage.io/plugins). -If you can't find it in the marketplace, before you write a plugin +If you can't find it in the directory, before you write a plugin [search the plugin issues](https://github.com/backstage/backstage/issues?q=is%3Aissue+label%3Aplugin+) to see if is in the works. If no one's thought of it yet, great! Open a new issue as diff --git a/docs/assets/auth/autologout-preview.png b/docs/assets/auth/autologout-preview.png new file mode 100644 index 0000000000..642c5f8aa6 Binary files /dev/null and b/docs/assets/auth/autologout-preview.png differ diff --git a/docs/auth/autologout.md b/docs/auth/autologout.md new file mode 100644 index 0000000000..b85f6f486d --- /dev/null +++ b/docs/auth/autologout.md @@ -0,0 +1,75 @@ +--- +id: autologout +title: Auto Logout +# prettier-ignore +description: This section describes how to setup the Auto Logout mechanism in Backstage +--- + +This section describes how to setup the Auto Logout mechanism in Backstage in case your organization needs it. + +## Summary + +The Auto Logout feature is an optional added security to Backstage, designed to automatically log out users after a preconfigured duration of inactivity. This capability helps to effectively mitigate the risks associated with unauthorized access through abandoned sessions, especially in shared device scenarios. + +The Auto Logout mechanism actively tracks user activity such as mouse movements, clicks, key pressing, and taps. If the system detects no activity over a set time span (idle timeout), it invalidates the user session and redirects to the login page. +_Inactive users_ are the ones that don't perform any action on the Backstage app or that are logged in but no Backstage tab is open in the browser. + +This feature is particularly beneficial if your application should comply with internal policies within your organization that may require automatic logout after a specific period of inactivity. + +This is how it looks like: + +![Auto logout Preview](../assets/auth/autologout-preview.png) + +## Quick start + +To enable and configure Auto Logout, you will need to add the `` component to your Backstage's instance entry point, located at `App.tsx`. + +Here's how to add it: + +```tsx +import { AutoLogout } from '@backstage/core-components'; + +// ... App.tsx contents + +export default app.createRoot( + <> + // ... + + + {routes} + + // ... + , +); +``` + +## Configuration + +You can further adjust the Auto Logout settings by tweaking the available `` properties: + +```tsx + +``` + +If you prefer to have different settings for each Backstage instance deployed at your infrastructure, you can instead leverage your `app-config` and place some configuration properties: + +```yaml +auth: + autologout: + enabled: true +``` + +Bear in mind that, properties configured in `app-config` take precedence over the props passed to the `` React component. +These are the available settings: + +| Configuration Key | Component Property | Description | Allowed Values | Default Value | +| ----------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | --------------------------- | +| `auth.autologout.enabled` | `enabled` | Enable/disable the Auto Logout feature. | `true`/`false` | Default is enabled (`true`) | +| `auth.autologout.idleTimeoutMinutes` | `idleTimeoutMinutes` | Sets the idle time (in minutes) after which the user will be logged out. | `>= 0.5` minutes | `60` | +| `auth.autologout.promptBeforeIdleSeconds` | `promptBeforeIdleSeconds` | Determines the time (in seconds) prior to idle state when a prompt will appear. A value of 0 disables the prompt. This must be less than the value of `idleTimeoutMinutes`. | `>= 0` seconds | `10` | +| `auth.autologout.useWorkerTimers` | `useWorkerTimers` | Enables or disables the use of Node's worker thread timers instead of main thread timers. This can be beneficial if the browser is terminating timers in inactive tabs, like those used by auto logout. In case of browser incompatibility, try setting this to false. | `true`/`false` | `true` | +| `auth.autologout.logoutIfDisconnected` | `logoutIfDisconnected` | Enable/disable auto logout for disconnected users. Disconnected users are those who are logged in but do not have any active Backstage tabs open in their browsers. If enabled, such users will be automatically logged out after `idleTimeoutMinutes`. | `true`/`false` | `true` | diff --git a/docs/auth/index.md b/docs/auth/index.md index ecef22b612..a670e69baa 100644 --- a/docs/auth/index.md +++ b/docs/auth/index.md @@ -140,6 +140,9 @@ const app = createApp({ }); ``` +> NOTE: You can configure sign-in to use a redirect flow with no pop-up by adding +> `enableExperimentalRedirectFlow: true` to the root of your `app-config.yaml` + ## Sign-In with Proxy Providers Some auth providers are so-called "proxy" providers, meaning they're meant to be used diff --git a/docs/backend-system/architecture/01-index.md b/docs/backend-system/architecture/01-index.md index e53d1e4719..0e780039b6 100644 --- a/docs/backend-system/architecture/01-index.md +++ b/docs/backend-system/architecture/01-index.md @@ -6,7 +6,7 @@ sidebar_label: Overview description: The structure and architecture of the new Backend System and its component parts --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** ## Building Blocks diff --git a/docs/backend-system/architecture/02-backends.md b/docs/backend-system/architecture/02-backends.md index 5d8737bb56..4ba76a5af3 100644 --- a/docs/backend-system/architecture/02-backends.md +++ b/docs/backend-system/architecture/02-backends.md @@ -6,7 +6,7 @@ sidebar_label: Backend description: Backend instances --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** ## The Backend Instance diff --git a/docs/backend-system/architecture/03-services.md b/docs/backend-system/architecture/03-services.md index ff6474152a..df610f45ab 100644 --- a/docs/backend-system/architecture/03-services.md +++ b/docs/backend-system/architecture/03-services.md @@ -6,7 +6,7 @@ sidebar_label: Services description: Services for backend plugins --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** Backend services provide shared functionality available to all backend plugins and modules. They are made available through service references that embed a type that represents the service interface, similar to how [Utility APIs](../../api/utility-apis.md) work in the Backstage frontend system. To use a service in your plugin or module you request an implementation of that service using the service reference. diff --git a/docs/backend-system/architecture/04-plugins.md b/docs/backend-system/architecture/04-plugins.md index b42abe7ca4..e93a6a39b2 100644 --- a/docs/backend-system/architecture/04-plugins.md +++ b/docs/backend-system/architecture/04-plugins.md @@ -6,7 +6,7 @@ sidebar_label: Plugins description: Backend plugins --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** Plugins provide the actual base features of a Backstage backend. Each plugin operates completely independently of all other plugins and they only communicate with each other through network calls. This means that there is a strong degree of isolation between plugins, and that each plugin can be considered a separate microservice. While a default Backstage project has all plugins installed within a single backend, it is also possible to split this setup into multiple backends, with each backend housing one or more plugins. diff --git a/docs/backend-system/architecture/05-extension-points.md b/docs/backend-system/architecture/05-extension-points.md index de63b49a15..d8d993b5bf 100644 --- a/docs/backend-system/architecture/05-extension-points.md +++ b/docs/backend-system/architecture/05-extension-points.md @@ -6,7 +6,7 @@ sidebar_label: Extension Points description: Extension points of backend plugins --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** While plugins are able to use static configuration for lightweight forms of customization, you can quickly hit a limit where you need something more powerful to allow users to extend your plugin. For this purpose, the backend system provides a mechanism for plugins to provide extension points, which can be used to expose deeper customizations for your plugin. Extension points are used by modules, which are installed in the backend adjacent to plugins. Modules are covered more in-depth in the [next section](./06-modules.md). diff --git a/docs/backend-system/architecture/06-modules.md b/docs/backend-system/architecture/06-modules.md index ec0acef175..e916e4fdf6 100644 --- a/docs/backend-system/architecture/06-modules.md +++ b/docs/backend-system/architecture/06-modules.md @@ -6,7 +6,7 @@ sidebar_label: Modules description: Modules for backend plugins --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** Backend modules are used to extend [plugins](./04-plugins.md) or sometimes other modules with additional features or change existing behavior. They must always be installed in the same backend instance as the plugin that they extend, and may only extend a single plugin. Modules interact with their target plugin using the [extension points](./05-extension-points.md) registered by the plugin, while also being able to depend on the [services](./03-services.md) of that plugin. diff --git a/docs/backend-system/architecture/07-naming-patterns.md b/docs/backend-system/architecture/07-naming-patterns.md index b541cc09ba..3e57fa6863 100644 --- a/docs/backend-system/architecture/07-naming-patterns.md +++ b/docs/backend-system/architecture/07-naming-patterns.md @@ -6,7 +6,7 @@ sidebar_label: Naming Patterns description: Naming patterns in the backend system --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** These are the naming patterns to adhere to within the backend system. They help us keep exports consistent across packages and make it easier to understand the usage and intent of exports. diff --git a/docs/backend-system/building-backends/01-index.md b/docs/backend-system/building-backends/01-index.md index 7d222009b9..7d331b4ec3 100644 --- a/docs/backend-system/building-backends/01-index.md +++ b/docs/backend-system/building-backends/01-index.md @@ -6,7 +6,7 @@ sidebar_label: Overview description: Building backends using the new backend system --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** > NOTE: If you have an existing backend that is not yet using the new backend > system, see [migrating](./08-migrating.md). diff --git a/docs/backend-system/building-backends/08-migrating.md b/docs/backend-system/building-backends/08-migrating.md index e4a37bb17d..1a380421c1 100644 --- a/docs/backend-system/building-backends/08-migrating.md +++ b/docs/backend-system/building-backends/08-migrating.md @@ -6,7 +6,7 @@ sidebar_label: Migration Guide description: How to migrate existing backends to the new backend system --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. As such, it is not considered stable, and it is not recommended to migrate production backends to the new backend system until it has a stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** ## Overview @@ -212,8 +212,7 @@ place it in the legacy plugin environment. ## Cleaning Up the Plugins Folder -For plugins that are private and your own, you can follow a [dedicated migration -guide](../building-plugins-and-modules/08-migrating.md) as you see fit, at a +For plugins that are private and your own, you can follow a [dedicated migration guide](../building-plugins-and-modules/08-migrating.md) as you see fit, at a later time. For third party backend plugins, in particular the larger core plugins that are diff --git a/docs/backend-system/building-plugins-and-modules/01-index.md b/docs/backend-system/building-plugins-and-modules/01-index.md index cb9157cd14..fed074b258 100644 --- a/docs/backend-system/building-plugins-and-modules/01-index.md +++ b/docs/backend-system/building-plugins-and-modules/01-index.md @@ -6,7 +6,7 @@ sidebar_label: Overview description: Building backend plugins and modules using the new backend system --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** > NOTE: If you have an existing backend and/or backend plugins that are not yet > using the new backend system, see [migrating](./08-migrating.md). diff --git a/docs/backend-system/building-plugins-and-modules/02-testing.md b/docs/backend-system/building-plugins-and-modules/02-testing.md index 7d2b6e019d..d14f7de09c 100644 --- a/docs/backend-system/building-plugins-and-modules/02-testing.md +++ b/docs/backend-system/building-plugins-and-modules/02-testing.md @@ -6,7 +6,7 @@ sidebar_label: Testing description: Learn how to test your backend plugins and modules --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** Utilities for testing backend plugins and modules are available in `@backstage/backend-test-utils`. This section describes those facilities. diff --git a/docs/backend-system/building-plugins-and-modules/08-migrating.md b/docs/backend-system/building-plugins-and-modules/08-migrating.md index 1b57ec5310..067ab02b4d 100644 --- a/docs/backend-system/building-plugins-and-modules/08-migrating.md +++ b/docs/backend-system/building-plugins-and-modules/08-migrating.md @@ -6,7 +6,7 @@ sidebar_label: Migration Guide description: How to migrate existing backend plugins to the new backend system --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** Migrating an existing backend plugin to the new backend system is fairly straightforward. The process is similar across the majority of plugins which just return a `Router` that is then wired up in the `index.ts` file of your backend. The primary thing that we need to do is to make sure that the dependencies that are required by the plugin are available, and then registering the router with the HTTP router service. diff --git a/docs/backend-system/core-services/01-index.md b/docs/backend-system/core-services/01-index.md index baed9a2cdc..0163d45108 100644 --- a/docs/backend-system/core-services/01-index.md +++ b/docs/backend-system/core-services/01-index.md @@ -6,7 +6,7 @@ sidebar_label: Overview description: Core backend service APIs --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** The default backend provides several [core services](https://github.com/backstage/backstage/blob/master/packages/backend-plugin-api/src/services/definitions/coreServices.ts) out of the box which includes access to configuration, logging, URL Readers, databases and more. diff --git a/docs/backend-system/index.md b/docs/backend-system/index.md index 87eb008129..5dde66378a 100644 --- a/docs/backend-system/index.md +++ b/docs/backend-system/index.md @@ -6,7 +6,7 @@ sidebar_label: Introduction description: The Backend System --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** +> **NOTE: The new backend system is in alpha, and some plugins do not yet fully implement it.** ## Status diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md index 3bbf06d614..4b29ef8a0e 100644 --- a/docs/deployment/docker.md +++ b/docs/deployment/docker.md @@ -54,7 +54,7 @@ Once the host build is complete, we are ready to build our image. The following `Dockerfile` is included when creating a new app with `@backstage/create-app`: ```Dockerfile -FROM node:16-bullseye-slim +FROM node:18-bookworm-slim # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ @@ -160,7 +160,7 @@ the repo root: ```Dockerfile # Stage 1 - Create yarn install skeleton layer -FROM node:16-bullseye-slim AS packages +FROM node:18-bookworm-slim AS packages WORKDIR /app COPY package.json yarn.lock ./ @@ -173,7 +173,7 @@ COPY plugins plugins RUN find packages \! -name "package.json" -mindepth 2 -maxdepth 2 -exec rm -rf {} \+ # Stage 2 - Install dependencies and build packages -FROM node:16-bullseye-slim AS build +FROM node:18-bookworm-slim AS build # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ @@ -211,7 +211,7 @@ RUN mkdir packages/backend/dist/skeleton packages/backend/dist/bundle \ && tar xzf packages/backend/dist/bundle.tar.gz -C packages/backend/dist/bundle # Stage 3 - Build the actual backend image and install production dependencies -FROM node:16-bullseye-slim +FROM node:18-bookworm-slim # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ diff --git a/docs/dls/design.md b/docs/dls/design.md index 3444ff3ad2..7e2ae90528 100644 --- a/docs/dls/design.md +++ b/docs/dls/design.md @@ -86,7 +86,7 @@ building it up with your help! ### Core Backstage User Experience This is the universal user experience that is shared amongst all Backstage -users. From more concrete aspects like the plugins marketplace to more abstract +users. From more concrete aspects like the plugins directory to more abstract ones like end-to-end workflows on Backstage, we’ll be working with the community to create a core user experience that best serves you and your organization. diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md index 0f2459d6e0..0286b1f580 100644 --- a/docs/features/software-catalog/external-integrations.md +++ b/docs/features/software-catalog/external-integrations.md @@ -66,10 +66,14 @@ have to supply a (unique) name, and accept a connection from the environment through which you can issue writes. The rest is up to the individual provider implementation. -It is up to you where you put the code for this new processor class. For quick +It is up to you where you put the code for this new provider class. For quick experimentation you could place it in your backend package, but we recommend -putting all extensions like this in a backend plugin package of their own in the -`plugins` folder of your Backstage repo. +putting all extensions like this in a backend module package of their own in the +`plugins` folder of your Backstage repo: + +```sh +yarn new --select backend-module --option id=catalog +``` The class will have this basic structure: @@ -495,8 +499,12 @@ subclass that can be added to this catalog builder. It is up to you where you put the code for this new processor class. For quick experimentation you could place it in your backend package, but we recommend -putting all extensions like this in a backend plugin package of their own in the -`plugins` folder of your Backstage repo. +putting all extensions like this in a backend module package of their own in the +`plugins` folder of your Backstage repo: + +```sh +yarn new --select backend-module --option id=catalog +``` The class will have this basic structure: diff --git a/docs/features/techdocs/configuring-ci-cd.md b/docs/features/techdocs/configuring-ci-cd.md index 692128bf7b..20a73798a4 100644 --- a/docs/features/techdocs/configuring-ci-cd.md +++ b/docs/features/techdocs/configuring-ci-cd.md @@ -29,7 +29,7 @@ cd repo # Install @techdocs/cli, mkdocs and mkdocs plugins npm install -g @techdocs/cli -pip install mkdocs-techdocs-core==1.* +pip install "mkdocs-techdocs-core==1.*" # Generate techdocs-cli generate --no-docker diff --git a/docs/features/techdocs/getting-started.md b/docs/features/techdocs/getting-started.md index 0ff5903a85..f798384697 100644 --- a/docs/features/techdocs/getting-started.md +++ b/docs/features/techdocs/getting-started.md @@ -263,22 +263,42 @@ Setting `generator.runIn` to `local` means you will have to make sure your environment is compatible with techdocs. You will have to install the `mkdocs` and `mkdocs-techdocs-core` package from -pip, as well as `graphviz` and `plantuml` from your OS package manager (e.g. +pip, optionally also `graphviz` and `plantuml` from your OS package manager (e.g. apt). You can do so by including the following lines right above `USER node` of your `Dockerfile`: ```Dockerfile -RUN apt-get update && apt-get install -y python3 python3-pip -RUN pip3 install mkdocs-techdocs-core==1.1.7 +RUN apt-get update && apt-get install -y python3 python3-pip python3-venv + +ENV VIRTUAL_ENV=/opt/venv +RUN python3 -m venv $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +RUN pip3 install mkdocs-techdocs-core ``` Please be aware that the version requirement could change, you need to check our [`Dockerfile`](https://github.com/backstage/techdocs-container/blob/main/Dockerfile) and make sure to match with it. -Note: We recommend Python version 3.7 or higher. +On a Debian-based Docker container, Python packages must be either installed using +the OS package manager or within a virtual environment (see the +[related PEP](https://peps.python.org/pep-0668/)). Alternative is to use e.g. +[pipx](https://pypa.github.io/pipx/) for installing Python packages in an isolated +environment. + +The above Dockerfile snippet installs the latest `mkdocs-techdoc-core` package. +Version numbers can be found in the corresponding +[changelog](https://github.com/backstage/mkdocs-techdocs-core#changelog). In +case you want to pin the version, use the example below: + +```Dockerfile +RUN pip3 install mkdocs-techdocs-core==1.2.3 +``` + +Note: We recommend Python version 3.11 or higher. > Caveat: Please install the `mkdocs-techdocs-core` package after all other > Python packages. The order is important to make sure we get correct version of diff --git a/docs/features/techdocs/how-to-guides.md b/docs/features/techdocs/how-to-guides.md index c64018ab97..8c98ec48d4 100644 --- a/docs/features/techdocs/how-to-guides.md +++ b/docs/features/techdocs/how-to-guides.md @@ -676,6 +676,35 @@ and publish the documentation for them. If the value of the `company.com/techdoc annotation is anything other than `'local'`, the user is responsible for publishing documentation to the appropriate location in the TechDocs external storage. +## How to use other mkdocs plugins? + +The default plugin [mkdocs-techdocs-core](https://github.com/backstage/mkdocs-techdocs-core) provides a set of plugins that can be viewed as the minimum required plugins to enable TechDocs. Your organization might have needs beyond the core set though, here is the recommended way to enable other plugins. + +### Install the plugin + +#### With CI generation + +If you generate the HTML files in CI using `@techdocs/cli`, you need to install the desired mkdocs plugin in the runtime where the cli is being executed. This might be e.g. a docker image or a Jenkins node. Use the `--no-docker` flag with the cli to pick up the plugin you just installed. + +#### With local generation + +Create a new Docker image that extends [spotify/techdocs](https://github.com/backstage/techdocs-container), roughly: + +```Dockerfile +FROM spotify/techdocs: + +pip install +... +``` + +Then publish the image and use it in your config under the `techdocs.generator.dockerImage` [key](https://github.com/backstage/techdocs-container). + +### Specify the plugin in the mkdocs config + +To use the plugin, it has to be listed in the `mkdocs.yaml` file. You can either add the plugin to your applicable files, or specify defaults. + +To make a mkdocs plugin available for all your TechDocs components you can either list it in the `techdocs.generator.mkdocs.defaultPlugins` [config](https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend/config.d.ts#L64C14-L64C14), or use the `--defaultPlugin` [cli option](https://backstage.io/docs/features/techdocs/cli#generate-techdocs-site-from-a-documentation-project) depending on your setup. + ## Reference another components TechDocs In systems where you might have multiple entities for example a System with a Website and an API, when served from a Monorepo you might want to keep the TechDocs in one location in the repository. diff --git a/docs/getting-started/configure-app-with-plugins.md b/docs/getting-started/configure-app-with-plugins.md index 85942a8f0d..b44f7877a7 100644 --- a/docs/getting-started/configure-app-with-plugins.md +++ b/docs/getting-started/configure-app-with-plugins.md @@ -5,7 +5,7 @@ description: Documentation on How Configuring App with plugins --- Backstage plugins customize the app for your needs. There is a -[plugin marketplace](https://backstage.io/plugins) with plugins for many common +[plugin directory](https://backstage.io/plugins) with plugins for many common infrastructure needs - CI/CD, monitoring, auditing, and more. ## Adding existing plugins to your app diff --git a/docs/getting-started/project-structure.md b/docs/getting-started/project-structure.md index 7873613a7b..16f20a66ca 100644 --- a/docs/getting-started/project-structure.md +++ b/docs/getting-started/project-structure.md @@ -186,7 +186,7 @@ a dash-suffix. `-backend` means it’s a backend plugin and so on. One reason for splitting a plugin is because of its dependencies. Another reason is for clear separation of concerns. -Take a look at our [Plugin Marketplace](https://backstage.io/plugins) or browse +Take a look at our [Plugin Directory](https://backstage.io/plugins) or browse through the [`plugins/`](https://github.com/backstage/backstage/tree/master/plugins) folder. diff --git a/docs/local-dev/cli-build-system.md b/docs/local-dev/cli-build-system.md index b22b6dd284..06aec945b9 100644 --- a/docs/local-dev/cli-build-system.md +++ b/docs/local-dev/cli-build-system.md @@ -418,7 +418,7 @@ The following is an example of a `Dockerfile` that can be used to package the output of building a package with role `'backend'` into an image: ```Dockerfile -FROM node:16-bullseye-slim +FROM node:18-bookworm-slim WORKDIR /app COPY yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./ diff --git a/docs/plugins/add-to-marketplace.md b/docs/plugins/add-to-directory.md similarity index 72% rename from docs/plugins/add-to-marketplace.md rename to docs/plugins/add-to-directory.md index e4281d9b3c..dfa43c2ed7 100644 --- a/docs/plugins/add-to-marketplace.md +++ b/docs/plugins/add-to-directory.md @@ -1,12 +1,12 @@ --- -id: add-to-marketplace -title: Add to Marketplace -description: Documentation on Adding Plugin to Marketplace +id: add-to-directory +title: Add to Directory +description: Documentation on Adding Plugin to Plugin Directory --- -## Adding a Plugin to the Marketplace +## Adding a Plugin to the Directory -To add a new plugin to the [plugin marketplace](https://backstage.io/plugins) +To add a new plugin to the [plugin directory](https://backstage.io/plugins) create a file in [`microsite/data/plugins`](https://github.com/backstage/backstage/tree/master/microsite/data/plugins) with your plugin's information. Example: @@ -23,5 +23,5 @@ iconUrl: # Used as the src attribute for your logo. # You can provide an external url or add your logo under static/img and provide a path # relative to static/ e.g. img/my-logo.png npmPackageName: # Your npm package name E.g. '@backstage/plugin-' quotes are required -addedDate: # The date plugin added to marketplace E.g. '2022-10-01' quotes are required +addedDate: # The date plugin added to directory E.g. '2022-10-01' quotes are required ``` diff --git a/docs/plugins/customization.md b/docs/plugins/customization.md deleted file mode 100644 index 44ca5147ea..0000000000 --- a/docs/plugins/customization.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -id: customization -title: Customization (Experimental) -description: Documentation on adding a customization logic to the plugin ---- - -## Overview - -The Backstage core logic provides a possibility to make the component customizable in such a way that the application -developer can redefine the labels, icons, elements or even completely replace the component. It's up to each plugin -to decide what can be customized. - -## For a plugin developer - -When you are creating your plugin, you have a possibility to use a metadata field and define there all -customizable elements. For example - -```typescript jsx -const plugin = createPlugin({ - id: 'my-plugin', - __experimentalConfigure( - options?: CatalogInputPluginOptions, - ): CatalogPluginOptions { - const defaultOptions = { - createButtonTitle: 'Create', - }; - return { ...defaultOptions, ...options }; - }, -}); -``` - -And the rendering part of the exposed component can retrieve that metadata as: - -```typescript jsx -export type CatalogPluginOptions = { - createButtonTitle: string; -}; - -export type CatalogInputPluginOptions = { - createButtonTitle: string; -}; - -export const useCatalogPluginOptions = () => - usePluginOptions(); - -export function DefaultMyPluginWelcomePage() { - const { createButtonTitle } = useCatalogPluginOptions(); - - return ( -
- -
- ); -} -``` - -## For an application developer using the plugin - -The way to reconfigure the default values provided by the plugin you can do it via reconfigure method, defined on the -plugin. Example: - -```typescript jsx -import { myPlugin } from '@backstage/my-plugin'; - -myPlugin.__experimentalReconfigure({ - createButtonTitle: 'New', -}); -``` diff --git a/docs/plugins/existing-plugins.md b/docs/plugins/existing-plugins.md index 3c1ccb6438..181650adc1 100644 --- a/docs/plugins/existing-plugins.md +++ b/docs/plugins/existing-plugins.md @@ -4,7 +4,7 @@ title: Existing plugins description: Lists of existing open source plugins --- -## The Plugin Marketplace +## The Plugin Directory Open source plugins that you can add to your Backstage deployment can be found at: @@ -15,4 +15,4 @@ https://backstage.io/plugins ## Links -- [[blog] The Plugin Marketplace is open](https://backstage.io/blog/2020/09/30/plugin-marketplace) +- [[blog] The Plugin Directory is open](https://backstage.io/blog/2020/09/30/plugin-marketplace) diff --git a/docs/plugins/internationalization.md b/docs/plugins/internationalization.md index 9f816ea52b..78b7de6342 100644 --- a/docs/plugins/internationalization.md +++ b/docs/plugins/internationalization.md @@ -30,7 +30,7 @@ And the using this messages in your components like: ```tsx import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; -const { t } = useTranslationRef(userSettingsTranslationRef); +const { t } = useTranslationRef(myPluginTranslationRef); return ( diff --git a/docs/plugins/new-backend-system.md b/docs/plugins/new-backend-system.md index 0023584d0d..be27e9427d 100644 --- a/docs/plugins/new-backend-system.md +++ b/docs/plugins/new-backend-system.md @@ -1,14 +1,12 @@ --- id: new-backend-system title: New Backend System -description: Details of the upcoming backend system +description: Details of the new backend system --- -> **DISCLAIMER: The new backend system is in alpha, and still under active development. While we have reviewed the interfaces carefully, they may still be iterated on before the stable release.** - ## Status -The new backend system is in alpha, and only a small number of plugins have been migrated so far. It is possible to try it out, but it is not recommended to use this new system in production yet. +The new backend system is in alpha, and some plugins do not yet fully implement it. But do feel free to try it out! We would love to hear back about your impressions. You can find an example backend setup in [the backend-next package](https://github.com/backstage/backstage/tree/master/packages/backend-next). diff --git a/docs/plugins/plugin-development.md b/docs/plugins/plugin-development.md index 100f9012be..8d8db8c387 100644 --- a/docs/plugins/plugin-development.md +++ b/docs/plugins/plugin-development.md @@ -79,5 +79,5 @@ This extension can then be imported and used in the app as follow, typically placed within the top-level ``: ```tsx -} /> +} /> ``` diff --git a/docs/publishing.md b/docs/publishing.md index be94406a40..2424bc1352 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -15,13 +15,14 @@ PR is merged. This is typically done every Tuesday around noon CET. ## Next Line Release Process -- PR Checks: Ensure there are no outstanding PRs pending to be merged for this version. If there are any, reach out to maintainers and relevant owners of the affected code reminding them of the deadline for the release. -- [optional] Lock main branch - - Lock the main branch to prevent any new merges. +- PR Checks: Notify the teams & ensure there are no outstanding PRs pending to be merged for this version. This should be done in time to ensure a smooth release day. If there are any, reach out to maintainers and relevant owners of the affected code reminding them of the deadline for the release. +- Lock main branch + - Lock the main branch to prevent any new merges by other maintainers. Do not unlock the main branch until the release was published successfully + - Core maintainers can still merge last PRs using their admin override including the Version Packages PR - Note: Admin rights are required to lock the branch. If you lack the necessary permissions, contact a core maintainer to perform this action on your behalf. - Check [`Version Packages (next)` Pull Request](https://github.com/backstage/backstage/pulls?q=is%3Aopen+is%3Apr+in%3Atitle+%22Version+Packages+%28next%29%22) - Verify the version we are shipping is correct, by looking at the version packages PR title. It should be "Version Packages (next)" - - Check [`.changeset/pre.json`](https://github.com/backstage/backstage/blob/master/.changeset/pre.json) if the `mode` is set to `pre`. If you encounter `mode: "exit"` or if it's not defined, it indicates a mainline release. + - Check `pre.json` in [the `.changeset` folder](https://github.com/backstage/backstage/blob/master/.changeset) - it should have `"mode": "pre"` near the top. If you encounter `"mode": "exit"` or if the file doesn't exist, it indicates a mainline release. - Verify that there are no active/unfinished `sync_version-packages` actions running (https://github.com/backstage/backstage/actions/workflows/sync_version-packages.yml) - Locking the main branch will prevent new ones to be created, but be sure to check for running actions again after unlocking, since it may cause pending auto-merge PRs to be merged. - Check [`Version Packages (next)` Pull Request](https://github.com/backstage/backstage/pulls?q=is%3Aopen+is%3Apr+in%3Atitle+%22Version+Packages+%28next%29%22) for sufficient approval to be merged @@ -32,7 +33,28 @@ PR is merged. This is typically done every Tuesday around noon CET. Merging the `Version Packages (next)` Pull Request will trigger the deployment workflows. Follow along the [deployment workflow](https://github.com/backstage/backstage/actions/workflows/deploy_packages.yml). If you notice flakiness (e.g. if the build is flaky or if the release step runs into an error with releasing to npm) just restart the workflow. -Congratulations on the release! There should be now a post in the [`#announcements` channel](https://discord.com/channels/687207715902193673/705123584468582400) in Discord linking to the release tag - check if links & tag look as expected. Finally unlock the main branch again. Merging PRs in master directly after release should be done with caution as it potential complicates fixing issues introduced in the release. +Congratulations on the release! There should be now a post in the [`#announcements` channel](https://discord.com/channels/687207715902193673/705123584468582400) in Discord linking to the release tag - check if links & tag look as expected. Once the notification has gone out on Discord you can unlock the main branch & the release is complete. + +## Main Line Release Process + +Additional steps for the main line release + +- [Switch Release Mode](#switching-release-modes) to exit pre-release mode. This can be done at any time after the last Next Line Release. + - Check [`.changeset/pre.json`](https://github.com/backstage/backstage/blob/master/.changeset/pre.json) if the `mode` is set to `exit`. If you encounter `mode: "pre"` it indicates a next line release. +- Check [`Version Packages` Pull Request](https://github.com/backstage/backstage/pulls?q=is%3Aopen+is%3Apr+in%3Atitle+%22Version+Packages) + - Check for mentions of "major" & "breaking" and if they are expected in the current release + - Verify the version we are shipping is correct +- Create Release Notes + - There exists a [release notes template](./release-notes-template.md) for creating the release notes. It can already be created after the last main line release to keep track of major changes during the month + - The content is picked by relevancy showcasing the work of the community during the month of the release + - Mention newly added packages or features + - Mention any security fixes +- Create Release Notes PR + - Add the release note file as [`/docs/releases/vx.y.0.md`](./releases) + - Add an entry to [`/microsite/sidebar.json`](https://github.com/backstage/backstage/blob/master/microsite/sidebars.json) for the release note + - Update the navigation bar item in [`/microsite/docusaurus.config.js`](https://github.com/backstage/backstage/blob/master/microsite/docusaurus.config.js) to point to the new release note + +Once the release has been published edit the newly created release in the [GitHub repository](https://github.com/backstage/backstage/releases) and replace the text content with the release notes. ## Switching Release Modes diff --git a/docs/release-notes-template.md b/docs/release-notes-template.md new file mode 100644 index 0000000000..9f9a0b76ee --- /dev/null +++ b/docs/release-notes-template.md @@ -0,0 +1,40 @@ +--- +id: v1.1.0 +title: v1.1.0 +description: Backstage Release v1.1.0 +--- + +These are the release notes for the v1.1.0 release of [Backstage](https://backstage.io/). + +A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done. + +## Highlights + +### + +<short description>. Contributed by [@<user>](https://github.com/<user>) [#<pr>](https://github.com/backstage/backstage/pull/<pr>) + +## Security Fixes + +This release does not contain any security fixes. + +<or> + +@backstage/<package-name>, please upgrade to the latest version if you are using this module. + +## Upgrade path + +We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated). + +## Links and References + +Below you can find a list of links and references to help you learn about and start using this new release. + +- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/) +- [GitHub repository](https://github.com/backstage/backstage) +- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy) +- [Community Discord](https://discord.gg/backstage-687207715902193673) for discussions and support +- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.1.0-changelog.md) +- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) + +Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.18.0-changelog.md b/docs/releases/v1.18.0-changelog.md new file mode 100644 index 0000000000..aa06a6e8cd --- /dev/null +++ b/docs/releases/v1.18.0-changelog.md @@ -0,0 +1,4483 @@ +# Release v1.18.0 + +## @backstage/config@1.1.0 + +### Minor Changes + +- 62f448edb0b5: Added a `readDurationFromConfig` function + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/config-loader@1.5.0 + +### Minor Changes + +- 9606ba0939e6: Deep visibility now also applies to values that are not covered by the configuration schema. + + For example, given the following configuration schema: + + ```ts + // plugins/a/config.schema.ts + export interface Config { + /** @deepVisibility frontend */ + a?: unknown; + } + + // plugins/a/config.schema.ts + export interface Config { + a?: { + b?: string; + }; + } + ``` + + All values under `a` are now visible to the frontend, while previously only `a` and `a/b` would've been visible. + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- f9657b891b00: Do not unnecessarily notify subscribers when no-op updates to config happen +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/cli-common@0.1.12 + +## @backstage/core-app-api@1.10.0 + +### Minor Changes + +- 18619f793c94: Fixed two bugs in how the `OAuth2Session` type represents the underlying data. The `expiresAt` and `backstageIdentity` are now both optional, since that's what they are in practice. This is not considered a breaking change since it was effectively a bug in the modelling of the state that this type represents, and the type was not used in any other external contract. +- 18619f793c94: The `OAuth` class which is used by all OAuth providers will now consider both the session expiration of both the Backstage identity as well as the upstream identity provider, and refresh the session with either of them is about to expire. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9fe827b380e1: Internal refactor +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/core-plugin-api@1.6.0 + +### Minor Changes + +- 18619f793c94: Added the optional `expiresAt` field that may now be part of a `BackstageIdentityResponse`. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/frontend-app-api@0.1.0 + +### Minor Changes + +- 628ca7e458e4: Initial release + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-graphiql@0.2.54 + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + +## @backstage/frontend-plugin-api@0.1.0 + +### Minor Changes + +- 628ca7e458e4: Initial release + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + +## @backstage/integration@1.7.0 + +### Minor Changes + +- 5f1a92b9f19f: Added `AzureDevOpsCredentialsProvider` to support multiple Azure DevOps organizations and **deprecated** `AzureIntegrationConfig.credential` and `AzureIntegrationConfig.token` in favour of `AzureIntegrationConfig.credentials`. You can now use specific credentials for different Azure DevOps (Server) organizations by specifying the `organizations` field on a credential: + + ```yaml + integrations: + azure: + - host: dev.azure.com + credentials: + - organizations: + - my-org + - my-other-org + clientId: ${AZURE_CLIENT_ID} + clientSecret: ${AZURE_CLIENT_SECRET} + tenantId: ${AZURE_TENANT_ID} + - organizations: + - yet-another-org + personalAccessToken: ${PERSONAL_ACCESS_TOKEN} + ``` + + See the [Azure integration documentation](https://backstage.io/docs/integrations/azure/locations) for more information. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 2d2fc9d20ebb: Additional fix for Gitiles auth links +- cb2e19d82d95: Gitiles: Fixed auth prefix issue +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @techdocs/cli@1.5.0 + +### Minor Changes + +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-techdocs-node@1.8.0 + - @backstage/cli-common@0.1.12 + +## @backstage/plugin-adr-backend@0.4.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-adr-common@0.2.15 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-airbrake-backend@0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend@0.19.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 080cc7794700: Migrated the GitLab auth provider to be implemented using the new `@backstage/plugin-auth-backend-module-gitlab-provider` module. +- 7944d43f4790: Added `authPlugin` export for the new backend system. The plugin does not include any built-in auth providers, they must instead be added by installing additional modules, for example `authModuleGoogleProvider` from `@backstage/plugin-auth-backend-module-google-provider`. +- 8513cd7d00e3: Deprecated several exports that are now available from `@backstage/plugin-auth-node` instead. +- 7944d43f4790: Added the ability to disable the built-in auth providers by passing `disableDefaultProviderFactories` to `createRouter`. +- 7944d43f4790: The algorithm used when generating Backstage tokens can be configured via `auth.identityTokenAlgorithm`. +- Updated dependencies + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.0 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.0 + - @backstage/plugin-auth-backend-module-google-provider@0.1.0 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.0 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a GCP IAP auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend-module-github-provider@0.1.0 + +### Minor Changes + +- 23af27f5ce79: New module for `@backstage/plugin-auth-backend` that adds a GitHub auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.1.0 + +### Minor Changes + +- 080cc7794700: New module for `@backstage/plugin-auth-backend` that adds a GitLab auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend-module-google-provider@0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a Google auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.1.0 + +### Minor Changes + +- 101cf1d13b04: New module for `@backstage/plugin-auth-backend` that adds a `oauth2` auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-auth-node@0.3.0 + +### Minor Changes + +- 8513cd7d00e3: Introduced a new system for building auth providers for `@backstage/plugin-auth-backend`, which both increases the amount of code re-use across providers, and also works better with the new backend system. + + Many existing types have been moved from `@backstage/plugin-auth-backend` in order to avoid a direct dependency on the plugin from modules. + + Auth provider integrations are now primarily implemented through a pattern of creating "authenticators", which are in turn specific to each kind of integrations. Initially there are two types: `createOAuthAuthenticator` and `createProxyAuthenticator`. These come paired with functions that let you create the corresponding route handlers, `createOAuthRouteHandlers` and `createProxyAuthRouteHandlers`, as well as provider factories, `createOAuthProviderFactory` and `createProxyAuthProviderFactory`. This new authenticator pattern allows the sign-in logic to be separated from the auth integration logic, allowing it to be completely re-used across all providers of the same kind. + + The new provider factories also implement a new declarative way to configure sign-in resolvers, rather than configuration through code. Sign-in resolvers can now be configured through the `resolvers` configuration key, where the first resolver that provides an identity will be used, for example: + + ```yaml + auth: + providers: + google: + development: + clientId: ... + clientSecret: ... + signIn: + resolvers: + - resolver: emailMatchingUserEntityAnnotation + - resolver: emailLocalPartMatchingUserEntityName + ``` + + These configurable resolvers are created with a new `createSignInResolverFactory` function, which creates a sign-in resolver factory, optionally with an options schema that will be used both when configuring the sign-in resolver through configuration and code. + + The internal helpers from `@backstage/plugin-auth-backend` that were used to implement auth providers using passport strategies have now also been made available as public API, through `PassportHelpers` and `PassportOAuthAuthenticatorHelper`. + +### Patch Changes + +- 18619f793c94: The `BackstageIdentityResponse` interface now has an optional `expiresInSeconds` field that can be used to signal session expiration. The `prepareBackstageIdentityResponse` utility will now also read the expiration from the provided token, and include it in the response. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-azure-devops-backend@0.4.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-devops-common@0.3.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-badges-backend@0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-bazaar-backend@0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-catalog@1.13.0 + +### Minor Changes + +- e44f45ac4515: This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. + +### Patch Changes + +- 832eef72485b: Added title to props for `Has<kind>Cards`. +- 163a41035e42: Fixed an issue where `EntitySwitch` was preventing the display of entity errors. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-backend@1.13.0 + +### Minor Changes + +- 62f448edb0b5: Allow configuring the processing interval in your app-config, under the `catalog.processingInterval` key. +- 09cfc3cf467d: set azure annotation `dev.azure.com/project-repo` in `AnnotateScmSlugEntityProcessor` to find the project and repo information for the repos that contains `dev.azure.com` in the url + +### Patch Changes + +- 149361e81622: Fix to the `limit` parameter on entity queries. + +- 1fd2109739c1: Changed the processing loop task pipeline implementation from recursive to iterative + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 0f8a97777489: Update OpenAPI schema to relax the encoding validation of all request parameters. + +- 0198aa596fd9: Fixed a link to the frontend Backstage plugin that had pointed to itself. + +- 2d32d8a611e3: Fixed validation of the `fullTextFilterFields` query parameter. + +- acffa17027b6: Added some examples to the catalog OpenAPI definition + +- 45947d3b2759: Fixes an issue where `order` was not a recognized parameter for the `/entities` endpoint. + +- 41d1b2d628ea: Fix OpenAPI schema for the facets endpoint + +- 618257f3e413: Fix issue with `catalogFileName` not being a required property for `/analyze-location` + +- cfc3ca6ce060: Changes needed to support MySQL + +- 814feeed7343: Update to handle invalid luxon values + +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-catalog-backend-module-github@0.4.0 + +### Minor Changes + +- fa7004d9722c: Added a `catalogModuleGithubOrgEntityProvider` for the new backend system + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 3d63e60f3c36: Internal restructure to avoid circular imports + +- 96353bb7cb4a: Properly support custom `userTransformer` returning `undefined` in `GithubMultiOrgEntityProvider` + +- 3c44761b9191: Allow github user and team transforms to return any Entity + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-catalog-backend-module-gitlab@0.3.0 + +### Minor Changes + +- 3d73bafd85c9: Fix Gitlab.com user ingestion by scoping GitlabOrgDiscoveryEntityProvider to a group. + + **BREAKING** The `group` parameter is now required Gitlab.com Org Data integrations and the backend will fail to start without this option configured. + + ```diff + catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true + + group: org/teams + ``` + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + +### Minor Changes + +- d5313ede3529: Added a dedicated module to collect the `ScaffolderEntitiesProcessor` and `catalogModuleTemplateKind`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/catalog-model@1.4.2 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-catalog-import@0.10.0 + +### Minor Changes + +- c3c1fd3a1765: Slight change to the `PreparePullRequestFormProps`, because of an update to `react-hook-form`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + +## @backstage/plugin-devtools-backend@0.2.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + +## @backstage/plugin-entity-feedback-backend@0.2.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 740155e8e976: Improve backend logging if method calls fail +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-entity-feedback-common@0.1.3 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-kafka-backend@0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-kubernetes-backend@0.12.0 + +### Minor Changes + +- 0ad36158d980: Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. + + **BREAKING** on the slight chance you were using the `setAuthTranslatorMap` method on `KubernetesBuilder`, it has been removed along with the entire `KubernetesAuthTranslator` interface. This notion has been replaced with the more focused concept of an `AuthenticationStrategy`. Converting a translator to a strategy should not be especially difficult. + +### Patch Changes + +- ccf00accb408: Add AWS Annotations to Kubernetes Cluster Resource + +- 72390ab2670d: Handle Proxy WS upgrade manually for WS handshakes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 024b2b66a332: Fixed a bug where requests to the proxy endpoint would fail for clusters with `caFile` configured + +- a8a614ba0d07: Minor `package.json` update. + +- 47ea122590f5: fix "undefined" kind for custom resources + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/integration-aws-node@0.1.6 + +## @backstage/plugin-lighthouse-backend@0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-lighthouse-common@0.1.3 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-linguist-backend@0.5.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- b2de501bda31: When creating the router using `createRouterFromConfig` or using the plugin for the new backend system the `linguist.useSourceLocation` configuration is now optional. +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-opencost@0.2.0 + +### Minor Changes + +- 1380a689ab56: New OpenCost plugin provides an port of the latest OpenCost UI to Backstage with updated dependencies. The plugin's README covers installation and configuration + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-periskop-backend@0.2.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 + +### Minor Changes + +- 5f7b2153526b: Created package with policy `permissionModuleAllowAllPolicy` + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-proxy-backend@0.4.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 02ba0a2efd2a: Add the route name to an error message that appears when the backend + proxy wasn't well configured. This will help users to understand the + issue and fix the right configuration. +- 03691f0f3270: Add back the legacy proxy config, to get secret redaction +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-scaffolder@1.15.0 + +### Minor Changes + +- 0119c326394a: adding a .zip download to dry run results page, including zip.js as dependency + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6e69c11a3535: Restored functionality to `OwnedEntityPicker` by converting deprecated `ui:options` input to `catalogFilter`. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-backend@1.17.0 + +### Minor Changes + +- b5f239b50bcf: Improved the `parseEntityRef` Scaffolder filter by introducing the ability for users to provide default kind and/or namespace values. The filter now takes + 2 arguments, similarly to the original [parseEntityRef](https://github.com/backstage/backstage/blob/v1.17.2/packages/catalog-model/src/entity/ref.ts#L77). +- d5313ede3529: **DEPRECATION**: Deprecated `ScaffolderEntitiesProcessor`, which should now instead be imported from `@backstage/plugin-catalog-backend-module-scaffolder-entity-model`. + + `catalogModuleTemplateKind` was also moved to that package and renamed to `catalogModuleScaffolderEntityModel`, without any deprecation since it was an alpha export. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- a4989552d828: Add examples for `publish:github` and `publish:gitlab` scaffolder actions. + +- ded27b83ead2: Add examples for `publish:bitbucket` scaffolder actions. + +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. + +- fb57a4694fc6: Fixed the plugin and module ID of the alpha `catalogModuleTemplateKind` export. + +- f3c0b95e3ef1: Add examples for `github:actions:dispatch` scaffolder actions. + +- cfc3ca6ce060: Changes needed to support MySQL + +- 814feeed7343: Update to handle invalid luxon values + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-search@1.4.0 + +### Minor Changes + +- b78f570f44d3: The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: + + ```yaml + search: + query: + pageLimit: 50 + ``` + + Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-search-react@1.7.0 + +### Minor Changes + +- b78f570f44d3: The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: + + ```yaml + search: + query: + pageLimit: 50 + ``` + + Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 45f8a95e1068: Optionally initializes the search context with default settings for search queries only when the config is defined, rather than always overriding it. +- 3d63e60f3c36: Internal restructure to avoid circular imports +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-techdocs@1.7.0 + +### Minor Changes + +- e44f45ac4515: This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. + +### Patch Changes + +- 88c9525a36f3: Fixed bug in styles that caused next and previous links in footer to overlap page content. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-backend@1.7.0 + +### Minor Changes + +- 5985d458ee30: Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- 60af8017dd84: Expand techdocs.publisher.type with `googleGcs`,`awsS3`,`azureBlobStorage` and `openStackSwift` + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- a8a614ba0d07: Minor `package.json` update. + +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-techdocs-node@1.8.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + +### Minor Changes + +- 86c19906fe4b: Enable zoom icon for techdocs images inside lightbox + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-node@1.8.0 + +### Minor Changes + +- 5985d458ee30: Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/integration-aws-node@0.1.6 + +## @backstage/plugin-todo-backend@0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/backend-openapi-utils@0.0.4 + +## @backstage/plugin-user-settings-backend@0.2.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/app-defaults@1.4.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + +## @backstage/backend-app-api@0.5.3 + +### Patch Changes + +- 154632d8753b: Add support for discovering additional service factories during startup. +- 37a20c7f14aa: Adds include and exclude configuration to feature discovery of backend packages + Adds alpha modules to feature discovery +- cb7fc410ed99: The experimental backend feature discovery now only considers default exports from packages. It no longer filters packages to include based on the package role, except that `'cli'` packages are ignored. However, the `"backstage"` field is still required in `package.json`. +- 3fc64b9e2f8f: Extension points are now tracked via their ID rather than reference, in order to support package duplication. +- 3b30b179cb38: Add support for installing features as package imports, for example `backend.add(import('my-plugin'))`. +- b219d097b3f4: Backend startup will now fail if any circular service dependencies are detected. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + +## @backstage/backend-common@0.19.5 + +### Patch Changes + +- 6847cd6225d6: Avoid starting database keepalive loop in tests. +- fd3fdd0e3338: The root logger is now initialized lazily, fixing a circular dependency issue with `@backstage/backend-app-api` that would result in `Cannot read properties of undefined (reading 'redacter')`. +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. +- 19a140418cc8: Added retries for initial database creation, as well as set minimum connection pool size for the database creation client to 0 and lowered the connection acquisition timeout. +- 05508a9757d2: Minor internal refactor +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/integration-aws-node@0.1.6 + +## @backstage/backend-defaults@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/backend-openapi-utils@0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.2 + +## @backstage/backend-plugin-api@0.6.3 + +### Patch Changes + +- ba4506076e2d: Ensure that root scoped services cannot accept (at a type level) plugin scoped deps +- 474b792d6a43: Service factory functions are now marked as feature factories that can be installed in the backend. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + +## @backstage/backend-tasks@0.5.8 + +### Patch Changes + +- 8fd91547cd0b: When starting a task that existed before, with a faster schedule than it + previously had, the task will now correctly obey the faster schedule + immediately. Before this fix, the new schedule was only obeyed after the next + pending (according to the old schedule) run had completed. +- 62f448edb0b5: Use `readDurationFromConfig` from the config package +- 74604806aae8: Avoid starting task janitor in tests. +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/backend-test-utils@0.2.3 + +### Patch Changes + +- 58cb5e5cea7b: Introduced a new utility for testing service factories, `ServiceFactoryTester`. +- 202e52c5e361: Add support for installing backend features via module imports, for example `startTestBackend({ features: [import('my-plugin')] })`. +- 9fb3b5373c45: Extended `mockService` to also include mocked variants, for example `mockServices.lifecycle.mock()`. The returned mocked implementation will have a `factory` property which is a service factory for itself. You can also pass a partial implementation of the service to the mock function to use a mock implementation of specific methods. +- eb1594da5812: Serialize test database shutdown, and add logging +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/catalog-client@1.4.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## @backstage/catalog-model@1.4.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/cli@0.22.13 + +### Patch Changes + +- 04eabd21bee4: Added the ability to specify the listen address for the `--inspect` and `--inspect-brk` command. You can now set the `ip` and port of the `inspect` and `inspectBrk` by adding for example `--inspect=0.0.0.0:9229` +- 278d9326eb40: Added the ability to create a plain backend module with the `new` command. +- 4d5eeec52d80: Add ESM loader for the experimental backend start command. +- 3494c502aba7: Added a new `repo fix` command that fixes auto-fixable problems in all packages. Initially the command fixes package export declarations, as well as marks all non-bundled frontend packages as side-effect free. Marking packages as free of side-effects can drastically reduce the Webpack bundle size. +- f36113ca2305: Add experimental support for frontend package discovery. +- a23fce763c6a: Fixed a bug where package exports entry points could not be `.tsx` files. +- 8cec7664e146: Removed `@types/node` dependency +- ea779492ad88: Updated dependency `run-script-webpack-plugin` to `^0.2.0`. +- 4af4defcc114: When running `version:bump` it will now log duplicates instead of throwing an error +- 71d4368ae5cc: Added support for the `dev/index` entry point for backend plugins and modules. +- 956d226eeeee: Add `"sideEffects": false` to `package.json` in frontend package templates. This can be added to existing packages using the new `yarn fix` command. +- cd7331587eb3: Removed the experimental `package fix` command that was used to automatically add dependencies to `package.json`, but has since been replaced by the `no-undeclared-imports` rule from `@backstage/eslint-plugin`. +- 219b46ae1a50: Include default alpha export during package detection +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/release-manifests@0.0.10 + - @backstage/types@1.1.1 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + - @backstage/eslint-plugin@0.1.3 + +## @backstage/cli-node@0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/cli-common@0.1.12 + +## @backstage/core-components@0.13.5 + +### Patch Changes + +- 0c9907645aab: Fixed an issue causing `StructuredMetadataTable` to crash in case metadata contained `null` values. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9b74166d11a1: Added `<AutoLogout>` component which introduces an optional automatic logout mechanism on user inactivity +- 117027636b10: Minor internal tweak to handle `classnames` update +- 8cec7664e146: Removed `@types/node` dependency +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- 47782f4bfa5b: Add loading indicator to Table +- 3d63e60f3c36: Internal restructure to avoid circular imports +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/version-bridge@1.0.5 + +## @backstage/create-app@0.5.5 + +### Patch Changes + +- 05508a9757d2: Updated the backend template to no longer create duplicate connection pools to plugins that use the task scheduler. + + To apply this change in your own repository, perform the following small update: + + ```diff + // in packages/backend/src/index.ts + - const taskScheduler = TaskScheduler.fromConfig(config); + + const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); + ``` + +- a4c08241ad92: Switched the template to use TypeScript 5.2 by default. + +- f8c8e8de37b6: Bumped create-app version. + +- fc1a38bc5723: Bumped create-app version. + +- 4606e005df5d: Added a `fix` scripts that calls the new `backstage-cli repo fix` command. + + To apply this change to an existing app, make the following change to your root `package.json`: + + ```diff + "test": "backstage-cli repo test", + "test:all": "backstage-cli repo test --coverage", + + "fix": "backstage-cli repo fix", + "lint": "backstage-cli repo lint --since origin/master", + ``` + +- 612594022245: Add a notification when `yarn install` is taking a long time. + +- 8db70ecbb325: Updated Dockerfile to include `apt-get update` when installing the SQLite dependency + +- 8cec7664e146: Removed `@types/node` dependency + +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.21 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/errors@1.2.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/types@1.1.1 + +## @backstage/integration-aws-node@0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/integration-react@1.1.19 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/release-manifests@0.0.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency + +## @backstage/repo-tools@0.3.4 + +### Patch Changes + +- 0109d3f11159: The `generate-catalog-info` command now uses the first listed `CODEOWNER` as Component owner when initially + creating the `catalog-info.yaml` file. It continues to allow any one listed `CODEOWNER` when updating + entity metadata. +- 6f874cdb04eb: Fixed a bug with the `generate-catalog-info` command that could cause `metadata.description` values to be overwritten by `package.json` description values only because unrelated attributes were being changed. +- ec13d3e86028: Fixed a bug with the `generate-catalog-info` command that could cause the `--dry-run` flag to indicate changes to files when no changes would actually be made if the command were run without the flag. +- db60a16e0a54: Added a `--ci` flag to the `generate-catalog-info` command. This flag behaves similarly to the same flag on `api-reports`: if `catalog-info.yaml` files would have been added or modified, then the process exits with status code `1`, and instructions are printed. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + +## @backstage/test-utils@1.4.3 + +### Patch Changes + +- 7032c214f3b4: Add pod exec terminal to Container Card + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +- 8cec7664e146: Removed `@types/node` dependency + +- b5fbddc15dca: Add a new `MockTranslationApi` as an `/alpha` export. + +- 9ceb6195275a: Add support for React Testing Library 13+, and thus React 18. + + We're exposing an additional option to the `render*` methods to enable the [`legacyRoot`](https://testing-library.com/docs/react-testing-library/api/#legacyroot) flow. + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/theme@0.4.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/types@1.1.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/version-bridge@1.0.5 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-adr@0.6.7 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- aa844e704a32: support for i18n feature +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr-common@0.2.15 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-adr-common@0.2.15 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-airbrake@0.3.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/dev-utils@1.0.21 + - @backstage/theme@0.4.2 + +## @backstage/plugin-allure@0.1.40 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-analytics-module-ga@0.1.33 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-analytics-module-ga4@0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-analytics-module-newrelic-browser@0.0.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-apache-airflow@0.2.15 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-api-docs@0.9.11 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-api-docs-module-protoc-gen-doc@0.1.3 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-apollo-explorer@0.1.15 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-app-backend@0.3.51 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- cfc3ca6ce060: Changes needed to support MySQL + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/plugin-app-node@0.1.3 + +## @backstage/plugin-app-node@0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-azure-devops@0.3.6 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-azure-devops-common@0.3.1 + - @backstage/theme@0.4.2 + +## @backstage/plugin-azure-devops-common@0.3.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-azure-sites@0.1.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-azure-sites-common@0.1.1 + - @backstage/theme@0.4.2 + +## @backstage/plugin-azure-sites-backend@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-sites-common@0.1.1 + +## @backstage/plugin-azure-sites-common@0.1.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-badges@0.2.48 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-bazaar@0.2.16 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-bitbucket-cloud-common@0.2.12 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration@1.7.0 + +## @backstage/plugin-bitrise@0.1.51 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-catalog-backend-module-aws@0.2.6 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/integration-aws-node@0.1.6 + +## @backstage/plugin-catalog-backend-module-azure@0.1.22 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 94f96508491d: Improve consistency of results from the `AzureDevOpsEntityProvider`. + +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. + +- 044b4f2fb1e3: Remove duplications from Azure search before committing the new locations to the catalog. + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.12 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.18 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.12 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.16 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-gcp@0.1.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 201f07c27f1e: Fix GKE endpoint parsing + + Endpoint is an IP, not url. It is always https on default (443) port + ref: <https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1/projects.locations.clusters#Cluster> + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.19 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.4.6 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.10 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.8 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + +## @backstage/plugin-catalog-common@1.0.16 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-catalog-graph@0.2.36 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-graphql@0.3.23 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-node@1.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-catalog-react@1.8.4 + +### Patch Changes + +- bd817209ddd7: Export the `EntityAutocompletePicker` component. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 7029ba1ce0af: Added delete alert popup when user delete the entity +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-catalog-unprocessed-entities@0.1.3 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-cicd-statistics@0.1.26 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.20 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-cicd-statistics@0.1.26 + +## @backstage/plugin-circleci@0.3.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-cloudbuild@0.3.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-code-climate@0.1.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-code-coverage@0.2.17 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 1d8f4f0a7486: Use fetchApi to ensure authorization is used when fetching code-coverage data +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-code-coverage-backend@0.2.17 + +### Patch Changes + +- 3f1367b956c6: Added support for LCOV coverage reports + +- df005d9932fb: Add text body parser for LCOV reports + +- 91ccb56fb418: Replace `express-xml-bodyparser` with `body-parser-xml`. + + `express-xml-bodyparser` was last updated 8 years ago + and currently depends on a version of `xml2js` which + contains a vulnerability. + + This change will swap it out in favor of `body-parser-xml` + which is more maintained and depends on a more recent `xml2js` + version without the vulnerability. + +- 33e606a797ef: Include auth token when fetching entity + +- d409ed988aed: Correct the line hits calculation for Cobertura reports + +- cfc3ca6ce060: Changes needed to support MySQL + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + +## @backstage/plugin-codescene@0.1.17 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-config-schema@0.1.45 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-cost-insights@0.12.13 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- a54cd411639e: Updated dependency `@types/pluralize` to `^0.0.30`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-cost-insights-common@0.1.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-cost-insights-common@0.1.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-devtools@0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-devtools-common@0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + +## @backstage/plugin-dynatrace@7.0.4 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-entity-feedback@0.2.7 + +### Patch Changes + +- 5e2e06db747a: Improve README to note that Backstage identity is required to be configured +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-entity-feedback-common@0.1.3 + - @backstage/theme@0.4.2 + +## @backstage/plugin-entity-feedback-common@0.1.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-entity-validation@0.1.9 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/theme@0.4.2 + +## @backstage/plugin-events-backend@0.2.12 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-aws-sqs@0.2.6 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-azure@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-gerrit@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-github@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-module-gitlab@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-backend-test-utils@0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.12 + +## @backstage/plugin-events-node@0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-explore@0.4.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-explore-react@0.0.31 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-explore-backend@0.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + +## @backstage/plugin-explore-common@0.0.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-explore-react@0.0.31 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-explore-common@0.0.2 + +## @backstage/plugin-firehydrant@0.2.8 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-fossa@0.2.56 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gcalendar@0.3.18 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gcp-projects@0.3.41 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-git-release-manager@0.3.37 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-actions@0.6.5 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-deployments@0.1.55 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-issues@0.2.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-pull-requests-board@0.1.18 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gitops-profiles@0.3.40 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gocd@0.1.30 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-graphiql@0.2.54 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- b2fbeed5403b: Add support for using the FetchApi +- cf950c3b6eab: Added experimental exports for the new frontend system under `/alpha`. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-graphql-backend@0.1.41 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-catalog-graphql@0.3.23 + +## @backstage/plugin-graphql-voyager@0.1.7 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-home@0.5.8 + +### Patch Changes + +- 2bc96ce69eea: Fixed a bug where customizable home page cards would render missing their normal borders. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 98bb77c1f0b8: Align zod dependency to align with other packages. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 1853ffa09b50: Allow specifying static widgets to custom home page +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-home-react@0.1.3 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-ilert@0.2.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-jenkins@0.8.6 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-jenkins-common@0.1.19 + - @backstage/theme@0.4.2 + +## @backstage/plugin-jenkins-backend@0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-jenkins-common@0.1.19 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + +## @backstage/plugin-jenkins-common@0.1.19 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-kafka@0.3.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-kubernetes@0.10.3 + +### Patch Changes + +- 0ad36158d980: Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. +- 7032c214f3b4: Add pod exec terminal to Container Card +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6ddeade58b4c: Avoid eager use of `TextEncoder` in order not to break tests. +- 6a5e04e20e6e: fix logs dialog min height +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-kubernetes-common@0.6.6 + +### Patch Changes + +- 0ad36158d980: Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. +- ccf00accb408: Add AWS Annotations to Kubernetes Cluster Resource +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-lighthouse@0.4.9 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-lighthouse-common@0.1.3 + - @backstage/theme@0.4.2 + +## @backstage/plugin-lighthouse-common@0.1.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + +## @backstage/plugin-linguist@0.1.9 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-linguist-common@0.1.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + +## @backstage/plugin-microsoft-calendar@0.1.7 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-newrelic@0.3.40 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 55cb7061e072: Fixed bug in NewRelicComponent component where table would not sort correctly for numerical values. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-newrelic-dashboard@0.2.17 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-nomad@0.1.5 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-nomad-backend@0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-octopus-deploy@0.2.6 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-org@0.6.14 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 43a2137bb829: Ensure direct relations are shown for User entities while keeping support for aggregating closest parent group ownership +- dd9329caea1c: Entity relations toggle should by default be aggregated for User entities +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-org-react@0.1.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-pagerduty@0.6.5 + +### Patch Changes + +- 3b41afed4d0c: Minor internal tweaks to improve tests +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-periskop@0.1.22 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-permission-backend@0.5.26 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- a8a614ba0d07: Minor `package.json` update. + +- 84ad6fccd4d5: Moved `permissionModuleAllowAllPolicy` to `@backstage/plugin-permission-backend-module-allow-all-policy` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-permission-common@0.7.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-permission-node@0.7.14 + +### Patch Changes + +- a8a614ba0d07: Minor `package.json` update. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-permission-react@0.4.15 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-playlist@0.1.16 + +### Patch Changes + +- 79847cb73ed7: Updated latest playlist screen in readme document +- ec4b0f8cd957: change color of delete icon to secondary in playlist table +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 2f3215bbbffe: Fix a bug that led to errors being thrown in guest mode +- 8cec7664e146: Removed `@types/node` dependency +- b5ba33a92750: Limit the use of the same playlist name when adding a playlist +- 3d63e60f3c36: Internal restructure to avoid circular imports +- fdbf215a8d8e: Fix the Ui style of the search bar +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-playlist-common@0.1.10 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-playlist-backend@0.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-playlist-common@0.1.10 + - @backstage/plugin-permission-node@0.7.14 + +## @backstage/plugin-playlist-common@0.1.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-puppetdb@0.1.7 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-rollbar@0.4.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-rollbar-backend@0.1.48 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.27 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.20 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.24 + +### Patch Changes + +- 4fa1c74cbadc: Enables dry-run functionality for the run:yeoman scaffolder action +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + +## @backstage/plugin-scaffolder-common@1.4.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-node@0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-scaffolder-react@1.5.5 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 27fef07f9229: Updated dependency `use-immer` to `^0.9.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-search-backend@1.4.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-catalog@0.1.7 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-elasticsearch@1.3.6 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/integration-aws-node@0.1.6 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-explore@0.1.7 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-pg@0.5.12 + +### Patch Changes + +- 4ccf9204bc95: Added `indexerBatchSize` option to be able to control the size of the batches being indexed. Also added a debug log entry to list out all the entities in the batch + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-module-techdocs@0.1.7 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-techdocs-node@1.8.0 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/plugin-search-backend-node@1.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + +## @backstage/plugin-search-common@1.2.6 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + +## @backstage/plugin-sentry@0.5.9 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-shortcuts@0.3.14 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-sonarqube@0.7.5 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-sonarqube-react@0.1.8 + - @backstage/theme@0.4.2 + +## @backstage/plugin-sonarqube-backend@0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-sonarqube-react@0.1.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + +## @backstage/plugin-splunk-on-call@0.4.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-stack-overflow@0.1.20 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-stack-overflow-backend@0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-stackstorm@0.1.6 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-tech-insights@0.3.16 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-tech-insights-backend@0.5.17 + +### Patch Changes + +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-node@0.4.9 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35 + +### Patch Changes + +- 51b801f743b2: Handle extracting facts from 'not' conditions too +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/plugin-tech-insights-node@0.4.9 + +## @backstage/plugin-tech-insights-common@0.2.12 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/types@1.1.1 + +## @backstage/plugin-tech-insights-node@0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/types@1.1.1 + +## @backstage/plugin-tech-radar@0.6.8 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- b45d0ac68191: Add names to blip entry links in the radar to improve accessibility +- 80b4d0b34f14: Fixed the width of the tech radar dialog so that the content fits +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6d35e9ea2afa: Add description property for Rings which will be shown in the footer. +- 8cec7664e146: Removed `@types/node` dependency +- c357f62052af: Fixed `RadarTimeline` text formatting. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.21 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-react@1.1.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-todo@0.2.26 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-user-settings@0.7.9 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- ce77b23423cb: conditionally rendering the user email in user profile card +- e03f3ee2be94: changed auto theme tooltip title to camel case +- 8cec7664e146: Removed `@types/node` dependency +- 6e30769cc627: Introduced experimental support for internationalization. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-vault@0.1.18 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 858a18800870: Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-vault-backend@0.3.7 + +### Patch Changes + +- 858a18800870: Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-xcmetrics@0.2.42 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## example-app@0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-nomad@0.1.5 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - @internal/plugin-catalog-customized@0.0.14 + +## example-app-next@0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - app-next-example-plugin@0.0.1 + - @internal/plugin-catalog-customized@0.0.14 + +## app-next-example-plugin@0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + +## example-backend@0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-pg@0.5.12 + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-auth-backend@0.19.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-kafka-backend@0.3.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-events-backend@0.2.12 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.6 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/plugin-code-coverage-backend@0.2.17 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-tech-insights-backend@0.5.17 + - example-app@0.2.87 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-playlist-backend@0.3.7 + - @backstage/plugin-rollbar-backend@0.1.48 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4 + - @backstage/plugin-azure-sites-backend@0.1.13 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-explore-backend@0.0.13 + - @backstage/plugin-graphql-backend@0.1.41 + - @backstage/plugin-jenkins-backend@0.2.6 + - @backstage/plugin-nomad-backend@0.1.5 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.20 + - @backstage/plugin-search-backend-node@1.2.7 + - @backstage/plugin-tech-insights-node@0.4.9 + +## example-backend-next@0.0.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/backend-defaults@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## @backstage/backend-plugin-manager@0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-events-backend@0.2.12 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-scaffolder-node@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## e2e-test@0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.5 + - @backstage/errors@1.2.2 + - @backstage/cli-common@0.1.12 + +## techdocs-cli-embedded-app@0.2.86 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.13 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + +## @internal/plugin-catalog-customized@0.0.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + +## @internal/plugin-todo-list@1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## @internal/plugin-todo-list-backend@1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + +## @internal/plugin-todo-list-common@1.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 diff --git a/docs/releases/v1.18.0.md b/docs/releases/v1.18.0.md new file mode 100644 index 0000000000..cae0301fd5 --- /dev/null +++ b/docs/releases/v1.18.0.md @@ -0,0 +1,133 @@ +--- +id: v1.18.0 +title: v1.18.0 +description: Backstage Release v1.18.0 +--- + +These are the release notes for the v1.18.0 release of [Backstage](https://backstage.io/). + +A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done. + +## Highlights + +### **BREAKING**: Kubernetes backend auth strategies + +Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. As part of this, `setAuthTranslatorMap` has also been removed and the concept moves into the auth strategies instead. + +Contributed by [@jamieklassen](https://github.com/jamieklassen) in [#19903](https://github.com/backstage/backstage/pull/19903) + +### **BREAKING**: Public GitLab User/Group Ingestion + +If you ingest users/groups from GitLab using `GitlabOrgDiscoveryEntityProvider`, you now have to scope its work to a certain group. The backend will not start up successfully without that. + +```diff +catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true ++ group: org/teams +``` + +Contributed by [@sbarrypoppulo](https://github.com/sbarrypoppulo) in [#18889](https://github.com/backstage/backstage/pull/18889) + +### New plugin: OpenCost + +There’s a new [OpenCost](https://www.opencost.io/) plugin that provides a port of the latest OpenCost UI to Backstage. The [plugin's README](https://github.com/backstage/backstage/blob/master/plugins/opencost/README.md) covers installation and configuration. + +Contributed by [@mattray](https://github.com/mattray) in [#18383](https://github.com/backstage/backstage/pull/18383) + +### TypeScript 5.0 + +The minimum TypeScript version is now v5.0, please make sure that you upgrade the TypeScript dependency in your own projects accordingly. + +### Backend System: Ready for use! + +We believe that we have now reached a point where we want to encourage use of the [New Backend System](https://backstage.io/docs/backend-system/). There are still things to iron out and plugins to be migrated, but we consider it to be ready for production use. Please check out the [migration guide for backends](https://backstage.io/docs/backend-system/building-backends/migrating), and use the `legacyPlugin` helper to install any plugins that are not ready for use directly with the new system. + +For local development we also encourage you to try out the new `package start` command for backends in the CLI, which you enable by setting `EXPERIMENTAL_BACKEND_START=1` in the environment. This new way of running the backend no longer uses Webpack, in favor of a more plain watch mode with module loaders. It does however still maintain the SQLite database state across restarts without filesystem overhead. If all goes according to plan this will be the new default starting from the next release. + +### Backend System: Default Exports + +Plugins and modules leveraging the [New Backend System](https://backstage.io/docs/backend-system/) are now supposed to be _the default export_ of their respective packages. This clarifies what the main entrypoint of each package is, facilitates automatic feature discovery, and also lets you easily make dynamic import one-liners in your code. We have made this change to a lot of the packages that had already been migrated to the new backend system. So after upgrading to this version of Backstage, you may find that imports in your backend package no longer match. + +For example, if you are currently importing plugins using the following pattern: + +```ts +import { examplePlugin } from '@backstage/plugin-example-backend'; +backend.add(examplePlugin); +``` + +They may now need to be migrated to: + +```ts +backend.add(import('@backstage/plugin-example-backend')); +``` + +### `yarn fix` and `"sideEffects": false` + +The CLI has received a new `backstage-cli fix` command, typically configured to be run as `yarn fix`. The command will scan through all packages in the project and make sure that they are declared correctly. Initially it will make sure that package exports are declared correctly, replacing the `backstage-cli migrate package-exports` command, as well as making sure that frontend packages set `"sideEffects": false`. The latter fix has been applied to all `@backstage/*` packages as well, which allows for more optimized frontend builds. + +### Auth Backend Improvements + +The `@backstage/plugin-auth-backend` now has support for the new backend system, as well as installing auth providers via modules. As part of this the auth backend has received a substantial redesign, with all of the APIs needed to build your own providers now exported from `@backstage/plugin-auth-node`. It is now also possible to configure fixed sign-in resolvers via static configuration for a limited number of providers. + +You can read more about these changes in the [`@backstage/plugin-auth-node` changelog](https://github.com/backstage/backstage/blob/master/plugins/auth-node/CHANGELOG.md#030). + +### Experimental I18n Support + +A new set of experimental APIs have been added to the frontend system to support internationalization. This allows for both translations to other languages, as well as overriding default messages. Partial support has so far been added to the `@backstage/plugin-user-settings` and `@backstage/plugin-adr` plugins. See [the docs](https://backstage.io/docs/plugins/internationalization) for more details. + +Contributed by [@mario-mui](https://github.com/mario-mui) in [#17436](https://github.com/backstage/backstage/pull/17436) + +### Experimental Packages for Frontend Declarative Integration + +Two new packages have been added to support the work towards frontend declarative integration: `@backstage/frontend-plugin-api` and `@backstage/frontend-app-api`. These packages are still highly experimental and should not be used. + +### Improved Auth Session Expiration + +The session expiration check has been improved for all auth providers. The expiration of both the Backstage identity token as well as provider specific tokens will be considered when deciding whether the session has expired. + +### Scaffolder Template Editor Download + +It is now possible to download the results of a dry-run as a zip archive from the template editor dry-run results view. + +Contributed by [@fyyyyy](https://github.com/fyyyyy) in [#19388](https://github.com/backstage/backstage/pull/19388) + +### Support for Multiple Azure DevOps Organizations + +The integration for Azure DevOps now allows for configuration of separate credentials for different organizations. See the [documentation](https://backstage.io/docs/integrations/azure/locations/) for more information. + +Contributed by [@sanderaernouts](https://github.com/sanderaernouts) in [#18213](https://github.com/backstage/backstage/pull/18213) + +### New package: `@backstage/plugin-catalog-backend-module-scaffolder-entity-model` + +The Scaffolder’s integrations into the catalog have a new dedicated home. The `ScaffolderEntitiesProcessor` and its corresponding New Backend System `catalogModuleScaffolderEntityModel` now should be imported from here, since they have been deprecated in the Scaffolder backend plugin package. + +### Further MySQL compatibility work + +Great efforts have been made by VMware to move the needle in terms of better MySQL support across the core and plugins. Check out the PR for details! + +Contributed by [@PeteLevineA](https://github.com/PeteLevineA) in [#18921](https://github.com/backstage/backstage/pull/18921) + +## Security Fixes + +This release does not contain any security fixes. + +## Upgrade path + +We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated). + +## Links and References + +Below you can find a list of links and references to help you learn about and start using this new release. + +- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/) +- [GitHub repository](https://github.com/backstage/backstage) +- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy) +- [Community Discord](https://discord.gg/backstage-687207715902193673) for discussions and support +- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.18.0-changelog.md) +- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) + +Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.19.0-next.0-changelog.md b/docs/releases/v1.19.0-next.0-changelog.md new file mode 100644 index 0000000000..ed95166757 --- /dev/null +++ b/docs/releases/v1.19.0-next.0-changelog.md @@ -0,0 +1,2868 @@ +# Release v1.19.0-next.0 + +## @backstage/cli@0.23.0-next.0 + +### Minor Changes + +- 7077dbf131: The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior, set `LEGACY_BACKEND_START` instead. + + This new command is no longer based on Webpack, but instead uses Node.js loaders to transpile on the fly. Rather than hot reloading modules the entire backend is now restarted on change, but the SQLite database state is still maintained across restarts via a parent process. + +### Patch Changes + +- 68158034e8: Fix for the new backend `start` command to make it work on Windows. +- 21cd3b1b24: Added a template for creating `node-library` packages with `yarn new`. +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- 3ef18f8c06: Explicitly set `exports: 'named'` for CJS builds, ensuring that they have e.g. `exports["default"] = catalogPlugin;` +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/config@1.1.0 + - @backstage/release-manifests@0.0.10 + - @backstage/catalog-model@1.4.2 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/eslint-plugin@0.1.3 + - @backstage/types@1.1.1 + +## @backstage/core-plugin-api@1.7.0-next.0 + +### Minor Changes + +- 322bbcae24: Removed the exprimental plugin configuration API. The `__experimentalReconfigure()` from the plugin options as well as the `__experimentalConfigure()` method on plugin instances have both been removed. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/e2e-test-utils@0.1.0-next.0 + +### Minor Changes + +- f5b41b27a9: Initial release. + +## @backstage/frontend-app-api@0.2.0-next.0 + +### Minor Changes + +- 9d03dfe5e3: The `createApp` config option has been replaced by a new `configLoader` option. There is now also a `pluginLoader` option that can be used to dynamically load plugins into the app. + +### Patch Changes + +- 322bbcae24: Internal update for removal of experimental plugin configuration API. +- 66d51a4827: Prevents root extension override and duplicated plugin extensions. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-graphiql@0.2.55-next.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog@1.14.0-next.0 + +### Minor Changes + +- 28f1ab2e1a: The catalog plugin no longer implements the experimental reconfiguration API. The create button title can now instead be configured using the new experimental internationalization API, via the `catalogTranslationRef` exported at `/alpha`. For example: + + ```ts + import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha'; + + const app = createApp({ + __experimentalTranslations: { + resources: [ + createTranslationMessages({ + ref: catalogTranslationRef, + catalog_page_create_button_title: 'Create Software', + }), + ], + }, + }); + ``` + +- f3561a2935: include owner chip in catalog search result item + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-catalog-backend@1.14.0-next.0 + +### Minor Changes + +- 78af9433c8: Instrumenting some missing metrics with `OpenTelemetry` + +### Patch Changes + +- 348e8c1cdb: Fixes a bug where eagerly deleted entities did not properly trigger re-stitching of entities that they had relations to. +- b97e9790f0: Internal refactors, laying the foundation for later introducing deferred stitching (see #18062). +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/app-defaults@1.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/theme@0.4.2 + +## @backstage/backend-app-api@0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## @backstage/backend-common@0.19.7-next.0 + +### Patch Changes + +- 1c3d6fa2b2: The `useHotCleanup` and `useHotMemoize` helpers are now deprecated, since hot module reloads for backend are being phased out. +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/backend-app-api@0.5.5-next.0 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/backend-defaults@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-app-api@0.5.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/backend-plugin-api@0.6.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/backend-tasks@0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/backend-test-utils@0.2.6-next.0 + +### Patch Changes + +- 5ddc03813e: Remove third type parameter used for `MockInstance`, in order to be compatible with older versions of `@types/jest`. +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-app-api@0.5.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/types@1.1.1 + +## @backstage/cli-common@0.1.13-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. + +## @backstage/cli-node@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/codemods@0.1.46-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + +## @backstage/config-loader@1.5.1-next.0 + +### Patch Changes + +- 773ea341d2: The `FileConfigSource` will now retry file reading after a short delay if it reads an empty file. This is to avoid flakiness during watch mode where change events can trigger before the file content has been written. +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/core-app-api@1.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## @backstage/core-components@0.13.6-next.0 + +### Patch Changes + +- d19a827ef1: MissingAnnotationEmptyState component can now dynamically generate a YAML example based off the current entity being used. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/version-bridge@1.0.5 + +## @backstage/create-app@0.5.6-next.0 + +### Patch Changes + +- ba6a3b59c1: Removed duplicate `apple-touch-icon` link from `packages/app/public/index.html` that linked to nonexistent icon. + +- c8ec0dea4a: Create unique temp directory for each `create-app` execution. + +- b665f2ce65: Change base node image from node:18-bullseye-slim to node:18-bookworm-slim due to Docker build error on bullseye. + + You can apply these change to your own `Dockerfile` by replacing `node:18-bullseye-slim` with `node:18-bookworm-slim` + +- deed089a3d: Bump `cypress` to fix the end-to-end tests + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. + +- 04a3f65e15: Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build. + + You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bullseye-slim` + +- 5eacd5d213: The E2E test setup based on Cypress has been replaced with one based on [Playwright](https://playwright.dev/). Migrating existing apps is not required as this is a standalone setup, only do so if you also want to switch from Cypress to Playwright. + + The scripts to run the E2E tests have been removed from `packages/app/package.json`, as they are now instead run from the root. Instead, a new script has been added to the root `package.json`, `yarn test:e2e`, which runs the E2E tests in development mode, unless `CI` is set in the environment. + + The Playwright setup uses utilities from the new `@backstage/e2e-test-utils` package to find and include all packages in the monorepo that have an `e2e-tests` folder. + +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + +## @backstage/dev-utils@1.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/test-utils@1.4.4-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/frontend-plugin-api@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/types@1.1.1 + +## @backstage/integration@1.7.1-next.0 + +### Patch Changes + +- 3963d0b885: Ensure that all relevant config fields are properly marked as secret +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/integration-react@1.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/theme@0.4.2 + +## @backstage/repo-tools@0.3.5-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + +## @techdocs/cli@1.5.2-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- 2b6e572051: Restructured tests. +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-techdocs-node@1.8.2-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + +## @backstage/test-utils@1.4.4-next.0 + +### Patch Changes + +- 322bbcae24: Removed the alpha `MockPluginProvider` export since the plugin configuration API has been removed. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-adr@0.6.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-adr-common@0.2.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-adr-backend@0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-adr-common@0.2.16-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-adr-common@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-airbrake@0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/test-utils@1.4.4-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/dev-utils@1.0.22-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-airbrake-backend@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-allure@0.1.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-analytics-module-ga@0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-analytics-module-ga4@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-analytics-module-newrelic-browser@0.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + +## @backstage/plugin-apache-airflow@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + +## @backstage/plugin-api-docs@0.9.12-next.0 + +### Patch Changes + +- 0117a6b47e: Adding `requestInterceptor` option to `api-docs` and pass it to SwaggerUI. This will enable to configure a proxy or headers to be sent to all the request made through the `Try it out` button on SwaggerUI. +- 18f1756908: added aria-label on api definition button for better a11y. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-apollo-explorer@0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-app-backend@0.3.53-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.5.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-app-node@0.1.5-next.0 + +## @backstage/plugin-app-node@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-auth-backend@0.19.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend-module-github-provider@0.1.2-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.2-next.0 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.2-next.0 + - @backstage/plugin-auth-backend-module-google-provider@0.1.2-next.0 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.2-next.0 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-auth-backend-module-github-provider@0.1.2-next.0 + +### Patch Changes + +- 5d32a58b5a: Fixed a bug where the GitHub authenticator did not properly persist granted OAuth scopes. +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-auth-backend-module-google-provider@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-auth-node@0.3.2-next.0 + +### Patch Changes + +- 6c2b0793bf: Fix for persisted scopes not being properly restored on sign-in. +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-azure-devops@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-azure-devops-common@0.3.1 + +## @backstage/plugin-azure-devops-backend@0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-azure-devops-common@0.3.1 + +## @backstage/plugin-azure-sites@0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-azure-sites-common@0.1.1 + +## @backstage/plugin-azure-sites-backend@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-sites-common@0.1.1 + +## @backstage/plugin-badges@0.2.49-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-badges-backend@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## @backstage/plugin-bazaar@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-bazaar-backend@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-bitbucket-cloud-common@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + +## @backstage/plugin-bitrise@0.1.52-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-catalog-backend-module-aws@0.2.8-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-kubernetes-common@0.6.6 + +## @backstage/plugin-catalog-backend-module-azure@0.1.24-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.13-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.20-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.13-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.18-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-kubernetes-common@0.6.6 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.21-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.4.3-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.3.2-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.20-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.12-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.10-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-scaffolder-common@1.4.1 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + +## @backstage/plugin-catalog-graph@0.2.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-import@0.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + +## @backstage/plugin-catalog-node@1.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + +## @backstage/plugin-catalog-react@1.8.5-next.0 + +### Patch Changes + +- a402e1dfb9: Fixed an issue causing `EntityPage` to show an error for entities containing special characters +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-cicd-statistics@0.1.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.4.2 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-cicd-statistics@0.1.27-next.0 + - @backstage/catalog-model@1.4.2 + +## @backstage/plugin-circleci@0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-cloudbuild@0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-code-climate@0.1.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-code-coverage@0.2.18-next.0 + +### Patch Changes + +- a468544fa9: Updated layout to improve contrasts and consistency with other plugins +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-code-coverage-backend@0.2.19-next.0 + +### Patch Changes + +- 4aa27aa200: Added option to set body size limit +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## @backstage/plugin-codescene@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-config-schema@0.1.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-cost-insights@0.12.14-next.0 + +### Patch Changes + +- 959aa2a09f: The experimental plugin configuration has been removed. The trend line can now instead be hidden by setting `costInsights.hideTrendLine` to `true` in the configuration. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-cost-insights-common@0.1.2 + +## @backstage/plugin-devtools@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-devtools-common@0.1.4 + +## @backstage/plugin-devtools-backend@0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## @backstage/plugin-dynatrace@7.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-entity-feedback@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-entity-feedback-common@0.1.3 + +## @backstage/plugin-entity-feedback-backend@0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-entity-feedback-common@0.1.3 + +## @backstage/plugin-entity-validation@0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + +## @backstage/plugin-events-backend@0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-events-backend-module-azure@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-events-backend-module-gerrit@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-events-backend-module-github@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.14-next.0 + +## @backstage/plugin-events-node@0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-explore@0.4.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-explore-react@0.0.32-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-explore-backend@0.0.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-explore-react@0.0.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-explore-common@0.0.2 + +## @backstage/plugin-firehydrant@0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-fossa@0.2.57-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gcalendar@0.3.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gcp-projects@0.3.42-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-git-release-manager@0.3.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-actions@0.6.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-deployments@0.1.56-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-issues@0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-github-pull-requests-board@0.1.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gitops-profiles@0.3.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-gocd@0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-graphiql@0.2.55-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-graphql-backend@0.1.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-catalog-graphql@0.3.23 + +## @backstage/plugin-graphql-voyager@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-home@0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-home-react@0.1.4-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-home-react@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + +## @backstage/plugin-ilert@0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-jenkins@0.8.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-jenkins-common@0.1.19 + +## @backstage/plugin-jenkins-backend@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-jenkins-common@0.1.19 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## @backstage/plugin-kafka@0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-kafka-backend@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## @backstage/plugin-kubernetes@0.10.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-kubernetes-common@0.6.6 + +## @backstage/plugin-kubernetes-backend@0.12.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## @backstage/plugin-lighthouse@0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-lighthouse-common@0.1.3 + +## @backstage/plugin-lighthouse-backend@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-lighthouse-common@0.1.3 + +## @backstage/plugin-linguist@0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-linguist-common@0.1.2 + +## @backstage/plugin-linguist-backend@0.5.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-linguist-common@0.1.2 + +## @backstage/plugin-microsoft-calendar@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-newrelic@0.3.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-newrelic-dashboard@0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## @backstage/plugin-nomad@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-nomad-backend@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-octopus-deploy@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-opencost@0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-org@0.6.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-org-react@0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-pagerduty@0.6.6-next.0 + +### Patch Changes + +- b9ce306814: Minor fix to avoid usage of deprecated prop +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-home-react@0.1.4-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-periskop@0.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-periskop-backend@0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-permission-backend@0.5.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## @backstage/plugin-permission-node@0.7.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-permission-react@0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-common@0.7.8 + +## @backstage/plugin-playlist@0.1.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-playlist-common@0.1.10 + +## @backstage/plugin-playlist-backend@0.3.9-next.0 + +### Patch Changes + +- 9e46f5ff49: Added support to the playlist plugin for the new backend +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-playlist-common@0.1.10 + +## @backstage/plugin-proxy-backend@0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## @backstage/plugin-puppetdb@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-rollbar@0.4.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-rollbar-backend@0.1.50-next.0 + +### Patch Changes + +- 407f4284be: ensure rollbar token is hidden +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + +## @backstage/plugin-scaffolder@1.15.1-next.0 + +### Patch Changes + +- b337d78c3b: fixed issue related template editor fails with multiple templates per file. +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-scaffolder-react@1.5.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + +## @backstage/plugin-scaffolder-backend@1.17.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-scaffolder-common@1.4.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.22-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-node@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-common@1.4.1 + +## @backstage/plugin-scaffolder-react@1.5.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + - @backstage/plugin-scaffolder-common@1.4.1 + +## @backstage/plugin-search@1.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-search-backend@1.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-search-backend-module-elasticsearch@1.3.8-next.0 + +### Patch Changes + +- 3963d0b885: Ensure that all relevant config fields are properly marked as secret +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-search-backend-module-pg@0.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-techdocs-node@1.8.2-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-search-backend-node@1.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-search-react@1.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-sentry@0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-shortcuts@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-sonarqube@0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-sonarqube-react@0.1.9-next.0 + +## @backstage/plugin-sonarqube-backend@0.2.7-next.0 + +### Patch Changes + +- a5d592d0ad: Added support for the [new backend system](https://backstage.io/docs/backend-system/) +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-sonarqube-react@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.4.2 + +## @backstage/plugin-splunk-on-call@0.4.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-stack-overflow@0.1.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-home-react@0.1.4-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/theme@0.4.2 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-stack-overflow-backend@0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-stackstorm@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-tech-insights@0.3.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## @backstage/plugin-tech-insights-backend@0.5.19-next.0 + +### Patch Changes + +- cc7dddfa7f: Increase the maximum allowed length of an entity filter for tech insights fact schemas. +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/plugin-tech-insights-node@0.4.11-next.0 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/plugin-tech-insights-node@0.4.11-next.0 + +## @backstage/plugin-tech-insights-node@0.4.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## @backstage/plugin-tech-radar@0.6.9-next.0 + +### Patch Changes + +- c09d2fa1d6: Added experimental support for the declarative integration. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs@1.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/test-utils@1.4.4-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-backend@1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-techdocs-node@1.8.2-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/theme@0.4.2 + +## @backstage/plugin-techdocs-node@1.8.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-search-common@1.2.6 + +## @backstage/plugin-techdocs-react@1.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/version-bridge@1.0.5 + +## @backstage/plugin-todo@0.2.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-todo-backend@0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## @backstage/plugin-user-settings@0.7.11-next.0 + +### Patch Changes + +- d1b637d005: Fixed a bug where the theme icons would not be colored according to their active state. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-user-settings-backend@0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## @backstage/plugin-vault@0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## @backstage/plugin-vault-backend@0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/errors@1.2.2 + +## @backstage/plugin-xcmetrics@0.2.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## example-app@0.2.88-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.2.0-next.0 + - @backstage/plugin-pagerduty@0.6.6-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/plugin-scaffolder@1.15.1-next.0 + - @backstage/plugin-tech-radar@0.6.9-next.0 + - @backstage/plugin-user-settings@0.7.11-next.0 + - @backstage/plugin-api-docs@0.9.12-next.0 + - @backstage/plugin-code-coverage@0.2.18-next.0 + - @backstage/plugin-cost-insights@0.12.14-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-catalog-import@0.10.1-next.0 + - @backstage/plugin-github-actions@0.6.6-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.0 + - @backstage/plugin-adr@0.6.8-next.0 + - @backstage/plugin-airbrake@0.3.25-next.0 + - @backstage/plugin-azure-devops@0.3.7-next.0 + - @backstage/plugin-azure-sites@0.1.14-next.0 + - @backstage/plugin-badges@0.2.49-next.0 + - @backstage/plugin-catalog-graph@0.2.37-next.0 + - @backstage/plugin-circleci@0.3.25-next.0 + - @backstage/plugin-cloudbuild@0.3.25-next.0 + - @backstage/plugin-dynatrace@7.0.5-next.0 + - @backstage/plugin-entity-feedback@0.2.8-next.0 + - @backstage/plugin-explore@0.4.11-next.0 + - @backstage/plugin-gocd@0.1.31-next.0 + - @backstage/plugin-home@0.5.9-next.0 + - @backstage/plugin-jenkins@0.8.7-next.0 + - @backstage/plugin-kafka@0.3.25-next.0 + - @backstage/plugin-kubernetes@0.10.4-next.0 + - @backstage/plugin-lighthouse@0.4.10-next.0 + - @backstage/plugin-linguist@0.1.10-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.18-next.0 + - @backstage/plugin-nomad@0.1.6-next.0 + - @backstage/plugin-octopus-deploy@0.2.7-next.0 + - @backstage/plugin-org@0.6.15-next.0 + - @backstage/plugin-playlist@0.1.17-next.0 + - @backstage/plugin-puppetdb@0.1.8-next.0 + - @backstage/plugin-rollbar@0.4.25-next.0 + - @backstage/plugin-scaffolder-react@1.5.6-next.0 + - @backstage/plugin-search@1.4.1-next.0 + - @backstage/plugin-sentry@0.5.10-next.0 + - @backstage/plugin-tech-insights@0.3.17-next.0 + - @backstage/plugin-todo@0.2.28-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-apache-airflow@0.2.16-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.0 + - @backstage/plugin-devtools@0.1.5-next.0 + - @backstage/plugin-gcalendar@0.3.19-next.0 + - @backstage/plugin-gcp-projects@0.3.42-next.0 + - @backstage/plugin-graphiql@0.2.55-next.0 + - @backstage/plugin-microsoft-calendar@0.1.8-next.0 + - @backstage/plugin-newrelic@0.3.41-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-shortcuts@0.3.15-next.0 + - @backstage/plugin-stack-overflow@0.1.21-next.0 + - @backstage/plugin-stackstorm@0.1.7-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.6 + +## example-app-next@0.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.2.0-next.0 + - @backstage/plugin-pagerduty@0.6.6-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/plugin-scaffolder@1.15.1-next.0 + - @backstage/plugin-tech-radar@0.6.9-next.0 + - @backstage/plugin-user-settings@0.7.11-next.0 + - @backstage/plugin-api-docs@0.9.12-next.0 + - @backstage/plugin-code-coverage@0.2.18-next.0 + - @backstage/plugin-cost-insights@0.12.14-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-catalog-import@0.10.1-next.0 + - @backstage/plugin-github-actions@0.6.6-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.0 + - @backstage/plugin-adr@0.6.8-next.0 + - @backstage/plugin-airbrake@0.3.25-next.0 + - @backstage/plugin-azure-devops@0.3.7-next.0 + - @backstage/plugin-azure-sites@0.1.14-next.0 + - @backstage/plugin-badges@0.2.49-next.0 + - @backstage/plugin-catalog-graph@0.2.37-next.0 + - @backstage/plugin-circleci@0.3.25-next.0 + - @backstage/plugin-cloudbuild@0.3.25-next.0 + - @backstage/plugin-dynatrace@7.0.5-next.0 + - @backstage/plugin-entity-feedback@0.2.8-next.0 + - @backstage/plugin-explore@0.4.11-next.0 + - @backstage/plugin-gocd@0.1.31-next.0 + - @backstage/plugin-home@0.5.9-next.0 + - @backstage/plugin-jenkins@0.8.7-next.0 + - @backstage/plugin-kafka@0.3.25-next.0 + - @backstage/plugin-kubernetes@0.10.4-next.0 + - @backstage/plugin-lighthouse@0.4.10-next.0 + - @backstage/plugin-linguist@0.1.10-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.18-next.0 + - @backstage/plugin-octopus-deploy@0.2.7-next.0 + - @backstage/plugin-org@0.6.15-next.0 + - @backstage/plugin-playlist@0.1.17-next.0 + - @backstage/plugin-puppetdb@0.1.8-next.0 + - @backstage/plugin-rollbar@0.4.25-next.0 + - @backstage/plugin-scaffolder-react@1.5.6-next.0 + - @backstage/plugin-search@1.4.1-next.0 + - @backstage/plugin-sentry@0.5.10-next.0 + - @backstage/plugin-tech-insights@0.3.17-next.0 + - @backstage/plugin-todo@0.2.28-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-apache-airflow@0.2.16-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.0 + - @backstage/plugin-devtools@0.1.5-next.0 + - @backstage/plugin-gcalendar@0.3.19-next.0 + - @backstage/plugin-gcp-projects@0.3.42-next.0 + - @backstage/plugin-graphiql@0.2.55-next.0 + - @backstage/plugin-microsoft-calendar@0.1.8-next.0 + - @backstage/plugin-newrelic@0.3.41-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-shortcuts@0.3.15-next.0 + - @backstage/plugin-stack-overflow@0.1.21-next.0 + - @backstage/plugin-stackstorm@0.1.7-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - app-next-example-plugin@0.0.2-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.6 + +## app-next-example-plugin@0.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + +## example-backend@0.2.88-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@1.3.8-next.0 + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-playlist-backend@0.3.9-next.0 + - @backstage/plugin-rollbar-backend@0.1.50-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-tech-insights-backend@0.5.19-next.0 + - @backstage/plugin-code-coverage-backend@0.2.19-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.22-next.0 + - @backstage/backend-common@0.19.7-next.0 + - example-app@0.2.88-next.0 + - @backstage/plugin-adr-backend@0.4.2-next.0 + - @backstage/plugin-scaffolder-backend@1.17.3-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.6-next.0 + - @backstage/plugin-techdocs-backend@1.7.2-next.0 + - @backstage/plugin-todo-backend@0.3.3-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-app-backend@0.3.53-next.0 + - @backstage/plugin-auth-backend@0.19.2-next.0 + - @backstage/plugin-azure-devops-backend@0.4.2-next.0 + - @backstage/plugin-azure-sites-backend@0.1.15-next.0 + - @backstage/plugin-badges-backend@0.3.2-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-devtools-backend@0.2.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 + - @backstage/plugin-events-backend@0.2.14-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-explore-backend@0.0.15-next.0 + - @backstage/plugin-graphql-backend@0.1.43-next.0 + - @backstage/plugin-jenkins-backend@0.2.8-next.0 + - @backstage/plugin-kafka-backend@0.3.2-next.0 + - @backstage/plugin-kubernetes-backend@0.12.2-next.0 + - @backstage/plugin-lighthouse-backend@0.3.2-next.0 + - @backstage/plugin-linguist-backend@0.5.2-next.0 + - @backstage/plugin-nomad-backend@0.1.7-next.0 + - @backstage/plugin-permission-backend@0.5.28-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-proxy-backend@0.4.2-next.0 + - @backstage/plugin-search-backend@1.4.5-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.14-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.37-next.0 + - @backstage/plugin-tech-insights-node@0.4.11-next.0 + +## example-backend-next@0.0.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.7-next.0 + - @backstage/plugin-playlist-backend@0.3.9-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/plugin-adr-backend@0.4.2-next.0 + - @backstage/plugin-scaffolder-backend@1.17.3-next.0 + - @backstage/plugin-techdocs-backend@1.7.2-next.0 + - @backstage/plugin-todo-backend@0.3.3-next.0 + - @backstage/backend-defaults@0.2.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/plugin-app-backend@0.3.53-next.0 + - @backstage/plugin-azure-devops-backend@0.4.2-next.0 + - @backstage/plugin-badges-backend@0.3.2-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 + - @backstage/plugin-devtools-backend@0.2.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 + - @backstage/plugin-kubernetes-backend@0.12.2-next.0 + - @backstage/plugin-lighthouse-backend@0.3.2-next.0 + - @backstage/plugin-linguist-backend@0.5.2-next.0 + - @backstage/plugin-permission-backend@0.5.28-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-proxy-backend@0.4.2-next.0 + - @backstage/plugin-search-backend@1.4.5-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + +## @backstage/backend-plugin-manager@0.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-events-backend@0.2.14-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## e2e-test@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.6-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/errors@1.2.2 + +## techdocs-cli-embedded-app@0.2.87-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/test-utils@1.4.4-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## @internal/plugin-todo-list@1.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## @internal/plugin-todo-list-backend@1.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 diff --git a/microsite/data/plugins/veecode-github-workflows b/microsite/data/plugins/github-workflows.yaml similarity index 92% rename from microsite/data/plugins/veecode-github-workflows rename to microsite/data/plugins/github-workflows.yaml index cd518dd8b8..de17a218b6 100644 --- a/microsite/data/plugins/veecode-github-workflows +++ b/microsite/data/plugins/github-workflows.yaml @@ -1,7 +1,7 @@ --- title: Veecode GitHub Workflows author: Veecode Platform -authorUrl: https://github.com/veecode-platform +authorUrl: https://platform.vee.codes/ category: CI/CD description: The Github Workflows plugin provides an alternative for manually triggering GitHub workflows from within your Backstage component. documentation: https://github.com/veecode-platform/platform-backstage-plugins/tree/master/plugins/github-workflows diff --git a/microsite/data/plugins/gitlab-pipelines.yaml b/microsite/data/plugins/gitlab-pipelines.yaml new file mode 100644 index 0000000000..22f42684db --- /dev/null +++ b/microsite/data/plugins/gitlab-pipelines.yaml @@ -0,0 +1,16 @@ +--- +title: Veecode Gitlab Pipelines +author: Veecode Platform +authorUrl: https://platform.vee.codes +category: CI/CD +description: The Gitlab pipelines plugin integrates GitlabCi with its backstage component in a simple way. +documentation: https://github.com/veecode-platform/platform-backstage-plugins/tree/master/plugins/gitlab-pipelines +iconUrl: https://veecode-platform.github.io/support/imgs/logo_1.svg +npmPackageName: '@veecode-platform/backstage-plugin-gitlab-pipelines' +tags: + - ci + - cd + - gitlabCi + - pipelines + - jobs +addedDate: '2023-09-27' diff --git a/microsite/data/plugins/pulumi.yaml b/microsite/data/plugins/pulumi.yaml new file mode 100644 index 0000000000..ea97bcdef3 --- /dev/null +++ b/microsite/data/plugins/pulumi.yaml @@ -0,0 +1,10 @@ +--- +title: Pulumi +author: Pulumi +authorUrl: https://www.pulumi.com +category: Infrastructure +description: View Pulumi stack information in Backstage. +documentation: https://github.com/pulumi/pulumi-backstage-plugin +iconUrl: https://www.pulumi.com/logos/brand/avatar-on-white.png +npmPackageName: '@pulumi/backstage-plugin-pulumi' +addedDate: '2023-09-27' diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index a55ad01a35..1879e35e72 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -177,7 +177,7 @@ module.exports = { position: 'left', }, { - to: 'docs/releases/v1.17.0', + to: 'docs/releases/v1.18.0', label: 'Releases', position: 'left', }, @@ -276,7 +276,7 @@ module.exports = { }, ], copyright: - '<p style="text-align:center"><a href="https://spotify.github.io/">Made with ❤️ at Spotify</a></p><p class="copyright">Copyright © 2022 Backstage Project Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage</p>', + '<p style="text-align:center"><a href="https://spotify.github.io/">Made with ❤️ at Spotify</a></p><p class="copyright">Copyright © 2023 Backstage Project Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage</p>', }, algolia: { apiKey: '1f0ba86672ccfc3576faa94583e5b318', diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 0e73bd94f2..bc394982ca 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -1,6 +1,7 @@ { "releases": { "Release Notes": [ + "releases/v1.18.0", "releases/v1.17.0", "releases/v1.16.0", "releases/v1.15.0", @@ -242,7 +243,7 @@ "plugins/integrating-plugin-into-software-catalog", "plugins/integrating-search-into-plugins", "plugins/composability", - "plugins/customization", + "plugins/internationalization", "plugins/analytics", "plugins/feature-flags", { @@ -265,7 +266,7 @@ "label": "Publishing", "items": [ "plugins/publish-private", - "plugins/add-to-marketplace", + "plugins/add-to-directory", "plugins/observability" ] } @@ -303,6 +304,7 @@ "auth/oidc", "auth/add-auth-provider", "auth/service-to-service-auth", + "auth/autologout", "auth/troubleshooting", "auth/glossary" ], @@ -339,6 +341,43 @@ "items": ["deployment/backstage-deploy/aws-lightsail"] } ], + "New Backend System": [ + "backend-system/index", + { + "type": "category", + "label": "Architecture", + "items": [ + "backend-system/architecture/index", + "backend-system/architecture/services", + "backend-system/architecture/plugins", + "backend-system/architecture/extension-points", + "backend-system/architecture/modules", + "backend-system/architecture/naming-patterns" + ] + }, + { + "type": "category", + "label": "Building Backends", + "items": [ + "backend-system/building-backends/index", + "backend-system/building-backends/migrating" + ] + }, + { + "type": "category", + "label": "Building Plugins & Modules", + "items": [ + "backend-system/building-plugins-and-modules/index", + "backend-system/building-plugins-and-modules/testing", + "backend-system/building-plugins-and-modules/migrating" + ] + }, + { + "type": "category", + "label": "Core Services", + "items": ["backend-system/core-services/index"] + } + ], "Designing for Backstage": [ "dls/design", "dls/component-design-guidelines", @@ -386,43 +425,6 @@ "architecture-decisions/adrs-adr013" ], "FAQ": ["FAQ"], - "Experimental Backend System": [ - "backend-system/index", - { - "type": "category", - "label": "Architecture", - "items": [ - "backend-system/architecture/index", - "backend-system/architecture/services", - "backend-system/architecture/plugins", - "backend-system/architecture/extension-points", - "backend-system/architecture/modules", - "backend-system/architecture/naming-patterns" - ] - }, - { - "type": "category", - "label": "Building Backends", - "items": [ - "backend-system/building-backends/index", - "backend-system/building-backends/migrating" - ] - }, - { - "type": "category", - "label": "Building Plugins & Modules", - "items": [ - "backend-system/building-plugins-and-modules/index", - "backend-system/building-plugins-and-modules/testing", - "backend-system/building-plugins-and-modules/migrating" - ] - }, - { - "type": "category", - "label": "Core Services", - "items": ["backend-system/core-services/index"] - } - ], "Accessibility": ["accessibility/index"] } } diff --git a/microsite/src/components/contentBlock/contentBlock.tsx b/microsite/src/components/contentBlock/contentBlock.tsx index 983f684927..5c3e47fe74 100644 --- a/microsite/src/components/contentBlock/contentBlock.tsx +++ b/microsite/src/components/contentBlock/contentBlock.tsx @@ -37,7 +37,14 @@ export const ContentBlock = ({ {children && React.isValidElement(children) ? children : <p>{children}</p>} {actionButtons && ( - <div className="actionButtons"> + <div + className="actionButtons" + style={{ + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))', + gap: '15px', + }} + > {actionButtons.map(({ link, label }, index) => ( <Link key={index} diff --git a/microsite/src/pages/demos/index.tsx b/microsite/src/pages/demos/index.tsx index 1221c38a63..e3b4b7dbfd 100644 --- a/microsite/src/pages/demos/index.tsx +++ b/microsite/src/pages/demos/index.tsx @@ -175,12 +175,16 @@ const Demos = () => { <BannerSectionGrid> <ContentBlock title={<h1>{demoItem.title}</h1>} - actionButtons={[ - { - link: demoItem.actionItemLink, - label: 'WATCH NOW', - }, - ]} + actionButtons={ + demoItem.actionItemLink + ? [ + { + link: demoItem.actionItemLink, + label: 'WATCH NOW', + }, + ] + : [] + } > {demoItem.content} </ContentBlock> diff --git a/microsite/src/pages/on-demand/index.tsx b/microsite/src/pages/on-demand/index.tsx index 19c227b550..8d78c393ce 100644 --- a/microsite/src/pages/on-demand/index.tsx +++ b/microsite/src/pages/on-demand/index.tsx @@ -36,8 +36,8 @@ const Plugins = () => ( <div className={clsx('container', 'padding--lg', pluginsStyles.onDemandPage)} > - <div className="marketplaceBanner"> - <div className="marketplaceContent"> + <div className="communityBanner"> + <div className="communityContent"> <h2>Community sessions</h2> <p> diff --git a/microsite/src/pages/on-demand/onDemand.module.scss b/microsite/src/pages/on-demand/onDemand.module.scss index fba051ec97..ff5797b687 100644 --- a/microsite/src/pages/on-demand/onDemand.module.scss +++ b/microsite/src/pages/on-demand/onDemand.module.scss @@ -1,10 +1,10 @@ .onDemandPage { - :global(.marketplaceBanner) { + :global(.communityBanner) { display: flex; align-items: center; } - :global(.marketplaceContent) { + :global(.communityContent) { flex: 1; } diff --git a/microsite/src/pages/plugins/index.tsx b/microsite/src/pages/plugins/index.tsx index 94e9df0e8d..006b7d4807 100644 --- a/microsite/src/pages/plugins/index.tsx +++ b/microsite/src/pages/plugins/index.tsx @@ -102,9 +102,9 @@ const Plugins = () => { <div className={clsx('container', 'padding--lg', pluginsStyles.pluginsPage)} > - <div className="marketplaceBanner"> - <div className="marketplaceContent"> - <h2>Plugin Marketplace</h2> + <div className="directoryBanner"> + <div className="directoryContent"> + <h2>Plugin directory</h2> <p> Open source plugins that you can add to your Backstage deployment. @@ -113,10 +113,10 @@ const Plugins = () => { </div> <Link - to="/docs/plugins/add-to-marketplace" + to="/docs/plugins/add-to-directory" className="button button--outline button--primary" > - Add to Marketplace + Add to Directory </Link> </div> diff --git a/microsite/src/pages/plugins/plugins.module.scss b/microsite/src/pages/plugins/plugins.module.scss index ba2ab970a4..80ac60cf98 100644 --- a/microsite/src/pages/plugins/plugins.module.scss +++ b/microsite/src/pages/plugins/plugins.module.scss @@ -1,10 +1,10 @@ .pluginsPage { - :global(.marketplaceBanner) { + :global(.directoryBanner) { display: flex; align-items: center; } - :global(.marketplaceContent) { + :global(.directoryContent) { flex: 1; } diff --git a/microsite/yarn.lock b/microsite/yarn.lock index b3ec70512f..27b077b8da 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2604,91 +2604,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-darwin-arm64@npm:1.3.84" +"@swc/core-darwin-arm64@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-darwin-arm64@npm:1.3.90" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-darwin-x64@npm:1.3.84" +"@swc/core-darwin-x64@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-darwin-x64@npm:1.3.90" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.84" +"@swc/core-linux-arm-gnueabihf@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.90" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.84" +"@swc/core-linux-arm64-gnu@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.90" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.84" +"@swc/core-linux-arm64-musl@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.90" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.84" +"@swc/core-linux-x64-gnu@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.90" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-x64-musl@npm:1.3.84" +"@swc/core-linux-x64-musl@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-x64-musl@npm:1.3.90" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.84" +"@swc/core-win32-arm64-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.90" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.84" +"@swc/core-win32-ia32-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.90" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.84" +"@swc/core-win32-x64-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.90" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.84 - resolution: "@swc/core@npm:1.3.84" + version: 1.3.90 + resolution: "@swc/core@npm:1.3.90" dependencies: - "@swc/core-darwin-arm64": 1.3.84 - "@swc/core-darwin-x64": 1.3.84 - "@swc/core-linux-arm-gnueabihf": 1.3.84 - "@swc/core-linux-arm64-gnu": 1.3.84 - "@swc/core-linux-arm64-musl": 1.3.84 - "@swc/core-linux-x64-gnu": 1.3.84 - "@swc/core-linux-x64-musl": 1.3.84 - "@swc/core-win32-arm64-msvc": 1.3.84 - "@swc/core-win32-ia32-msvc": 1.3.84 - "@swc/core-win32-x64-msvc": 1.3.84 - "@swc/types": ^0.1.4 + "@swc/core-darwin-arm64": 1.3.90 + "@swc/core-darwin-x64": 1.3.90 + "@swc/core-linux-arm-gnueabihf": 1.3.90 + "@swc/core-linux-arm64-gnu": 1.3.90 + "@swc/core-linux-arm64-musl": 1.3.90 + "@swc/core-linux-x64-gnu": 1.3.90 + "@swc/core-linux-x64-musl": 1.3.90 + "@swc/core-win32-arm64-msvc": 1.3.90 + "@swc/core-win32-ia32-msvc": 1.3.90 + "@swc/core-win32-x64-msvc": 1.3.90 + "@swc/counter": ^0.1.1 + "@swc/types": ^0.1.5 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -2715,14 +2716,21 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: dee45823923c29dde579ed1121c4392c937826d575c87f62399ba7a0b27cacfeb05da97b65cf49a721a50127bb1e22ca5c07defa784ec2a47fed33e3498ef1b9 + checksum: f8ced5187068dc73445c135065c6492f0ac559d0f7720c2482aa9663c87bd015f3d2abef6ee7b2f817280a5e8dd0946c59cce7e1499180644fbc948a9e3823ab languageName: node linkType: hard -"@swc/types@npm:^0.1.4": - version: 0.1.4 - resolution: "@swc/types@npm:0.1.4" - checksum: 9b09de7dca8e4b19bfb43f9e332c771855158cb761d26000807fe858447ecbc5342a6c257b26d9aa5497f7138fc58913693e2bee222e5042e0e8f57c2979ae66 +"@swc/counter@npm:^0.1.1": + version: 0.1.1 + resolution: "@swc/counter@npm:0.1.1" + checksum: bb974babd493ba01c0d4a95ab610c3fc15fbf609c08cb0342798e485f57ecc0950abbf84e07124e63c5fe610b492d9a8dd03701d3b9ef7329d9e8bf3cc44980f + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.5": + version: 0.1.5 + resolution: "@swc/types@npm:0.1.5" + checksum: 6aee11f62d3d805a64848e0bd5f0e0e615f958e327a9e1260056c368d7d28764d89e38bd8005a536c9bf18afbcd303edd84099d60df34a2975d62540f61df13b languageName: node linkType: hard @@ -3137,9 +3145,9 @@ __metadata: linkType: hard "@types/webpack-env@npm:^1.18.0": - version: 1.18.1 - resolution: "@types/webpack-env@npm:1.18.1" - checksum: 3173c069763e51a96565d602af7e6dac9d772ae4aa6f26cac187cbf599a7f0b88f790b4b050b9dbdb0485daed3061b4a337863f3b8ce66f8a4e51f75ad387c6a + version: 1.18.2 + resolution: "@types/webpack-env@npm:1.18.2" + checksum: 883908ade827d35a10efc574fb6f2728a7c520d4296cf1507633ac7457204ccd697bc6c8cadac99bc5d96074a6109c658ebfde59f42ba5ba0fdfffc538892b0f languageName: node linkType: hard diff --git a/mkdocs.yml b/mkdocs.yml index 66cd7ab977..de66c97884 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -137,7 +137,7 @@ nav: - Testing with Jest: 'plugins/testing.md' - Publishing: - Publish private: 'plugins/publish-private.md' - - Add to Marketplace: 'plugins/add-to-marketplace.md' + - Add to Directory: 'plugins/add-to-directory.md' - Observability: 'plugins/observability.md' - Configuration: - Static Configuration in Backstage: 'conf/index.md' diff --git a/package.json b/package.json index fe1e7ebce5..89a10072ef 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "root", "private": true, "engines": { - "node": "16 || 18" + "node": "18 || 20" }, "scripts": { "dev": "concurrently 'yarn start' 'yarn start-backend'", @@ -18,6 +18,7 @@ "clean": "backstage-cli repo clean", "test": "backstage-cli repo test", "test:all": "backstage-cli repo test --coverage", + "test:e2e": "playwright test", "fix": "backstage-cli repo fix", "lint": "backstage-cli repo lint --since origin/master", "lint:docs": "node ./scripts/check-docs-quality", @@ -46,9 +47,11 @@ }, "resolutions": { "@types/react": "^17", - "@types/react-dom": "^17" + "@types/react-dom": "^17", + "jest-haste-map@^29.4.3": "patch:jest-haste-map@npm%3A29.4.3#./.yarn/patches/jest-haste-map-npm-29.4.3-19b03fcef3.patch", + "mock-fs@^5.2.0": "patch:mock-fs@npm%3A5.2.0#./.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch" }, - "version": "1.18.0-next.3", + "version": "1.19.0-next.0", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" @@ -57,13 +60,15 @@ "@backstage/cli": "workspace:*", "@backstage/codemods": "workspace:*", "@backstage/create-app": "workspace:*", + "@backstage/e2e-test-utils": "workspace:*", "@backstage/repo-tools": "workspace:*", "@changesets/cli": "^2.14.0", "@octokit/rest": "^19.0.3", + "@playwright/test": "^1.32.3", "@spotify/eslint-plugin": "^14.1.3", "@spotify/prettier-config": "^14.0.0", "@techdocs/cli": "workspace:*", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/webpack": "^5.28.0", "command-exists": "^1.2.9", "concurrently": "^8.0.0", diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 45947300a9..4b37388ccd 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/app-defaults +## 1.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/theme@0.4.2 + +## 1.4.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + ## 1.4.3-next.3 ### Patch Changes @@ -258,7 +282,7 @@ ### Minor Changes -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. ### Patch Changes @@ -306,7 +330,7 @@ ### Minor Changes -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 711f831bad..4a4578c94d 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.4.3-next.3", + "version": "1.4.4-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-next-example-plugin/CHANGELOG.md index 9b244b4dd3..03e627520d 100644 --- a/packages/app-next-example-plugin/CHANGELOG.md +++ b/packages/app-next-example-plugin/CHANGELOG.md @@ -1,5 +1,21 @@ # app-next-example-plugin +## 0.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + +## 0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + ## 0.0.1-next.0 ### Patch Changes diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index 258b58fccd..300db8d39a 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -1,7 +1,7 @@ { "name": "app-next-example-plugin", "description": "Backstage internal example plugin", - "version": "0.0.1-next.0", + "version": "0.0.2-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index ebd4891200..b70579bbed 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,159 @@ # example-app-next +## 0.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.2.0-next.0 + - @backstage/plugin-pagerduty@0.6.6-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/plugin-scaffolder@1.15.1-next.0 + - @backstage/plugin-tech-radar@0.6.9-next.0 + - @backstage/plugin-user-settings@0.7.11-next.0 + - @backstage/plugin-api-docs@0.9.12-next.0 + - @backstage/plugin-code-coverage@0.2.18-next.0 + - @backstage/plugin-cost-insights@0.12.14-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-catalog-import@0.10.1-next.0 + - @backstage/plugin-github-actions@0.6.6-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.0 + - @backstage/plugin-adr@0.6.8-next.0 + - @backstage/plugin-airbrake@0.3.25-next.0 + - @backstage/plugin-azure-devops@0.3.7-next.0 + - @backstage/plugin-azure-sites@0.1.14-next.0 + - @backstage/plugin-badges@0.2.49-next.0 + - @backstage/plugin-catalog-graph@0.2.37-next.0 + - @backstage/plugin-circleci@0.3.25-next.0 + - @backstage/plugin-cloudbuild@0.3.25-next.0 + - @backstage/plugin-dynatrace@7.0.5-next.0 + - @backstage/plugin-entity-feedback@0.2.8-next.0 + - @backstage/plugin-explore@0.4.11-next.0 + - @backstage/plugin-gocd@0.1.31-next.0 + - @backstage/plugin-home@0.5.9-next.0 + - @backstage/plugin-jenkins@0.8.7-next.0 + - @backstage/plugin-kafka@0.3.25-next.0 + - @backstage/plugin-kubernetes@0.10.4-next.0 + - @backstage/plugin-lighthouse@0.4.10-next.0 + - @backstage/plugin-linguist@0.1.10-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.18-next.0 + - @backstage/plugin-octopus-deploy@0.2.7-next.0 + - @backstage/plugin-org@0.6.15-next.0 + - @backstage/plugin-playlist@0.1.17-next.0 + - @backstage/plugin-puppetdb@0.1.8-next.0 + - @backstage/plugin-rollbar@0.4.25-next.0 + - @backstage/plugin-scaffolder-react@1.5.6-next.0 + - @backstage/plugin-search@1.4.1-next.0 + - @backstage/plugin-sentry@0.5.10-next.0 + - @backstage/plugin-tech-insights@0.3.17-next.0 + - @backstage/plugin-todo@0.2.28-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-apache-airflow@0.2.16-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.0 + - @backstage/plugin-devtools@0.1.5-next.0 + - @backstage/plugin-gcalendar@0.3.19-next.0 + - @backstage/plugin-gcp-projects@0.3.42-next.0 + - @backstage/plugin-graphiql@0.2.55-next.0 + - @backstage/plugin-microsoft-calendar@0.1.8-next.0 + - @backstage/plugin-newrelic@0.3.41-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-shortcuts@0.3.15-next.0 + - @backstage/plugin-stack-overflow@0.1.21-next.0 + - @backstage/plugin-stackstorm@0.1.7-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - app-next-example-plugin@0.0.2-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - app-next-example-plugin@0.0.1 + - @internal/plugin-catalog-customized@0.0.14 + ## 0.0.1-next.2 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index e9897fd348..40e7d75c1e 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.1-next.2", + "version": "0.0.2-next.0", "private": true, "backstage": { "role": "frontend" @@ -24,6 +24,7 @@ "@backstage/plugin-azure-devops": "workspace:^", "@backstage/plugin-azure-sites": "workspace:^", "@backstage/plugin-badges": "workspace:^", + "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-graph": "workspace:^", "@backstage/plugin-catalog-import": "workspace:^", @@ -76,7 +77,6 @@ "@backstage/plugin-todo": "workspace:^", "@backstage/plugin-user-settings": "workspace:^", "@backstage/theme": "workspace:^", - "@internal/plugin-catalog-customized": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", @@ -99,7 +99,6 @@ }, "devDependencies": { "@backstage/test-utils": "workspace:^", - "@testing-library/cypress": "^9.0.0", "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", @@ -108,21 +107,14 @@ "@types/react": "*", "@types/react-dom": "*", "@types/zen-observable": "^0.8.0", - "cross-env": "^7.0.0", - "cypress": "^10.0.0", - "eslint-plugin-cypress": "^2.10.3", - "start-server-and-test": "^1.10.11" + "cross-env": "^7.0.0" }, "scripts": { "start": "backstage-cli package start --config ../../app-config.yaml --config app-config.yaml", "build": "backstage-cli package build", "clean": "backstage-cli package clean", "test": "backstage-cli package test", - "lint": "backstage-cli package lint", - "test:e2e": "start-server-and-test start http://localhost:3000 cy:dev", - "test:e2e:ci": "start-server-and-test start http://localhost:3000 cy:run", - "cy:dev": "cypress open", - "cy:run": "cypress run" + "lint": "backstage-cli package lint" }, "browserslist": { "production": [ diff --git a/packages/app-next/public/index.html b/packages/app-next/public/index.html index 0710a0d69d..a3c3ef19b8 100644 --- a/packages/app-next/public/index.html +++ b/packages/app-next/public/index.html @@ -8,7 +8,6 @@ name="description" content="Backstage is an open platform for building developer portals" /> - <link rel="apple-touch-icon" href="<%= publicPath %>/logo192.png" /> <!-- manifest.json provides metadata used when your web app is installed on a user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index aa9bb985c2..d844939cf2 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -17,6 +17,7 @@ import { createApp } from '@backstage/frontend-app-api'; import { pagesPlugin } from './examples/pagesPlugin'; import graphiqlPlugin from '@backstage/plugin-graphiql/alpha'; +import techRadarPlugin from '@backstage/plugin-tech-radar/alpha'; /* @@ -48,7 +49,7 @@ TODO: /* app.tsx */ const app = createApp({ - plugins: [graphiqlPlugin, pagesPlugin], + plugins: [graphiqlPlugin, pagesPlugin, techRadarPlugin], // bindRoutes({ bind }) { // bind(catalogPlugin.externalRoutes, { // createComponent: scaffolderPlugin.routes.root, diff --git a/packages/app-next/src/examples/pagesPlugin.tsx b/packages/app-next/src/examples/pagesPlugin.tsx index c805442305..290c6b118e 100644 --- a/packages/app-next/src/examples/pagesPlugin.tsx +++ b/packages/app-next/src/examples/pagesPlugin.tsx @@ -48,6 +48,9 @@ const IndexPage = createPageExtension({ <div> <Link to="/graphiql">GraphiQL</Link> </div> + <div> + <Link to="/search">Search</Link> + </div> </div> ); }; diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 28bda23989..9fe80276a6 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,157 @@ # example-app +## 0.2.88-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.2.0-next.0 + - @backstage/plugin-pagerduty@0.6.6-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/plugin-scaffolder@1.15.1-next.0 + - @backstage/plugin-tech-radar@0.6.9-next.0 + - @backstage/plugin-user-settings@0.7.11-next.0 + - @backstage/plugin-api-docs@0.9.12-next.0 + - @backstage/plugin-code-coverage@0.2.18-next.0 + - @backstage/plugin-cost-insights@0.12.14-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-catalog-import@0.10.1-next.0 + - @backstage/plugin-github-actions@0.6.6-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.0 + - @backstage/plugin-adr@0.6.8-next.0 + - @backstage/plugin-airbrake@0.3.25-next.0 + - @backstage/plugin-azure-devops@0.3.7-next.0 + - @backstage/plugin-azure-sites@0.1.14-next.0 + - @backstage/plugin-badges@0.2.49-next.0 + - @backstage/plugin-catalog-graph@0.2.37-next.0 + - @backstage/plugin-circleci@0.3.25-next.0 + - @backstage/plugin-cloudbuild@0.3.25-next.0 + - @backstage/plugin-dynatrace@7.0.5-next.0 + - @backstage/plugin-entity-feedback@0.2.8-next.0 + - @backstage/plugin-explore@0.4.11-next.0 + - @backstage/plugin-gocd@0.1.31-next.0 + - @backstage/plugin-home@0.5.9-next.0 + - @backstage/plugin-jenkins@0.8.7-next.0 + - @backstage/plugin-kafka@0.3.25-next.0 + - @backstage/plugin-kubernetes@0.10.4-next.0 + - @backstage/plugin-lighthouse@0.4.10-next.0 + - @backstage/plugin-linguist@0.1.10-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.18-next.0 + - @backstage/plugin-nomad@0.1.6-next.0 + - @backstage/plugin-octopus-deploy@0.2.7-next.0 + - @backstage/plugin-org@0.6.15-next.0 + - @backstage/plugin-playlist@0.1.17-next.0 + - @backstage/plugin-puppetdb@0.1.8-next.0 + - @backstage/plugin-rollbar@0.4.25-next.0 + - @backstage/plugin-scaffolder-react@1.5.6-next.0 + - @backstage/plugin-search@1.4.1-next.0 + - @backstage/plugin-sentry@0.5.10-next.0 + - @backstage/plugin-tech-insights@0.3.17-next.0 + - @backstage/plugin-todo@0.2.28-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-apache-airflow@0.2.16-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.0 + - @backstage/plugin-devtools@0.1.5-next.0 + - @backstage/plugin-gcalendar@0.3.19-next.0 + - @backstage/plugin-gcp-projects@0.3.42-next.0 + - @backstage/plugin-graphiql@0.2.55-next.0 + - @backstage/plugin-microsoft-calendar@0.1.8-next.0 + - @backstage/plugin-newrelic@0.3.41-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-shortcuts@0.3.15-next.0 + - @backstage/plugin-stack-overflow@0.1.21-next.0 + - @backstage/plugin-stackstorm@0.1.7-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-nomad@0.1.5 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - @internal/plugin-catalog-customized@0.0.14 + ## 0.2.87-next.3 ### Patch Changes diff --git a/packages/app/cypress.json b/packages/app/cypress.json deleted file mode 100644 index 6ae01d9c2a..0000000000 --- a/packages/app/cypress.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "baseUrl": "http://localhost:3000", - "fixturesFolder": false, - "pluginsFile": false -} diff --git a/packages/app/cypress/.eslintrc.json b/packages/app/cypress/.eslintrc.json deleted file mode 100644 index b903ff250a..0000000000 --- a/packages/app/cypress/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "plugins": ["cypress"], - "extends": ["plugin:cypress/recommended"], - "rules": { - "jest/expect-expect": [ - "error", - { - "assertFunctionNames": ["expect", "cy.contains", "cy.**.should"] - } - ] - } -} diff --git a/packages/app/cypress/integration/app.js b/packages/app/cypress/integration/app.js deleted file mode 100644 index 6371bcc4f8..0000000000 --- a/packages/app/cypress/integration/app.js +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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. - */ - -describe('App', () => { - it('should render the welcome page', () => { - cy.visit('/'); - cy.contains('Welcome to Backstage'); - cy.contains('Getting Started'); - cy.contains('Quick Links'); - cy.contains('APIs'); - }); - - it('should display support info when clicking the button', () => { - cy.visit('/'); - // eslint-disable-next-line testing-library/await-async-query - cy.findByTestId('support-button').click({ force: true }); - cy.contains('#backstage'); - }); - - it('should display error message when triggering it', () => { - cy.visit('/'); - // eslint-disable-next-line testing-library/await-async-query - cy.findByTestId('error-button').click({ force: true }); - cy.contains('Error: Oh no!'); - // eslint-disable-next-line testing-library/await-async-query - cy.findByTestId('error-button-close').click({ force: true }); - }); - - it('should be able to login and logout', () => { - const name = 'test-name'; - Cypress.on('window:before:load', win => { - win.fetch = cy.stub().resolves({ - status: 200, - json: () => ({ username: 'test name', token: 'token', name }), - }); - }); - - cy.visit('/'); - cy.get('a[href="/login"]').click({ force: true }); - cy.url().should('include', '/login'); - cy.contains('Welcome, guest!'); - cy.contains('Username') - .get('input[name=github-username-tf]') - .type(name, { force: true }); - cy.contains('Token') - .get('input[name=github-auth-tf]') - .type('password', { force: true }); - // eslint-disable-next-line testing-library/await-async-query - cy.findByTestId('github-auth-button').click({ force: true }); - cy.contains(`Welcome, ${name}!`); - cy.contains('Logout').click({ force: true }); - cy.contains('Welcome, guest!'); - }); -}); diff --git a/packages/app/cypress/integration/components/search/SearchPage.js b/packages/app/cypress/integration/components/search/SearchPage.js deleted file mode 100644 index 11f31cfed3..0000000000 --- a/packages/app/cypress/integration/components/search/SearchPage.js +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const API_ENDPOINT = 'http://localhost:7007/api/search/query'; - -describe('SearchPage', () => { - describe('Given a search context with a term, results, and filter values', () => { - it('The results are rendered as expected', () => { - const results = [ - { - type: 'software-catalog', - document: { - title: 'backstage', - text: 'Backstage system documentation', - location: '/result/location/path', - }, - }, - ]; - - cy.enterAsGuest(); - cy.visit('/search-next', { - onBeforeLoad(win) { - cy.stub(win, 'fetch') - .withArgs(`${API_ENDPOINT}?term=`) - .resolves({ - ok: true, - json: () => ({ results }), - }); - }, - }); - cy.contains('Search'); - - cy.contains(results[0].document.title); - cy.contains(results[0].document.text); - cy.get(`a[href="${results[0].document.location}"]`).should('be.visible'); - }); - - it('The filters are rendered as expected', () => { - cy.enterAsGuest(); - cy.visit( - '/search-next?filters%5Bkind%5D=Component&filters%5Blifecycle%5D%5B%5D=experimental', - { - onBeforeLoad(win) { - cy.stub(win, 'fetch') - .withArgs( - `${API_ENDPOINT}?term=&filters%5Bkind%5D=Component&filters%5Blifecycle%5D%5B0%5D=experimental`, - ) - .resolves({ - ok: true, - json: () => ({ results: [] }), - }); - }, - }, - ); - cy.contains('Search'); - - // lifecycle - cy.contains('lifecycle'); - - cy.contains('experimental'); - cy.get( - '[data-testid="search-checkboxfilter-next"] input[value="experimental"]', - ).should('have.attr', 'checked'); - - cy.contains('production'); - cy.get( - '[data-testid="search-checkboxfilter-next"] input[value="production"]', - ).should('not.have.attr', 'checked'); - - // kind - cy.contains('kind'); - cy.get( - '[data-testid="search-selectfilter-next"] [role="button"][aria-haspopup="listbox"]', - ).click(); - - cy.contains('All'); - cy.contains('Template'); - cy.contains('Component'); - - cy.get('[role="option"][data-value="Component"]').should( - 'have.attr', - 'aria-selected', - 'true', - ); - }); - - it('The search bar is rendered as expected', () => { - cy.enterAsGuest(); - cy.visit('/search-next?query=backstage', { - onBeforeLoad(win) { - cy.stub(win, 'fetch') - .withArgs(`${API_ENDPOINT}?term=backstage`) - .resolves({ - ok: true, - json: () => ({ results: [] }), - }); - }, - }); - cy.contains('Search'); - - cy.get('[data-testid="search-bar-next"] input').should( - 'have.attr', - 'value', - 'backstage', - ); - }); - }); -}); diff --git a/packages/app/cypress/support/index.js b/packages/app/cypress/support/index.js deleted file mode 100644 index fb62f6359f..0000000000 --- a/packages/app/cypress/support/index.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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 '@testing-library/cypress/add-commands'; -import './commands'; diff --git a/packages/app/e2e-tests/SearchPage.test.ts b/packages/app/e2e-tests/SearchPage.test.ts new file mode 100644 index 0000000000..9c42cf3d0a --- /dev/null +++ b/packages/app/e2e-tests/SearchPage.test.ts @@ -0,0 +1,46 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test, expect } from '@playwright/test'; + +test('the results are rendered as expected', async ({ page }) => { + await page.goto('/'); + + const enterButton = page.getByRole('button', { name: 'Enter' }); + await expect(enterButton).toBeVisible(); + await enterButton.click(); + + await page.goto('/search'); + await page.route(`http://*/api/search/query?term=*`, async route => { + const results = [ + { + type: 'software-catalog', + document: { + title: 'backstage', + text: 'Backstage system documentation', + location: '/result/location/path', + }, + }, + ]; + await route.fulfill({ json: { results } }); + }); + + await expect( + page.getByPlaceholder('Search in Backstage Example App'), + ).toBeVisible(); + + await expect(page.getByText('Backstage system documentation')).toBeVisible(); +}); diff --git a/cypress/src/integration/user/logout.spec.ts b/packages/app/e2e-tests/app.test.ts similarity index 52% rename from cypress/src/integration/user/logout.spec.ts rename to packages/app/e2e-tests/app.test.ts index a3aea9d6a8..7449e4d9cb 100644 --- a/cypress/src/integration/user/logout.spec.ts +++ b/packages/app/e2e-tests/app.test.ts @@ -13,23 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/// <reference types="cypress" /> -import 'os'; -describe('Logout', () => { - before(() => { - cy.loginAsGuest(); - }); - it('should be able to logout', () => { - cy.visit('/settings'); - cy.get('[data-testid="user-settings-menu"]').click(); - return cy - .get('[data-testid="sign-out"]') - .click() - .then(() => { - return expect( - localStorage.getItem('@backstage/core:SignInPage:provider'), - ).to.be.null; - }); - }); +import { test, expect } from '@playwright/test'; + +test('App should render the welcome page', async ({ page }) => { + await page.goto('/'); + + const enterButton = page.getByRole('button', { name: 'Enter' }); + await expect(enterButton).toBeVisible(); + await enterButton.click(); + + await expect(page.getByText('My Company Catalog')).toBeVisible(); + + const supportButton = page.getByTestId('support-button'); + await expect(supportButton).toBeVisible(); + await supportButton.click(); + + await expect(page.getByText('#backstage')).toBeVisible(); }); diff --git a/packages/app/package.json b/packages/app/package.json index a4fa62b216..5b17cc349e 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.87-next.3", + "version": "0.2.88-next.0", "private": true, "backstage": { "role": "frontend" @@ -29,6 +29,7 @@ "@backstage/plugin-azure-devops": "workspace:^", "@backstage/plugin-azure-sites": "workspace:^", "@backstage/plugin-badges": "workspace:^", + "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-graph": "workspace:^", "@backstage/plugin-catalog-import": "workspace:^", @@ -82,7 +83,6 @@ "@backstage/plugin-todo": "workspace:^", "@backstage/plugin-user-settings": "workspace:^", "@backstage/theme": "workspace:^", - "@internal/plugin-catalog-customized": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", @@ -103,7 +103,7 @@ }, "devDependencies": { "@backstage/test-utils": "workspace:^", - "@testing-library/cypress": "^9.0.0", + "@playwright/test": "^1.32.3", "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", @@ -112,21 +112,14 @@ "@types/react": "*", "@types/react-dom": "*", "@types/zen-observable": "^0.8.0", - "cross-env": "^7.0.0", - "cypress": "^10.0.0", - "eslint-plugin-cypress": "^2.10.3", - "start-server-and-test": "^1.10.11" + "cross-env": "^7.0.0" }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", "clean": "backstage-cli package clean", "test": "backstage-cli package test", - "lint": "backstage-cli package lint", - "test:e2e": "start-server-and-test start http://localhost:3000 cy:dev", - "test:e2e:ci": "start-server-and-test start http://localhost:3000 cy:run", - "cy:dev": "cypress open", - "cy:run": "cypress run" + "lint": "backstage-cli package lint" }, "browserslist": { "production": [ diff --git a/packages/app/public/index.html b/packages/app/public/index.html index 0710a0d69d..a3c3ef19b8 100644 --- a/packages/app/public/index.html +++ b/packages/app/public/index.html @@ -8,7 +8,6 @@ name="description" content="Backstage is an open platform for building developer portals" /> - <link rel="apple-touch-icon" href="<%= publicPath %>/logo192.png" /> <!-- manifest.json provides metadata used when your web app is installed on a user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 6371182221..a0a6419328 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -46,7 +46,7 @@ import { CatalogEntityPage, CatalogIndexPage, catalogPlugin, -} from '@internal/plugin-catalog-customized'; +} from '@backstage/plugin-catalog'; import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; import { diff --git a/packages/app/src/components/catalog/EntityPage.test.tsx b/packages/app/src/components/catalog/EntityPage.test.tsx index f9d23247c6..68ce5fb497 100644 --- a/packages/app/src/components/catalog/EntityPage.test.tsx +++ b/packages/app/src/components/catalog/EntityPage.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { EntityLayout } from '@internal/plugin-catalog-customized'; +import { EntityLayout } from '@backstage/plugin-catalog'; import { EntityProvider, starredEntitiesApiRef, diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index 25630253d4..ae78d0b771 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -68,7 +68,7 @@ import { hasLabels, hasRelationWarnings, EntityRelationWarning, -} from '@internal/plugin-catalog-customized'; +} from '@backstage/plugin-catalog'; import { Direction, EntityCatalogGraphCard, diff --git a/packages/app/src/components/search/SearchModal.tsx b/packages/app/src/components/search/SearchModal.tsx index 6b701d394d..23aec53a58 100644 --- a/packages/app/src/components/search/SearchModal.tsx +++ b/packages/app/src/components/search/SearchModal.tsx @@ -29,7 +29,7 @@ import { useSearch, } from '@backstage/plugin-search-react'; import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs'; -import { CatalogSearchResultListItem } from '@internal/plugin-catalog-customized'; +import { CatalogSearchResultListItem } from '@backstage/plugin-catalog'; import { Box, DialogActions, diff --git a/packages/app/src/components/search/SearchPage.tsx b/packages/app/src/components/search/SearchPage.tsx index 2e577e6589..a9f54cdb49 100644 --- a/packages/app/src/components/search/SearchPage.tsx +++ b/packages/app/src/components/search/SearchPage.tsx @@ -23,7 +23,7 @@ import { useSidebarPinState, } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; -import { CatalogSearchResultListItem } from '@internal/plugin-catalog-customized'; +import { CatalogSearchResultListItem } from '@backstage/plugin-catalog'; import { catalogApiRef, CATALOG_FILTER_EXISTS, diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 390103ae91..e70c14d84e 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/backend-app-api +## 0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## 0.5.3 + +### Patch Changes + +- 154632d8753b: Add support for discovering additional service factories during startup. +- 37a20c7f14aa: Adds include and exclude configuration to feature discovery of backend packages + Adds alpha modules to feature discovery +- cb7fc410ed99: The experimental backend feature discovery now only considers default exports from packages. It no longer filters packages to include based on the package role, except that `'cli'` packages are ignored. However, the `"backstage"` field is still required in `package.json`. +- 3fc64b9e2f8f: Extension points are now tracked via their ID rather than reference, in order to support package duplication. +- 3b30b179cb38: Add support for installing features as package imports, for example `backend.add(import('my-plugin'))`. +- b219d097b3f4: Backend startup will now fail if any circular service dependencies are detected. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + ## 0.5.3-next.3 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 46d5e9e4f4..d29b00d036 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.5.3-next.3", + "version": "0.5.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index fb425e0c97..6e761caa41 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/backend-common +## 0.19.7-next.0 + +### Patch Changes + +- 1c3d6fa2b2: The `useHotCleanup` and `useHotMemoize` helpers are now deprecated, since hot module reloads for backend are being phased out. +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/backend-app-api@0.5.5-next.0 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.19.5 + +### Patch Changes + +- 6847cd6225d6: Avoid starting database keepalive loop in tests. +- fd3fdd0e3338: The root logger is now initialized lazily, fixing a circular dependency issue with `@backstage/backend-app-api` that would result in `Cannot read properties of undefined (reading 'redacter')`. +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. +- 19a140418cc8: Added retries for initial database creation, as well as set minimum connection pool size for the database creation client to 0 and lowered the connection acquisition timeout. +- 05508a9757d2: Minor internal refactor +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/integration-aws-node@0.1.6 + ## 0.19.5-next.3 ### Patch Changes diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index f0fa15efb0..ab640ccd9b 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -785,12 +785,12 @@ export type UrlReadersOptions = { factories?: ReaderFactory[]; }; -// @public +// @public @deprecated export function useHotCleanup( _module: NodeModule, cancelEffect: () => void, ): void; -// @public +// @public @deprecated export function useHotMemoize<T>(_module: NodeModule, valueFactory: () => T): T; ``` diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 3e7d0f0f4d..a887bdc8e7 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.19.5-next.3", + "version": "0.19.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { @@ -138,7 +138,7 @@ "aws-sdk-client-mock": "^2.0.0", "better-sqlite3": "^8.0.0", "http-errors": "^2.0.0", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "mysql2": "^2.2.5", "recursive-readdir": "^2.2.2", diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts index 4b655512bb..7564f82028 100644 --- a/packages/backend-common/src/database/DatabaseManager.ts +++ b/packages/backend-common/src/database/DatabaseManager.ts @@ -227,9 +227,7 @@ export class DatabaseManager { * all supported databases excluding SQLite unless `pluginDivisionMode` is set * to `schema`. */ - private getConnectionConfig( - pluginId: string, - ): Partial<Knex.StaticConnectionConfig> { + private getConnectionConfig(pluginId: string): Knex.StaticConnectionConfig { const { client, overridden } = this.getClientType(pluginId); let baseConnection = normalizeConnection( @@ -271,7 +269,7 @@ export class DatabaseManager { // include base connection if client type has not been overridden ...(overridden ? {} : baseConnection), ...connection, - } as Partial<Knex.StaticConnectionConfig>; + } as Knex.StaticConnectionConfig; } /** @@ -377,7 +375,9 @@ export class DatabaseManager { databaseClientOverrides, deps, ); - this.startKeepaliveLoop(pluginId, client); + if (process.env.NODE_ENV !== 'test') { + this.startKeepaliveLoop(pluginId, client); + } return client; }); diff --git a/packages/backend-common/src/database/connectors/mysql.ts b/packages/backend-common/src/database/connectors/mysql.ts index 4283ff42bd..16610dd920 100644 --- a/packages/backend-common/src/database/connectors/mysql.ts +++ b/packages/backend-common/src/database/connectors/mysql.ts @@ -151,13 +151,33 @@ export async function ensureMysqlDatabaseExists( connection: { database: null as unknown as string, }, + pool: { + min: 0, + acquireTimeoutMillis: 10000, + }, }); try { const ensureDatabase = async (database: string) => { await admin.raw(`CREATE DATABASE IF NOT EXISTS ??`, [database]); }; - await Promise.all(databases.map(ensureDatabase)); + await Promise.all( + databases.map(async database => { + // For initial setup we use a smaller timeout but several retries. Given that this + // is a separate connection pool we should never really run into issues with connection + // acquisition timeouts, but we do anyway. This might be a bug in knex or some other dependency. + let lastErr: Error | undefined = undefined; + for (let i = 0; i < 3; i++) { + try { + return await ensureDatabase(database); + } catch (err) { + lastErr = err; + } + await new Promise(resolve => setTimeout(resolve, 100)); + } + throw lastErr; + }), + ); } finally { await admin.destroy(); } diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index afc8c207be..f132488e29 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -126,6 +126,10 @@ export async function ensurePgDatabaseExists( connection: { database: 'postgres', }, + pool: { + min: 0, + acquireTimeoutMillis: 10000, + }, }); try { @@ -142,7 +146,23 @@ export async function ensurePgDatabaseExists( await admin.raw(`CREATE DATABASE ??`, [database]); }; - await Promise.all(databases.map(ensureDatabase)); + await Promise.all( + databases.map(async database => { + // For initial setup we use a smaller timeout but several retries. Given that this + // is a separate connection pool we should never really run into issues with connection + // acquisition timeouts, but we do anyway. This might be a bug in knex or some other dependency. + let lastErr: Error | undefined = undefined; + for (let i = 0; i < 3; i++) { + try { + return await ensureDatabase(database); + } catch (err) { + lastErr = err; + } + await new Promise(resolve => setTimeout(resolve, 100)); + } + throw lastErr; + }), + ); } finally { await admin.destroy(); } diff --git a/packages/backend-common/src/hot.ts b/packages/backend-common/src/hot.ts index 7148778b8c..94ebf52307 100644 --- a/packages/backend-common/src/hot.ts +++ b/packages/backend-common/src/hot.ts @@ -47,6 +47,7 @@ function findAllAncestors(_module: NodeModule): NodeModule[] { * Useful for cleaning intervals, timers, requests etc * * @public + * @deprecated Hot module reloading is no longer supported for backends. * @example * ```ts * const intervalId = setInterval(doStuff, 1000); @@ -80,6 +81,7 @@ const CURRENT_HOT_MEMOIZE_INDEX_KEY = 'backstage.io/hmr-memoize-key'; * stateful parts of the backend, e.g. to retain a database. * * @public + * @deprecated Hot module reloading is no longer supported for backends. * @example * ```ts * const db = useHotMemoize(module, () => createDB(dbParams)); diff --git a/packages/backend-common/src/reading/GerritUrlReader.test.ts b/packages/backend-common/src/reading/GerritUrlReader.test.ts index 9de9aac33d..19c67ffd56 100644 --- a/packages/backend-common/src/reading/GerritUrlReader.test.ts +++ b/packages/backend-common/src/reading/GerritUrlReader.test.ts @@ -82,7 +82,10 @@ const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => { }); }; -describe('GerritUrlReader', () => { +// TODO(Rugvip): These tests seem to be a direct or indirect cause of the TaskWorker test flakiness +// We're not sure why at this point, but while investigating these tests are disabled +// eslint-disable-next-line jest/no-disabled-tests +describe.skip('GerritUrlReader', () => { const worker = setupServer(); setupRequestMockHandlers(worker); diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts index 880ab6f1d7..1eb18f5c1d 100644 --- a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts @@ -78,7 +78,9 @@ describe('ReadUrlResponseFactory', () => { let readable: NodeJS.ReadableStream; beforeEach(() => { - readable = new Stream({ encoding: 'utf-8' }) as NodeJS.ReadableStream; + readable = new Stream({ + encoding: 'utf-8', + }) as unknown as NodeJS.ReadableStream; readable.readable = true; // Write data asynchronously, as soon as possible. diff --git a/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts b/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts index a9bcfd7631..a5728a6169 100644 --- a/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts +++ b/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts @@ -72,11 +72,11 @@ describe('ReadableArrayResponse', () => { const res = new ReadableArrayResponse(arr, '/tmp', 'etag'); const dir = await res.dir(); - expect(fs.readFileSync(resolvePath(dir, 'file1.yaml'), 'utf8').trim()).toBe( - 'site_name: Test', - ); - expect(fs.readFileSync(resolvePath(dir, 'file2.yaml'), 'utf8').trim()).toBe( - 'site_name: Test2', - ); + await expect( + fs.readFile(resolvePath(dir, 'file1.yaml'), 'utf8'), + ).resolves.toMatch(/site_name: Test/); + await expect( + fs.readFile(resolvePath(dir, 'file2.yaml'), 'utf8'), + ).resolves.toMatch(/site_name: Test2/); }); }); diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index a09255c269..98f39ef7b6 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/backend-defaults +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-app-api@0.5.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.3-next.3 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index e4d62b311c..3aee2f5708 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.2.3-next.3", + "version": "0.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 23e5c571bd..55fdbe5a6a 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -18,16 +18,24 @@ import { coreServices, createServiceFactory, } from '@backstage/backend-plugin-api'; -import { mockServices } from '@backstage/backend-test-utils'; import { createBackend } from './CreateBackend'; describe('createBackend', () => { it('should not throw when overriding a default service implementation', async () => { const backend = createBackend(); - backend.add(mockServices.rootConfig.factory()); + backend.add( + createServiceFactory({ + service: coreServices.rootConfig, + deps: {}, + factory(): never { + throw new Error('NOPE'); + }, + }), + ); - await expect(backend.start()).resolves.toBe(undefined); + // We expect the service factory error to be thrown, rather than any earlier validation + await expect(backend.start()).rejects.toThrow('NOPE'); }); it('should throw on duplicate service implementations', async () => { diff --git a/packages/backend-dev-utils/src/ipcClient.ts b/packages/backend-dev-utils/src/ipcClient.ts index 87c1596a39..d9ec7821de 100644 --- a/packages/backend-dev-utils/src/ipcClient.ts +++ b/packages/backend-dev-utils/src/ipcClient.ts @@ -38,6 +38,8 @@ type Response = const requestType = '@backstage/cli/channel/request'; const responseType = '@backstage/cli/channel/response'; +const IPC_TIMEOUT_MS = 5000; + /** * The client side of an IPC communication channel. * @@ -78,43 +80,43 @@ export class BackstageIpcClient { body, }; - this.#sendMessage(request, (e: Error) => { - if (e) { - reject(e); + let timeout: NodeJS.Timeout | undefined = undefined; + + const messageHandler = (response: Response) => { + if (response?.type !== responseType) { + return; + } + if (response.id !== id) { return; } - let timeout: NodeJS.Timeout | undefined = undefined; + clearTimeout(timeout); + timeout = undefined; + process.removeListener('message', messageHandler); - const messageHandler = (response: Response) => { - if (response?.type !== responseType) { - return; - } - if (response.id !== id) { - return; + if ('error' in response) { + const error = new Error(response.error.message); + if (response.error.name) { + error.name = response.error.name; } + reject(error); + } else { + resolve(response.body as TResponseBody); + } + }; - if ('error' in response) { - const error = new Error(response.error.message); - if (response.error.name) { - error.name = response.error.name; - } - reject(error); - } else { - resolve(response.body as TResponseBody); - } + timeout = setTimeout(() => { + reject(new Error(`IPC request '${method}' with ID ${id} timed out`)); + process.removeListener('message', messageHandler); + }, IPC_TIMEOUT_MS); + timeout.unref(); - clearTimeout(timeout); - process.removeListener('message', messageHandler); - }; + process.addListener('message', messageHandler as () => void); - timeout = setTimeout(() => { - reject(new Error(`IPC request '${method}' with ID ${id} timed out`)); - process.removeListener('message', messageHandler); - }, 5000); - timeout.unref(); - - process.addListener('message', messageHandler as () => void); + this.#sendMessage(request, (e: Error) => { + if (e) { + reject(e); + } }); }); } diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 980569a9b6..92a7b57513 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,77 @@ # example-backend-next +## 0.0.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.7-next.0 + - @backstage/plugin-playlist-backend@0.3.9-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/plugin-adr-backend@0.4.2-next.0 + - @backstage/plugin-scaffolder-backend@1.17.3-next.0 + - @backstage/plugin-techdocs-backend@1.7.2-next.0 + - @backstage/plugin-todo-backend@0.3.3-next.0 + - @backstage/backend-defaults@0.2.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/plugin-app-backend@0.3.53-next.0 + - @backstage/plugin-azure-devops-backend@0.4.2-next.0 + - @backstage/plugin-badges-backend@0.3.2-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 + - @backstage/plugin-devtools-backend@0.2.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 + - @backstage/plugin-kubernetes-backend@0.12.2-next.0 + - @backstage/plugin-lighthouse-backend@0.3.2-next.0 + - @backstage/plugin-linguist-backend@0.5.2-next.0 + - @backstage/plugin-permission-backend@0.5.28-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-proxy-backend@0.4.2-next.0 + - @backstage/plugin-search-backend@1.4.5-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + +## 0.0.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/backend-defaults@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.0.15-next.3 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index edda247a5a..9e2dc78bfd 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.15-next.3", + "version": "0.0.16-next.0", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -18,7 +18,7 @@ "backstage" ], "scripts": { - "start": "EXPERIMENTAL_BACKEND_START=1 backstage-cli package start", + "start": "backstage-cli package start", "build": "backstage-cli package build", "lint": "backstage-cli package lint", "test": "backstage-cli package test", @@ -45,6 +45,7 @@ "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", + "@backstage/plugin-playlist-backend": "workspace:^", "@backstage/plugin-proxy-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-search-backend": "workspace:^", @@ -52,6 +53,7 @@ "@backstage/plugin-search-backend-module-explore": "workspace:^", "@backstage/plugin-search-backend-module-techdocs": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", + "@backstage/plugin-sonarqube-backend": "workspace:^", "@backstage/plugin-techdocs-backend": "workspace:^", "@backstage/plugin-todo-backend": "workspace:^" }, diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index 4e99732a11..9fda69635b 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -32,6 +32,7 @@ backend.add(import('@backstage/plugin-entity-feedback-backend')); backend.add(import('@backstage/plugin-kubernetes-backend/alpha')); backend.add(import('@backstage/plugin-lighthouse-backend')); backend.add(import('@backstage/plugin-linguist-backend')); +backend.add(import('@backstage/plugin-playlist-backend')); backend.add( import('@backstage/plugin-permission-backend-module-allow-all-policy'), ); @@ -44,5 +45,6 @@ backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha')); backend.add(import('@backstage/plugin-search-backend/alpha')); backend.add(import('@backstage/plugin-techdocs-backend/alpha')); backend.add(import('@backstage/plugin-todo-backend')); +backend.add(import('@backstage/plugin-sonarqube-backend')); backend.start(); diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index f94fc1e1e8..65c508997b 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/backend-openapi-utils +## 0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.2 + ## 0.0.4-next.0 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index f6441e3864..8fa83bd584 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-openapi-utils", "description": "OpenAPI typescript support.", - "version": "0.0.4-next.0", + "version": "0.0.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 49ddc69c33..684df46db9 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/backend-plugin-api +## 0.6.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.8 + +## 0.6.3 + +### Patch Changes + +- ba4506076e2d: Ensure that root scoped services cannot accept (at a type level) plugin scoped deps +- 474b792d6a43: Service factory functions are now marked as feature factories that can be installed in the backend. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + ## 0.6.3-next.3 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 57b877e1c7..b0da3fc80a 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.6.3-next.3", + "version": "0.6.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-plugin-manager/CHANGELOG.md b/packages/backend-plugin-manager/CHANGELOG.md index 3218866414..bbf909d421 100644 --- a/packages/backend-plugin-manager/CHANGELOG.md +++ b/packages/backend-plugin-manager/CHANGELOG.md @@ -1,5 +1,51 @@ # @backstage/backend-plugin-manager +## 0.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-events-backend@0.2.14-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-events-backend@0.2.12 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-scaffolder-node@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.0.1-next.1 ### Patch Changes diff --git a/packages/backend-plugin-manager/package.json b/packages/backend-plugin-manager/package.json index bba0793cce..acf15928b0 100644 --- a/packages/backend-plugin-manager/package.json +++ b/packages/backend-plugin-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-manager", "description": "Backstage plugin management backend", - "version": "0.0.1-next.1", + "version": "0.0.2-next.0", "private": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts b/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts index 8a17fe082a..093776e5b0 100644 --- a/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts +++ b/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts @@ -174,20 +174,23 @@ describe('backend-plugin-manager', () => { meta: { name: 'Error', message: expect.stringContaining( - `Cannot find module '${url.fileURLToPath( - location, - )}/dist/index.cjs.js' from `, + `Cannot find module '${path.resolve( + url.fileURLToPath(location), + 'dist/index.cjs.js', + )}' from `, ), _originalMessage: expect.stringContaining( - `Cannot find module '${url.fileURLToPath( - location, - )}/dist/index.cjs.js' from `, + `Cannot find module '${path.resolve( + url.fileURLToPath(location), + 'dist/index.cjs.js', + )}' from `, ), code: 'MODULE_NOT_FOUND', hint: '', - moduleName: `${url.fileURLToPath( - location, - )}/dist/index.cjs.js`, + moduleName: `${path.resolve( + url.fileURLToPath(location), + 'dist/index.cjs.js', + )}`, siblingWithSimilarExtensionFound: false, requireStack: undefined, }, @@ -274,7 +277,7 @@ describe('backend-plugin-manager', () => { { message: `an error occured while loading dynamic backend plugin 'backend-dynamic-plugin-test' from '${location}'`, meta: { - message: 'Unexpected identifier', + message: expect.stringContaining('Unexpected identifier'), name: 'SyntaxError', }, }, @@ -351,7 +354,9 @@ describe('backend-plugin-manager', () => { }, ])('$name', async (tc: TestCase): Promise<void> => { const plugin: ScannedPluginPackage = { - location: new URL(`file:///node_modules/jest-tests/${randomUUID()}`), + location: url.pathToFileURL( + path.resolve(`/node_modules/jest-tests/${randomUUID()}`), + ), manifest: tc.packageManifest, }; @@ -462,8 +467,8 @@ describe('backend-plugin-manager', () => { .spyOn(PluginScanner.prototype, 'scanRoot') .mockImplementation(async () => [ { - location: new URL( - 'file:///somewhere/dynamic-plugins-root/a-dynamic-plugin', + location: url.pathToFileURL( + path.resolve('/somewhere/dynamic-plugins-root/a-dynamic-plugin'), ), manifest: { name: 'test', @@ -528,10 +533,12 @@ describe('backend-plugin-manager', () => { expect(scanRootSpier).toHaveBeenCalled(); expect(mockedModuleLoader.bootstrap).toHaveBeenCalledWith( findPaths(__dirname).targetRoot, - ['/somewhere-else/a-dynamic-plugin'], + [path.resolve('/somewhere-else/a-dynamic-plugin')], ); expect(mockedModuleLoader.load).toHaveBeenCalledWith( - '/somewhere/dynamic-plugins-root/a-dynamic-plugin/dist/index.cjs.js', + path.resolve( + '/somewhere/dynamic-plugins-root/a-dynamic-plugin/dist/index.cjs.js', + ), ); }); }); diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts b/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts index 5ced3cfbab..e346bf749f 100644 --- a/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts +++ b/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts @@ -15,7 +15,7 @@ */ import { PluginScanner } from './plugin-scanner'; -import { Logs, MockedLogger } from '../__testUtils__/testUtils'; +import { LogContent, Logs, MockedLogger } from '../__testUtils__/testUtils'; import { Config, ConfigReader } from '@backstage/config'; import path, { join } from 'path'; import { ScannedPluginPackage } from './types'; @@ -126,10 +126,16 @@ describe('plugin-scanner', () => { expect(logger.logs).toEqual<Logs>({ infos: [ { - message: `rootDirectory changed (addDir - ${backstageRootDirectory}/first-dir/test-backend-plugin): scanning plugins again`, + message: `rootDirectory changed (addDir - ${path.resolve( + backstageRootDirectory, + 'first-dir/test-backend-plugin', + )}): scanning plugins again`, }, { - message: `rootDirectory changed (add - ${backstageRootDirectory}/first-dir/test-backend-plugin/package.json): scanning plugins again`, + message: `rootDirectory changed (add - ${path.resolve( + backstageRootDirectory, + 'first-dir/test-backend-plugin/package.json', + )}): scanning plugins again`, }, ], }); @@ -151,7 +157,10 @@ describe('plugin-scanner', () => { expect(logger.logs).toEqual<Logs>({ infos: [ { - message: `rootDirectory changed in Config from '${backstageRootDirectory}/first-dir' to '${backstageRootDirectory}/second-dir'`, + message: `rootDirectory changed in Config from '${path.resolve( + backstageRootDirectory, + 'first-dir', + )}' to '${path.resolve(backstageRootDirectory, 'second-dir')}'`, }, ], }); @@ -204,10 +213,16 @@ describe('plugin-scanner', () => { expect(logger.logs).toEqual<Logs>({ infos: [ { - message: `rootDirectory changed (addDir - ${backstageRootDirectory}/second-dir/second-test-backend-plugin): scanning plugins again`, + message: `rootDirectory changed (addDir - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin', + )}): scanning plugins again`, }, { - message: `rootDirectory changed (add - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/package.json): scanning plugins again`, + message: `rootDirectory changed (add - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/package.json', + )}): scanning plugins again`, }, ], }); @@ -263,22 +278,41 @@ describe('plugin-scanner', () => { expect(debug).toHaveBeenCalledTimes(4); }); - expect(logger.logs).toEqual<Logs>({ - debugs: [ - { - message: `rootDirectory changed (addDir - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/sub-directory): no need to scan plugins again`, - }, - { - message: `rootDirectory changed (add - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/not-package.json): no need to scan plugins again`, - }, - { - message: `rootDirectory changed (unlink - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/not-package.json): no need to scan plugins again`, - }, - { - message: `rootDirectory changed (unlinkDir - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/sub-directory): no need to scan plugins again`, - }, - ], - }); + const onWindows = path.sep === '\\'; + // Order of events is not fixed on Windows. + // Windows sometimes even adds a 'change' event when a file is unlinked. + // So let's not try to tes the detail of received events on Windows + if (!onWindows) { + // eslint-disable-next-line + expect(logger.logs).toEqual<Logs>({ + debugs: [ + { + message: `rootDirectory changed (addDir - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/sub-directory', + )}): no need to scan plugins again`, + }, + { + message: `rootDirectory changed (add - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/not-package.json', + )}): no need to scan plugins again`, + }, + { + message: `rootDirectory changed (unlink - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/not-package.json', + )}): no need to scan plugins again`, + }, + { + message: `rootDirectory changed (unlinkDir - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/sub-directory', + )}): no need to scan plugins again`, + }, + ], + }); + } logger.logs = {}; // Now check that removal of some plugin home directory triggers a new scan of plugins @@ -299,26 +333,39 @@ describe('plugin-scanner', () => { expect(scannedPlugins).toEqual([]); }); - expect(logger.logs).toEqual<Logs>({ - infos: [ + if (!onWindows) { + // eslint-disable-next-line + expect(logger.logs.infos).toEqual<LogContent[] | undefined>([ { - message: `rootDirectory changed (unlink - ${backstageRootDirectory}/second-dir/second-test-backend-plugin/package.json): scanning plugins again`, + message: `rootDirectory changed (unlink - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/package.json', + )}): scanning plugins again`, }, - ], - errors: [ - { - message: `failed to load dynamic plugin manifest from '${backstageRootDirectory}/second-dir/second-test-backend-plugin'`, - meta: { - code: 'ENOENT', - errno: -2, - message: `ENOENT: no such file or directory, open '${backstageRootDirectory}/second-dir/second-test-backend-plugin/package.json'`, - name: 'Error', - path: `${backstageRootDirectory}/second-dir/second-test-backend-plugin/package.json`, - syscall: 'open', - }, + ]); + } + expect(logger.logs.errors).toEqual<LogContent[] | undefined>([ + { + message: `failed to load dynamic plugin manifest from '${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin', + )}'`, + meta: { + code: 'ENOENT', + errno: path.sep === '\\' ? -4058 : -2, + message: `ENOENT: no such file or directory, open '${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/package.json', + )}'`, + name: 'Error', + path: `${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin/package.json', + )}`, + syscall: 'open', }, - ], - }); + }, + ]); logger.logs = {}; await rm( @@ -334,13 +381,19 @@ describe('plugin-scanner', () => { }); rootDirectorySubscriber.mockClear(); - expect(logger.logs).toEqual<Logs>({ - infos: [ - { - message: `rootDirectory changed (unlinkDir - ${backstageRootDirectory}/second-dir/second-test-backend-plugin): scanning plugins again`, - }, - ], - }); + if (!onWindows) { + // eslint-disable-next-line + expect(logger.logs).toEqual<Logs>({ + infos: [ + { + message: `rootDirectory changed (unlinkDir - ${path.resolve( + backstageRootDirectory, + 'second-dir/second-test-backend-plugin', + )}): scanning plugins again`, + }, + ], + }); + } logger.logs = {}; getOptional.mockReturnValue({ @@ -353,8 +406,16 @@ describe('plugin-scanner', () => { { message: 'failed to apply new config for dynamic plugins', meta: { - message: `Dynamic plugins under '/somewhere-else/second-dir' cannot access backstage modules in '${backstageRootDirectory}/node_modules'. -Please add '${backstageRootDirectory}/node_modules' to the 'NODE_PATH' when running the backstage backend.`, + message: `Dynamic plugins under '${path.resolve( + '/somewhere-else/second-dir', + )}' cannot access backstage modules in '${path.resolve( + backstageRootDirectory, + 'node_modules', + )}'. +Please add '${path.resolve( + backstageRootDirectory, + 'node_modules', + )}' to the 'NODE_PATH' when running the backstage backend.`, name: 'Error', }, }, diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts b/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts index 25f07baeaa..6a36a377f5 100644 --- a/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts +++ b/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts @@ -20,6 +20,7 @@ import { JsonObject } from '@backstage/types'; import { Logs, MockedLogger } from '../__testUtils__/testUtils'; import { ConfigReader } from '@backstage/config'; import path from 'path'; +import * as url from 'url'; import { ScannedPluginPackage } from './types'; describe('plugin-scanner', () => { @@ -73,7 +74,7 @@ describe('plugin-scanner', () => { rootDirectory: 'dist-dynamic', }, }, - expectedRootDirectory: '/backstageRoot/dist-dynamic', + expectedRootDirectory: path.resolve('/backstageRoot/dist-dynamic'), }, { name: 'valid config with absolute root directory path inside the backstage root', @@ -90,7 +91,7 @@ describe('plugin-scanner', () => { rootDirectory: '/backstageRoot/dist-dynamic', }, }, - expectedRootDirectory: '/backstageRoot/dist-dynamic', + expectedRootDirectory: path.resolve('/backstageRoot/dist-dynamic'), }, { name: 'valid config with absolute root directory path outside the backstage root', @@ -107,8 +108,14 @@ describe('plugin-scanner', () => { rootDirectory: '/somewhere/dist-dynamic', }, }, - expectedError: `Dynamic plugins under '/somewhere/dist-dynamic' cannot access backstage modules in '/backstageRoot/node_modules'. -Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the backstage backend.`, + expectedError: `Dynamic plugins under '${path.resolve( + '/somewhere/dist-dynamic', + )}' cannot access backstage modules in '${path.resolve( + '/backstageRoot/node_modules', + )}'. +Please add '${path.resolve( + '/backstageRoot/node_modules', + )}' to the 'NODE_PATH' when running the backstage backend.`, }, { name: 'valid config with absolute root directory path outside the backstage root but with backstage root included in NODE_PATH', @@ -126,9 +133,13 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, }, environment: { - NODE_PATH: `/somewhere-else${path.delimiter}/backstageRoot/node_modules${path.delimiter}/anywhere-else`, + NODE_PATH: `${path.resolve('/somewhere-else')}${ + path.delimiter + }${path.resolve('/backstageRoot', 'node_modules')}${ + path.delimiter + }${path.resolve('anywhere-else')}`, }, - expectedRootDirectory: '/somewhere/dist-dynamic', + expectedRootDirectory: path.resolve('/somewhere/dist-dynamic'), }, { name: 'invalid config: dynamicPlugins not an object', @@ -273,8 +284,8 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin', + location: url.pathToFileURL( + path.resolve('/backstageRoot/dist-dynamic/test-backend-plugin'), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -318,8 +329,8 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin', + location: url.pathToFileURL( + path.resolve('/backstageRoot/dist-dynamic/test-backend-plugin'), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -347,8 +358,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { infos: [ { - message: - "skipping '/backstageRoot/dist-dynamic/test-backend-plugin' since it is not a directory", + message: `skipping '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}' since it is not a directory`, }, ], }, @@ -377,8 +389,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { infos: [ { - message: - "skipping '/backstageRoot/dist-dynamic/test-backend-plugin' since it is not a directory", + message: `skipping '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}' since it is not a directory`, }, ], }, @@ -421,8 +434,8 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin', + location: url.pathToFileURL( + path.resolve('/backstageRoot/dist-dynamic/test-backend-plugin'), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -471,8 +484,10 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin/alpha', + location: url.pathToFileURL( + path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin/alpha', + ), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -511,8 +526,8 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac }, expectedPluginPackages: [ { - location: new URL( - 'file:///backstageRoot/dist-dynamic/test-backend-plugin', + location: url.pathToFileURL( + path.resolve('/backstageRoot/dist-dynamic/test-backend-plugin'), ), manifest: { name: 'test-backend-plugin-dynamic', @@ -525,8 +540,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { warns: [ { - message: - "skipping '/backstageRoot/dist-dynamic/test-backend-plugin/alpha' since it is not a directory", + message: `skipping '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin/alpha', + )}' since it is not a directory`, }, ], }, @@ -567,11 +583,12 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { errors: [ { - message: - "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin/alpha'", + message: `failed to load dynamic plugin manifest from '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin/alpha', + )}'`, meta: { name: 'SyntaxError', - message: 'Unexpected token i in JSON at position 0', + message: expect.stringContaining('Unexpected token'), }, }, ], @@ -600,11 +617,12 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { errors: [ { - message: - "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin'", + message: `failed to load dynamic plugin manifest from '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}'`, meta: { name: 'SyntaxError', - message: 'Unexpected token i in JSON at position 0', + message: expect.stringContaining('Unexpected token'), }, }, ], @@ -637,8 +655,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { errors: [ { - message: - "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin'", + message: `failed to load dynamic plugin manifest from '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}'`, meta: { name: 'Error', message: "field 'backstage.role' not found in 'package.json'", @@ -674,8 +693,9 @@ Please add '/backstageRoot/node_modules' to the 'NODE_PATH' when running the bac expectedLogs: { errors: [ { - message: - "failed to load dynamic plugin manifest from '/backstageRoot/dist-dynamic/test-backend-plugin'", + message: `failed to load dynamic plugin manifest from '${path.resolve( + '/backstageRoot/dist-dynamic/test-backend-plugin', + )}'`, meta: { name: 'Error', message: "field 'main' not found in 'package.json'", diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts b/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts index bdcf786619..e226a1a8ad 100644 --- a/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts +++ b/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts @@ -84,13 +84,13 @@ export class PluginScanner { } const dynamicPluginsRootPath = path.isAbsolute(dynamicPlugins.rootDirectory) - ? dynamicPlugins.rootDirectory + ? path.resolve(dynamicPlugins.rootDirectory) : path.resolve(this.backstageRoot, dynamicPlugins.rootDirectory); if ( !path - .dirname(path.normalize(dynamicPluginsRootPath)) - .startsWith(path.normalize(this.backstageRoot)) + .dirname(dynamicPluginsRootPath) + .startsWith(path.resolve(this.backstageRoot)) ) { const nodePath = process.env.NODE_PATH; const backstageNodeModules = path.resolve( diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index cb995f8e05..d8a7cc3754 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/backend-tasks +## 0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.5.8 + +### Patch Changes + +- 8fd91547cd0b: When starting a task that existed before, with a faster schedule than it + previously had, the task will now correctly obey the faster schedule + immediately. Before this fix, the new schedule was only obeyed after the next + pending (according to the old schedule) run had completed. +- 62f448edb0b5: Use `readDurationFromConfig` from the config package +- 74604806aae8: Avoid starting task janitor in tests. +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + ## 0.5.8-next.3 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 10d07dbb40..f4118b8098 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.5.8-next.3", + "version": "0.5.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts index c46743ae59..4fd4949478 100644 --- a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts +++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts @@ -82,14 +82,18 @@ describe('LocalTaskWorker', () => { it('can trigger to abort wait', async () => { const fn = jest.fn(); + const controller = new AbortController(); const worker = new LocalTaskWorker('a', fn, logger); - worker.start({ - version: 2, - initialDelayDuration: 'PT0.2S', - cadence: 'PT0.2S', - timeoutAfterDuration: 'PT1S', - }); + worker.start( + { + version: 2, + initialDelayDuration: 'PT0.2S', + cadence: 'PT0.2S', + timeoutAfterDuration: 'PT1S', + }, + { signal: controller.signal }, + ); // TODO(freben): Rewrite to fake timers - tried, but it wouldn't work expect(fn).toHaveBeenCalledTimes(0); @@ -100,5 +104,6 @@ describe('LocalTaskWorker', () => { worker.trigger(); await new Promise(r => setTimeout(r, 10)); expect(fn).toHaveBeenCalledTimes(2); + controller.abort(); }); }); diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.test.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.test.ts index efbad2e8b6..50bea27d27 100644 --- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.test.ts +++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.test.ts @@ -22,6 +22,7 @@ import waitForExpect from 'wait-for-expect'; import { migrateBackendTasks } from '../database/migrateBackendTasks'; import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables'; import { PluginTaskSchedulerJanitor } from './PluginTaskSchedulerJanitor'; +import { createTestScopedSignal } from './__testUtils__/createTestScopedSignal'; const insertTask = async (knex: Knex, task: DbTasksRow) => { return knex<DbTasksRow>(DB_TASKS_TABLE) @@ -45,6 +46,7 @@ describe('PluginTaskSchedulerJanitor', () => { 'MYSQL_8', ], }); + const testScopedSignal = createTestScopedSignal(); jest.setTimeout(60_000); @@ -77,8 +79,7 @@ describe('PluginTaskSchedulerJanitor', () => { logger, }); - const abortController = new AbortController(); - worker.start(abortController.signal); + worker.start(testScopedSignal()); await waitForExpect(async () => { await expect(getTask(knex)).resolves.toEqual( @@ -90,8 +91,6 @@ describe('PluginTaskSchedulerJanitor', () => { }), ); }); - - abortController.abort(); }, ); }); diff --git a/packages/backend-tasks/src/tasks/TaskScheduler.test.ts b/packages/backend-tasks/src/tasks/TaskScheduler.test.ts index 6aa77dd7fe..8e419437bc 100644 --- a/packages/backend-tasks/src/tasks/TaskScheduler.test.ts +++ b/packages/backend-tasks/src/tasks/TaskScheduler.test.ts @@ -19,6 +19,7 @@ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { Duration } from 'luxon'; import waitForExpect from 'wait-for-expect'; import { TaskScheduler } from './TaskScheduler'; +import { createTestScopedSignal } from './__testUtils__/createTestScopedSignal'; jest.setTimeout(60_000); @@ -27,6 +28,7 @@ describe('TaskScheduler', () => { const databases = TestDatabases.create({ ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3', 'MYSQL_8'], }); + const testScopedSignal = createTestScopedSignal(); async function createDatabase( databaseId: TestDatabaseId, @@ -51,6 +53,7 @@ describe('TaskScheduler', () => { id: 'task1', timeout: Duration.fromMillis(5000), frequency: Duration.fromMillis(5000), + signal: testScopedSignal(), fn, }); @@ -71,6 +74,7 @@ describe('TaskScheduler', () => { id: 'task2', timeout: Duration.fromMillis(5000), frequency: { cron: '* * * * * *' }, + signal: testScopedSignal(), fn, }); diff --git a/packages/backend-tasks/src/tasks/TaskScheduler.ts b/packages/backend-tasks/src/tasks/TaskScheduler.ts index fe81a0054e..6b6436e52a 100644 --- a/packages/backend-tasks/src/tasks/TaskScheduler.ts +++ b/packages/backend-tasks/src/tasks/TaskScheduler.ts @@ -80,12 +80,14 @@ export class TaskScheduler { await migrateBackendTasks(knex); } - const janitor = new PluginTaskSchedulerJanitor({ - knex, - waitBetweenRuns: Duration.fromObject({ minutes: 1 }), - logger: opts.logger, - }); - janitor.start(); + if (process.env.NODE_ENV !== 'test') { + const janitor = new PluginTaskSchedulerJanitor({ + knex, + waitBetweenRuns: Duration.fromObject({ minutes: 1 }), + logger: opts.logger, + }); + janitor.start(); + } return knex; }); diff --git a/packages/backend-tasks/src/tasks/TaskWorker.test.ts b/packages/backend-tasks/src/tasks/TaskWorker.test.ts index 71d02274e2..3022f59060 100644 --- a/packages/backend-tasks/src/tasks/TaskWorker.test.ts +++ b/packages/backend-tasks/src/tasks/TaskWorker.test.ts @@ -22,6 +22,7 @@ import { migrateBackendTasks } from '../database/migrateBackendTasks'; import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables'; import { TaskWorker } from './TaskWorker'; import { TaskSettingsV2 } from './types'; +import { createTestScopedSignal } from './__testUtils__/createTestScopedSignal'; jest.setTimeout(60_000); @@ -30,6 +31,7 @@ describe('TaskWorker', () => { const databases = TestDatabases.create({ ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3', 'MYSQL_8'], }); + const testScopedSignal = createTestScopedSignal(); beforeEach(() => { jest.resetAllMocks(); @@ -135,7 +137,7 @@ describe('TaskWorker', () => { }; const checkFrequency = Duration.fromObject({ milliseconds: 100 }); const worker = new TaskWorker('task1', fn, knex, logger, checkFrequency); - worker.start(settings); + worker.start(settings, { signal: testScopedSignal() }); await waitForExpect(() => { expect(logger.error).toHaveBeenCalled(); @@ -158,7 +160,7 @@ describe('TaskWorker', () => { }; const checkFrequency = Duration.fromObject({ milliseconds: 100 }); const worker = new TaskWorker('task1', fn, knex, logger, checkFrequency); - worker.start(settings); + worker.start(settings, { signal: testScopedSignal() }); await waitForExpect(() => { expect(fn).toHaveBeenCalledTimes(3); @@ -321,7 +323,7 @@ describe('TaskWorker', () => { logger, Duration.fromMillis(10), ); - await worker2.start(settings); + await worker2.start(settings, { signal: testScopedSignal() }); // We eventually abort the first worker just to make sure that the second // one for sure will get a go at running the task diff --git a/packages/backend-tasks/src/tasks/__testUtils__/createTestScopedSignal.ts b/packages/backend-tasks/src/tasks/__testUtils__/createTestScopedSignal.ts new file mode 100644 index 0000000000..6a497ea266 --- /dev/null +++ b/packages/backend-tasks/src/tasks/__testUtils__/createTestScopedSignal.ts @@ -0,0 +1,28 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function createTestScopedSignal(): () => AbortSignal { + let testAbortController = new AbortController(); + + beforeEach(() => { + testAbortController = new AbortController(); + }); + afterEach(() => { + testAbortController.abort(); + }); + + return () => testAbortController.signal; +} diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index d6cde7697b..ba53fae7f7 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/backend-test-utils +## 0.2.6-next.0 + +### Patch Changes + +- 5ddc03813e: Remove third type parameter used for `MockInstance`, in order to be compatible with older versions of `@types/jest`. +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-app-api@0.5.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/types@1.1.1 + +## 0.2.3 + +### Patch Changes + +- 58cb5e5cea7b: Introduced a new utility for testing service factories, `ServiceFactoryTester`. +- 202e52c5e361: Add support for installing backend features via module imports, for example `startTestBackend({ features: [import('my-plugin')] })`. +- 9fb3b5373c45: Extended `mockService` to also include mocked variants, for example `mockServices.lifecycle.mock()`. The returned mocked implementation will have a `factory` property which is a service factory for itself. You can also pass a partial implementation of the service to the mock function to use a mock implementation of specific methods. +- eb1594da5812: Serialize test database shutdown, and add logging +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.3-next.3 ### Patch Changes diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 43e671e440..4a27ac21a9 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -210,10 +210,9 @@ export type ServiceMock<TService> = { factory: ServiceFactory<TService>; } & { [Key in keyof TService]: TService[Key] extends ( - this: infer This, ...args: infer Args ) => infer Return - ? TService[Key] & jest.MockInstance<Return, Args, This> + ? TService[Key] & jest.MockInstance<Return, Args> : TService[Key]; }; diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 1ee0522b01..5274b49ce2 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.2.3-next.3", + "version": "0.2.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index 22fba38fda..bd684f7560 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -64,10 +64,9 @@ export type ServiceMock<TService> = { factory: ServiceFactory<TService>; } & { [Key in keyof TService]: TService[Key] extends ( - this: infer This, ...args: infer Args ) => infer Return - ? TService[Key] & jest.MockInstance<Return, Args, This> + ? TService[Key] & jest.MockInstance<Return, Args> : TService[Key]; }; diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index c0bf093f05..5d89212a42 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,123 @@ # example-backend +## 0.2.88-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@1.3.8-next.0 + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-playlist-backend@0.3.9-next.0 + - @backstage/plugin-rollbar-backend@0.1.50-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-tech-insights-backend@0.5.19-next.0 + - @backstage/plugin-code-coverage-backend@0.2.19-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.22-next.0 + - @backstage/backend-common@0.19.7-next.0 + - example-app@0.2.88-next.0 + - @backstage/plugin-adr-backend@0.4.2-next.0 + - @backstage/plugin-scaffolder-backend@1.17.3-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.6-next.0 + - @backstage/plugin-techdocs-backend@1.7.2-next.0 + - @backstage/plugin-todo-backend@0.3.3-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-app-backend@0.3.53-next.0 + - @backstage/plugin-auth-backend@0.19.2-next.0 + - @backstage/plugin-azure-devops-backend@0.4.2-next.0 + - @backstage/plugin-azure-sites-backend@0.1.15-next.0 + - @backstage/plugin-badges-backend@0.3.2-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-devtools-backend@0.2.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 + - @backstage/plugin-events-backend@0.2.14-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-explore-backend@0.0.15-next.0 + - @backstage/plugin-graphql-backend@0.1.43-next.0 + - @backstage/plugin-jenkins-backend@0.2.8-next.0 + - @backstage/plugin-kafka-backend@0.3.2-next.0 + - @backstage/plugin-kubernetes-backend@0.12.2-next.0 + - @backstage/plugin-lighthouse-backend@0.3.2-next.0 + - @backstage/plugin-linguist-backend@0.5.2-next.0 + - @backstage/plugin-nomad-backend@0.1.7-next.0 + - @backstage/plugin-permission-backend@0.5.28-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-proxy-backend@0.4.2-next.0 + - @backstage/plugin-search-backend@1.4.5-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.14-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.37-next.0 + - @backstage/plugin-tech-insights-node@0.4.11-next.0 + +## 0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-pg@0.5.12 + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-auth-backend@0.19.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-kafka-backend@0.3.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-events-backend@0.2.12 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.6 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/plugin-code-coverage-backend@0.2.17 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-tech-insights-backend@0.5.17 + - example-app@0.2.87 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-playlist-backend@0.3.7 + - @backstage/plugin-rollbar-backend@0.1.48 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4 + - @backstage/plugin-azure-sites-backend@0.1.13 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-explore-backend@0.0.13 + - @backstage/plugin-graphql-backend@0.1.41 + - @backstage/plugin-jenkins-backend@0.2.6 + - @backstage/plugin-nomad-backend@0.1.5 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.20 + - @backstage/plugin-search-backend-node@1.2.7 + - @backstage/plugin-tech-insights-node@0.4.9 + ## 0.2.87-next.3 ### Patch Changes diff --git a/packages/backend/Dockerfile b/packages/backend/Dockerfile index da25f9736c..5667209330 100644 --- a/packages/backend/Dockerfile +++ b/packages/backend/Dockerfile @@ -9,7 +9,7 @@ # # Once the commands have been run, you can build the image using `yarn build-image` -FROM node:16-bullseye-slim +FROM node:18-bookworm-slim # Install sqlite3 dependencies. You can skip this if you don't use sqlite3 in the image, # in which case you should also move better-sqlite3 to "devDependencies" in package.json. @@ -18,9 +18,15 @@ FROM node:16-bullseye-slim RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ apt-get update && \ - apt-get install -y --no-install-recommends libsqlite3-dev python3 python3-pip build-essential && \ - yarn config set python /usr/bin/python3 && \ - pip3 install mkdocs-techdocs-core==1.1.7 + apt-get install -y --no-install-recommends libsqlite3-dev python3 python3-pip python3-venv build-essential && \ + yarn config set python /usr/bin/python3 + +# Set up a virtual environment for mkdocs-techdocs-core. +ENV VIRTUAL_ENV=/opt/venv +RUN python3 -m venv $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +RUN pip3 install mkdocs-techdocs-core==1.1.7 # From here on we use the least-privileged `node` user to run the backend. WORKDIR /app diff --git a/packages/backend/package.json b/packages/backend/package.json index 7ff8845ed6..2f2ae70e21 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.87-next.3", + "version": "0.2.88-next.0", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 14af941a8f..06231c6c7a 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/catalog-client +## 1.4.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + ## 1.4.4-next.2 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index e1604976ae..b7fcdb549e 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-client", "description": "An isomorphic client for the catalog backend", - "version": "1.4.4-next.2", + "version": "1.4.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 628d080280..3972ea9761 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/catalog-model +## 1.4.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + ## 1.4.2-next.2 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index bf37cc107f..cb6dbb6f31 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-model", "description": "Types and validators that help describe the model of a Backstage Catalog", - "version": "1.4.2-next.2", + "version": "1.4.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index bb6e2756a0..30b9670251 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/cli-common +## 0.1.13-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. + ## 0.1.12 ### Patch Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index 38779eba07..8aed6881e2 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli-common", "description": "Common functionality used by cli, backend, and create-app", - "version": "0.1.12", + "version": "0.1.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { @@ -33,7 +33,7 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@types/node": "^16.0.0" + "@types/node": "^18.17.8" }, "files": [ "dist" diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index f008ec556f..ab16a5d036 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/cli-node +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/cli-common@0.1.12 + ## 0.1.4-next.0 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 084123ff5c..a1062c2783 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli-node", "description": "Node.js library for Backstage CLIs", - "version": "0.1.4-next.0", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli-node/src/monorepo/Lockfile.test.ts b/packages/cli-node/src/monorepo/Lockfile.test.ts index 01574779b2..41beeb4408 100644 --- a/packages/cli-node/src/monorepo/Lockfile.test.ts +++ b/packages/cli-node/src/monorepo/Lockfile.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import mockFs from 'mock-fs'; import { Lockfile } from './Lockfile'; const LEGACY_HEADER = `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. @@ -31,10 +30,6 @@ __metadata: `; describe('New Lockfile', () => { - afterEach(() => { - mockFs.restore(); - }); - describe('diff', () => { const lockfileLegacyA = Lockfile.parse(`${LEGACY_HEADER} a@^1: diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 0ad4278b2e..f9a93b9b44 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,60 @@ # @backstage/cli +## 0.23.0-next.0 + +### Minor Changes + +- 7077dbf131: The new backend start command that used to be enabled by setting `EXPERIMENTAL_BACKEND_START` is now the default. To revert to the old behavior, set `LEGACY_BACKEND_START` instead. + + This new command is no longer based on Webpack, but instead uses Node.js loaders to transpile on the fly. Rather than hot reloading modules the entire backend is now restarted on change, but the SQLite database state is still maintained across restarts via a parent process. + +### Patch Changes + +- 68158034e8: Fix for the new backend `start` command to make it work on Windows. +- 21cd3b1b24: Added a template for creating `node-library` packages with `yarn new`. +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- 3ef18f8c06: Explicitly set `exports: 'named'` for CJS builds, ensuring that they have e.g. `exports["default"] = catalogPlugin;` +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/config@1.1.0 + - @backstage/release-manifests@0.0.10 + - @backstage/catalog-model@1.4.2 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/eslint-plugin@0.1.3 + - @backstage/types@1.1.1 + +## 0.22.13 + +### Patch Changes + +- 04eabd21bee4: Added the ability to specify the listen address for the `--inspect` and `--inspect-brk` command. You can now set the `ip` and port of the `inspect` and `inspectBrk` by adding for example `--inspect=0.0.0.0:9229` +- 278d9326eb40: Added the ability to create a plain backend module with the `new` command. +- 4d5eeec52d80: Add ESM loader for the experimental backend start command. +- 3494c502aba7: Added a new `repo fix` command that fixes auto-fixable problems in all packages. Initially the command fixes package export declarations, as well as marks all non-bundled frontend packages as side-effect free. Marking packages as free of side-effects can drastically reduce the Webpack bundle size. +- f36113ca2305: Add experimental support for frontend package discovery. +- a23fce763c6a: Fixed a bug where package exports entry points could not be `.tsx` files. +- 8cec7664e146: Removed `@types/node` dependency +- ea779492ad88: Updated dependency `run-script-webpack-plugin` to `^0.2.0`. +- 4af4defcc114: When running `version:bump` it will now log duplicates instead of throwing an error +- 71d4368ae5cc: Added support for the `dev/index` entry point for backend plugins and modules. +- 956d226eeeee: Add `"sideEffects": false` to `package.json` in frontend package templates. This can be added to existing packages using the new `yarn fix` command. +- cd7331587eb3: Removed the experimental `package fix` command that was used to automatically add dependencies to `package.json`, but has since been replaced by the `no-undeclared-imports` rule from `@backstage/eslint-plugin`. +- 219b46ae1a50: Include default alpha export during package detection +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/release-manifests@0.0.10 + - @backstage/types@1.1.1 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + - @backstage/eslint-plugin@0.1.3 + ## 0.22.13-next.3 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 6229432f91..2f9f6109f0 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.22.13-next.3", + "version": "0.23.0-next.0", "publishConfig": { "access": "public" }, @@ -78,6 +78,7 @@ "cross-fetch": "^3.1.5", "cross-spawn": "^7.0.3", "css-loader": "^6.5.1", + "ctrlc-windows": "^2.1.0", "diff": "^5.0.0", "esbuild": "^0.19.0", "esbuild-loader": "^2.18.0", @@ -158,7 +159,7 @@ "@types/inquirer": "^8.1.3", "@types/minimatch": "^5.0.0", "@types/mock-fs": "^4.13.0", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/npm-packlist": "^3.0.0", "@types/recursive-readdir": "^2.2.0", "@types/rollup-plugin-peer-deps-external": "^2.2.0", @@ -168,7 +169,7 @@ "@types/terser-webpack-plugin": "^5.0.4", "@types/yarnpkg__lockfile": "^1.1.4", "del": "^7.0.0", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "nodemon": "^3.0.1", "ts-node": "^10.0.0", diff --git a/packages/cli/src/commands/start/startBackend.ts b/packages/cli/src/commands/start/startBackend.ts index 622eeb9d1b..967a1108a0 100644 --- a/packages/cli/src/commands/start/startBackend.ts +++ b/packages/cli/src/commands/start/startBackend.ts @@ -36,7 +36,7 @@ export async function startBackend(options: StartBackendOptions) { }); await waitForExit(); - } else if (process.env.EXPERIMENTAL_BACKEND_START) { + } else if (!process.env.LEGACY_BACKEND_START) { const waitForExit = await startBackendExperimental({ entry: 'src/index', checksEnabled: false, // not supported diff --git a/packages/cli/src/lib/builder/config.ts b/packages/cli/src/lib/builder/config.ts index 99d8e96498..f614581320 100644 --- a/packages/cli/src/lib/builder/config.ts +++ b/packages/cli/src/lib/builder/config.ts @@ -90,6 +90,7 @@ export async function makeRollupConfigs( chunkFileNames: `cjs/[name]-[hash].cjs.js`, format: 'commonjs', sourcemap: true, + exports: 'named', }); } if (options.outputs.has(Output.esm)) { diff --git a/packages/cli/src/lib/experimental/startBackendExperimental.ts b/packages/cli/src/lib/experimental/startBackendExperimental.ts index 3bc603a9da..578fd1c747 100644 --- a/packages/cli/src/lib/experimental/startBackendExperimental.ts +++ b/packages/cli/src/lib/experimental/startBackendExperimental.ts @@ -18,10 +18,11 @@ import { FSWatcher, watch } from 'chokidar'; import { BackendServeOptions } from '../bundler/types'; import type { ChildProcess } from 'child_process'; +import { ctrlc } from 'ctrlc-windows'; import { IpcServer } from './IpcServer'; import { ServerDataStore } from './ServerDataStore'; import debounce from 'lodash/debounce'; -import { fileURLToPath } from 'url'; +import { fileURLToPath, pathToFileURL } from 'url'; import { isAbsolute as isAbsolutePath } from 'path'; import { paths } from '../paths'; import spawn from 'cross-spawn'; @@ -30,7 +31,7 @@ const loaderArgs = [ '--require', require.resolve('@esbuild-kit/cjs-loader'), '--loader', - require.resolve('@esbuild-kit/esm-loader'), + pathToFileURL(require.resolve('@esbuild-kit/esm-loader')).toString(), // Windows prefers a URL here ]; export async function startBackendExperimental(options: BackendServeOptions) { @@ -57,7 +58,11 @@ export async function startBackendExperimental(options: BackendServeOptions) { if (child && !child.killed && child.exitCode === null) { // We always wait for the existing process to exit, to make sure we don't get IPC conflicts shutdownPromise = new Promise(resolve => child!.once('exit', resolve)); - child.kill(); + if (process.platform === 'win32' && child.pid) { + ctrlc(child.pid); + } else { + child.kill(); + } await shutdownPromise; shutdownPromise = undefined; } diff --git a/packages/cli/src/lib/new/factories/index.ts b/packages/cli/src/lib/new/factories/index.ts index a4bcb2b721..44d687eda2 100644 --- a/packages/cli/src/lib/new/factories/index.ts +++ b/packages/cli/src/lib/new/factories/index.ts @@ -17,6 +17,7 @@ export { frontendPlugin } from './frontendPlugin'; export { backendPlugin } from './backendPlugin'; export { backendModule } from './backendModule'; +export { nodeLibraryPackage } from './nodeLibraryPackage'; export { webLibraryPackage } from './webLibraryPackage'; export { pluginCommon } from './pluginCommon'; export { pluginNode } from './pluginNode'; diff --git a/packages/cli/src/lib/new/factories/nodeLibraryPackage.test.ts b/packages/cli/src/lib/new/factories/nodeLibraryPackage.test.ts new file mode 100644 index 0000000000..d0b08f4f06 --- /dev/null +++ b/packages/cli/src/lib/new/factories/nodeLibraryPackage.test.ts @@ -0,0 +1,152 @@ +/* + * 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 fs from 'fs-extra'; +import mockFs from 'mock-fs'; +import { resolve as resolvePath, join as joinPath } from 'path'; +import { paths } from '../../paths'; +import { Task } from '../../tasks'; +import { FactoryRegistry } from '../FactoryRegistry'; +import { createMockOutputStream, mockPaths } from './common/testUtils'; +import { nodeLibraryPackage } from './nodeLibraryPackage'; + +describe('nodeLibraryPackage factory', () => { + beforeEach(() => { + mockPaths({ + targetRoot: '/root', + }); + }); + + afterEach(() => { + mockFs.restore(); + jest.resetAllMocks(); + }); + + it('should create a node library package', async () => { + const expectedNodeLibraryPackageName = 'test'; + + mockFs({ + '/root': { + packages: mockFs.directory(), + }, + [paths.resolveOwn('templates')]: mockFs.load( + paths.resolveOwn('templates'), + ), + }); + + const options = await FactoryRegistry.populateOptions(nodeLibraryPackage, { + id: 'test', // name of node library package + }); + + let modified = false; + + const [output, mockStream] = createMockOutputStream(); + jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream); + jest.spyOn(Task, 'forCommand').mockResolvedValue(); + + await nodeLibraryPackage.create(options, { + private: true, + isMonoRepo: true, + defaultVersion: '1.0.0', + markAsModified: () => { + modified = true; + }, + createTemporaryDirectory: () => fs.mkdtemp('test'), + }); + + expect(modified).toBe(true); + + expect(output).toEqual([ + '', + `Creating node-library package ${expectedNodeLibraryPackageName}`, + 'Checking Prerequisites:', + `availability ${joinPath('packages', expectedNodeLibraryPackageName)}`, + 'creating temp dir', + 'Executing Template:', + 'copying .eslintrc.js', + 'templating README.md.hbs', + 'templating package.json.hbs', + 'templating index.ts.hbs', + 'copying setupTests.ts', + 'Installing:', + `moving ${joinPath('packages', expectedNodeLibraryPackageName)}`, + ]); + + await expect( + fs.readJson( + `/root/packages/${expectedNodeLibraryPackageName}/package.json`, + ), + ).resolves.toEqual( + expect.objectContaining({ + name: expectedNodeLibraryPackageName, + private: true, + version: '1.0.0', + }), + ); + + expect(Task.forCommand).toHaveBeenCalledTimes(2); + expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { + cwd: resolvePath(`/root/packages/${expectedNodeLibraryPackageName}`), + optional: true, + }); + expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', { + cwd: resolvePath(`/root/packages/${expectedNodeLibraryPackageName}`), + optional: true, + }); + }); + + it('should create a node library plugin with options and codeowners', async () => { + const expectedNodeLibraryPackageName = 'test'; + + mockFs({ + '/root': { + CODEOWNERS: '', + packages: mockFs.directory(), + }, + [paths.resolveOwn('templates')]: mockFs.load( + paths.resolveOwn('templates'), + ), + }); + + const options = await FactoryRegistry.populateOptions(nodeLibraryPackage, { + id: 'test', + owner: '@backstage/test-owners', + }); + + const [, mockStream] = createMockOutputStream(); + jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream); + jest.spyOn(Task, 'forCommand').mockResolvedValue(); + + await nodeLibraryPackage.create(options, { + scope: 'internal', + private: true, + isMonoRepo: false, + defaultVersion: '1.0.0', + markAsModified: () => {}, + createTemporaryDirectory: () => fs.mkdtemp('test'), + }); + + expect(Task.forCommand).toHaveBeenCalledTimes(2); + expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { + cwd: resolvePath(`/root/${expectedNodeLibraryPackageName}`), + optional: true, + }); + expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', { + cwd: resolvePath(`/root/${expectedNodeLibraryPackageName}`), + optional: true, + }); + }); +}); diff --git a/packages/cli/src/lib/new/factories/nodeLibraryPackage.ts b/packages/cli/src/lib/new/factories/nodeLibraryPackage.ts new file mode 100644 index 0000000000..4b1fda4abc --- /dev/null +++ b/packages/cli/src/lib/new/factories/nodeLibraryPackage.ts @@ -0,0 +1,71 @@ +/* + * 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 chalk from 'chalk'; +import { paths } from '../../paths'; +import { addCodeownersEntry, getCodeownersFilePath } from '../../codeowners'; +import { createFactory, CreateContext } from '../types'; +import { Task } from '../../tasks'; +import { ownerPrompt, pluginIdPrompt } from './common/prompts'; +import { executePluginPackageTemplate } from './common/tasks'; + +type Options = { + id: string; + owner?: string; + codeOwnersPath?: string; +}; + +export const nodeLibraryPackage = createFactory<Options>({ + name: 'node-library', + description: 'A new node-library package', + optionsDiscovery: async () => ({ + codeOwnersPath: await getCodeownersFilePath(paths.targetRoot), + }), + optionsPrompts: [pluginIdPrompt(), ownerPrompt()], + async create(options: Options, ctx: CreateContext) { + const { id } = options; + const name = ctx.scope ? `@${ctx.scope}/${id}` : `${id}`; + + Task.log(); + Task.log(`Creating node-library package ${chalk.cyan(name)}`); + + const targetDir = ctx.isMonoRepo + ? paths.resolveTargetRoot('packages', id) + : paths.resolveTargetRoot(`${id}`); + + await executePluginPackageTemplate(ctx, { + targetDir, + templateName: 'node-library-package', + values: { + id, + name, + pluginVersion: ctx.defaultVersion, + privatePackage: ctx.private, + npmRegistry: ctx.npmRegistry, + }, + }); + + if (options.owner) { + await addCodeownersEntry(`/packages/${id}`, options.owner); + } + + await Task.forCommand('yarn install', { cwd: targetDir, optional: true }); + await Task.forCommand('yarn lint --fix', { + cwd: targetDir, + optional: true, + }); + }, +}); diff --git a/plugins/catalog-customized/.eslintrc.js b/packages/cli/templates/node-library-package/.eslintrc.js similarity index 100% rename from plugins/catalog-customized/.eslintrc.js rename to packages/cli/templates/node-library-package/.eslintrc.js diff --git a/packages/cli/templates/node-library-package/README.md.hbs b/packages/cli/templates/node-library-package/README.md.hbs new file mode 100644 index 0000000000..0e2813c87a --- /dev/null +++ b/packages/cli/templates/node-library-package/README.md.hbs @@ -0,0 +1,12 @@ +# {{name}} + +_This package was created through the Backstage CLI_. + +## Installation + +Install the package via Yarn: + +```sh +cd <package-dir> # if within a monorepo +yarn add {{name}} +``` diff --git a/packages/cli/templates/node-library-package/package.json.hbs b/packages/cli/templates/node-library-package/package.json.hbs new file mode 100644 index 0000000000..a6ede31893 --- /dev/null +++ b/packages/cli/templates/node-library-package/package.json.hbs @@ -0,0 +1,36 @@ +{ + "name": "{{name}}", + "version": "{{pluginVersion}}", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", +{{#if privatePackage}} + "private": {{privatePackage}}, +{{/if}} + "publishConfig": { +{{#if npmRegistry}} + "registry": "{{npmRegistry}}", +{{/if}} + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "node-library" + }, + "scripts": { + "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" + }, + "devDependencies": { + "@backstage/cli": "{{versionQuery '@backstage/cli'}}" + }, + "files": [ + "dist" + ] +} diff --git a/packages/cli/templates/node-library-package/src/index.ts.hbs b/packages/cli/templates/node-library-package/src/index.ts.hbs new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/packages/cli/templates/node-library-package/src/index.ts.hbs @@ -0,0 +1 @@ +export {}; diff --git a/packages/cli/templates/node-library-package/src/setupTests.ts b/packages/cli/templates/node-library-package/src/setupTests.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/packages/cli/templates/node-library-package/src/setupTests.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/cli/templates/node-library-package/tsconfig.json b/packages/cli/templates/node-library-package/tsconfig.json new file mode 100644 index 0000000000..ce3409d31f --- /dev/null +++ b/packages/cli/templates/node-library-package/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": [ + "src", + ], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "dist-types", + "rootDir": "." + } +} diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 9bb738e4e8..7db642945f 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/codemods +## 0.1.46-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + ## 0.1.45 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index ccbc20926b..34f4b5d748 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/codemods", "description": "A collection of codemods for Backstage projects", - "version": "0.1.45", + "version": "0.1.46-next.0", "publishConfig": { "access": "public", "main": "dist/index.cjs.js" @@ -42,7 +42,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/jscodeshift": "^0.11.0", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "ts-node": "^10.0.0" }, "nodemonConfig": { diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index e8cca42db4..1ee39cb9c6 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,51 @@ # @backstage/config-loader +## 1.5.1-next.0 + +### Patch Changes + +- 773ea341d2: The `FileConfigSource` will now retry file reading after a short delay if it reads an empty file. This is to avoid flakiness during watch mode where change events can trigger before the file content has been written. +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 1.5.0 + +### Minor Changes + +- 9606ba0939e6: Deep visibility now also applies to values that are not covered by the configuration schema. + + For example, given the following configuration schema: + + ```ts + // plugins/a/config.schema.ts + export interface Config { + /** @deepVisibility frontend */ + a?: unknown; + } + + // plugins/a/config.schema.ts + export interface Config { + a?: { + b?: string; + }; + } + ``` + + All values under `a` are now visible to the frontend, while previously only `a` and `a/b` would've been visible. + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- f9657b891b00: Do not unnecessarily notify subscribers when no-op updates to config happen +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/cli-common@0.1.12 + ## 1.5.0-next.3 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 466dc42cd6..fb17d00378 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config-loader", "description": "Config loading functionality used by Backstage backend, and CLI", - "version": "1.5.0-next.3", + "version": "1.5.1-next.0", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", @@ -57,7 +57,7 @@ "@types/json-schema-merge-allof": "^0.6.0", "@types/mock-fs": "^4.10.0", "@types/yup": "^0.29.13", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "zen-observable": "^0.10.0" }, diff --git a/packages/config-loader/src/loader.test.ts b/packages/config-loader/src/loader.test.ts index ff6d5b2551..9554e8767e 100644 --- a/packages/config-loader/src/loader.test.ts +++ b/packages/config-loader/src/loader.test.ts @@ -339,7 +339,7 @@ describe('loadConfig', () => { title: 'New Title', }, }, - path: '/root/app-config.yaml', + path: `${root}root${sep}app-config.yaml`, }, ]); diff --git a/packages/config-loader/src/sources/ConfigSources.test.ts b/packages/config-loader/src/sources/ConfigSources.test.ts index 9a02b684ab..43feb3ca27 100644 --- a/packages/config-loader/src/sources/ConfigSources.test.ts +++ b/packages/config-loader/src/sources/ConfigSources.test.ts @@ -107,7 +107,7 @@ describe('ConfigSources', () => { ).toEqual([ { name: 'FileConfigSource', - path: `${root}config.yaml`, + path: '/config.yaml', substitutionFunc: subFunc, }, ]); diff --git a/packages/config-loader/src/sources/FileConfigSource.ts b/packages/config-loader/src/sources/FileConfigSource.ts index da31c128a0..1de0fbf2d8 100644 --- a/packages/config-loader/src/sources/FileConfigSource.ts +++ b/packages/config-loader/src/sources/FileConfigSource.ts @@ -47,7 +47,15 @@ export interface FileConfigSourceOptions { async function readFile(path: string): Promise<string | undefined> { try { - return await fs.readFile(path, 'utf8'); + const content = await fs.readFile(path, 'utf8'); + // During watching we may sometimes read files too early before the file content has been written. + // We never expect the writing to take a long time, but if we encounter an empty file then check + // again after a short delay for safety. + if (content === '') { + await new Promise(resolve => setTimeout(resolve, 10)); + return await fs.readFile(path, 'utf8'); + } + return content; } catch (error) { if (error.code === 'ENOENT') { return undefined; diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index 0cdf238ba5..a5dfb07366 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/config +## 1.1.0 + +### Minor Changes + +- 62f448edb0b5: Added a `readDurationFromConfig` function + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + ## 1.1.0-next.2 ### Patch Changes diff --git a/packages/config/package.json b/packages/config/package.json index d772bf9663..d917df849b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config", "description": "Config API used by Backstage core, backend, and CLI", - "version": "1.1.0-next.2", + "version": "1.1.0", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index 7bb4134710..dca0c73af9 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/core-app-api +## 1.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.10.0 + +### Minor Changes + +- 18619f793c94: Fixed two bugs in how the `OAuth2Session` type represents the underlying data. The `expiresAt` and `backstageIdentity` are now both optional, since that's what they are in practice. This is not considered a breaking change since it was effectively a bug in the modelling of the state that this type represents, and the type was not used in any other external contract. +- 18619f793c94: The `OAuth` class which is used by all OAuth providers will now consider both the session expiration of both the Backstage identity as well as the upstream identity provider, and refresh the session with either of them is about to expire. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9fe827b380e1: Internal refactor +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.10.0-next.3 ### Patch Changes @@ -175,7 +204,7 @@ ### Minor Changes -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. - c15e0cedbe1: The `AuthConnector` interface now supports specifying a set of scopes when refreshing a session. The `DefaultAuthConnector` implementation passes the `scope` query parameter to the auth-backend plugin appropriately. The @@ -236,7 +265,7 @@ ### Minor Changes -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. ### Patch Changes diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md index bd99874a71..6824dbcf4c 100644 --- a/packages/core-app-api/api-report.md +++ b/packages/core-app-api/api-report.md @@ -64,8 +64,6 @@ import { SessionState } from '@backstage/core-plugin-api'; import { StorageApi } from '@backstage/core-plugin-api'; import { StorageValueSnapshot } from '@backstage/core-plugin-api'; import { SubRouteRef } from '@backstage/core-plugin-api'; -import { TranslationMessages } from '@backstage/core-plugin-api/alpha'; -import { TranslationResource } from '@backstage/core-plugin-api/alpha'; // @public export class AlertApiForwarder implements AlertApi { @@ -225,7 +223,18 @@ export type AppOptions = { __experimentalTranslations?: { defaultLanguage?: string; availableLanguages?: string[]; - resources?: Array<TranslationMessages | TranslationResource>; + resources?: Array< + | { + $$type: '@backstage/TranslationResource'; + id: string; + } + | { + $$type: '@backstage/TranslationMessages'; + id: string; + full: boolean; + messages: Record<string, string>; + } + >; }; }; diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 99210bc361..ab8fc9a155 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.10.0-next.3", + "version": "1.10.1-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts index 0605cb6f16..224430752c 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts @@ -360,7 +360,9 @@ describe('I18nextTranslationApi', () => { await new Promise<void>(resolve => { const subscription = translationApi.translation$(plainRef).subscribe({ next(snapshot) { - const translation = snapshot.ready ? snapshot.t('foo') : null; + const translation = snapshot.ready + ? (snapshot.t('foo') as string) + : null; translations.push(translation); if (translation === 'foo') { @@ -381,7 +383,7 @@ describe('I18nextTranslationApi', () => { describe('formatting', () => { function snapshotWithMessages< - TMessages extends { [key in string]: string }, + const TMessages extends { [key in string]: string }, >(messages: TMessages) { const translationApi = I18nextTranslationApi.create({ languageApi: AppLanguageSelector.create(), @@ -398,7 +400,7 @@ describe('I18nextTranslationApi', () => { foo: 'Foo', bar: 'Bar', baz: 'Baz', - } as const); + }); expect(snapshot.t('foo')).toBe('Foo'); expect(snapshot.t('bar')).toBe('Bar'); @@ -410,7 +412,7 @@ describe('I18nextTranslationApi', () => { shallow: 'Foo {{ bar }}', multiple: 'Foo {{ bar }} {{ baz }}', deep: 'Foo {{ bar.baz }}', - } as const); + }); // @ts-expect-error expect(snapshot.t('shallow')).toBe('Foo {{ bar }}'); @@ -439,7 +441,7 @@ describe('I18nextTranslationApi', () => { it('should not escape by default', () => { const snapshot = snapshotWithMessages({ foo: 'Foo {{ foo }}', - } as const); + }); expect(snapshot.t('foo', { replace: { foo: '<div>' } })).toBe( 'Foo <div>', @@ -457,7 +459,7 @@ describe('I18nextTranslationApi', () => { foo: 'Foo $t(bar) $t(baz)', bar: 'Nested', baz: 'Baz {{ qux }}', - } as const); + }); expect(snapshot.t('foo', { qux: 'Deep' })).toBe('Foo Nested Baz Deep'); }); @@ -472,7 +474,7 @@ describe('I18nextTranslationApi', () => { relativeSecondsShort: '= {{ x, relativeTime(range: second; style: short) }}', list: '= {{ x, list }}', - } as const); + }); expect(snapshot.t('plain', { replace: { x: '5' } })).toBe('= 5'); expect(snapshot.t('number', { replace: { x: 5 } })).toBe('= 5'); @@ -528,7 +530,7 @@ describe('I18nextTranslationApi', () => { derp_other: 'derps', derpWithCount_one: '{{ count }} derp', derpWithCount_other: '{{ count }} derps', - } as const); + }); expect(snapshot.t('derp', { count: 1 })).toBe('derp'); expect(snapshot.t('derp', { count: 2 })).toBe('derps'); diff --git a/packages/core-app-api/src/app/defaultConfigLoader.test.ts b/packages/core-app-api/src/app/defaultConfigLoader.test.ts index 7579e53dd2..c70ec3fbff 100644 --- a/packages/core-app-api/src/app/defaultConfigLoader.test.ts +++ b/packages/core-app-api/src/app/defaultConfigLoader.test.ts @@ -70,7 +70,7 @@ describe('defaultConfigLoaderSync', () => { anyEnv.APP_CONFIG = [{ data: { my: 'config' }, context: 'a' }]; expect(() => defaultConfigLoaderSync('}')).toThrow( - 'Failed to load runtime configuration, SyntaxError: Unexpected token } in JSON at position 0', + 'Failed to load runtime configuration, SyntaxError: Unexpected token', ); }); diff --git a/packages/core-app-api/src/app/types.ts b/packages/core-app-api/src/app/types.ts index f203ce9278..523e35e9cb 100644 --- a/packages/core-app-api/src/app/types.ts +++ b/packages/core-app-api/src/app/types.ts @@ -27,10 +27,6 @@ import { FeatureFlag, } from '@backstage/core-plugin-api'; import { AppConfig } from '@backstage/config'; -import { - TranslationMessages, - TranslationResource, -} from '@backstage/core-plugin-api/alpha'; /** * Props for the `BootErrorPage` component of {@link AppComponents}. @@ -286,7 +282,16 @@ export type AppOptions = { __experimentalTranslations?: { defaultLanguage?: string; availableLanguages?: string[]; - resources?: Array<TranslationMessages | TranslationResource>; + resources?: Array< + // Separate declaration for now to avoid dependency on core-plugin-api/alpha and TS 5.0 + | { $$type: '@backstage/TranslationResource'; id: string } + | { + $$type: '@backstage/TranslationMessages'; + id: string; + full: boolean; + messages: Record<string, string>; + } + >; }; }; diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index b3a475f357..9cf62f2694 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/core-components +## 0.13.6-next.0 + +### Patch Changes + +- d19a827ef1: MissingAnnotationEmptyState component can now dynamically generate a YAML example based off the current entity being used. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/version-bridge@1.0.5 + +## 0.13.5 + +### Patch Changes + +- 0c9907645aab: Fixed an issue causing `StructuredMetadataTable` to crash in case metadata contained `null` values. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9b74166d11a1: Added `<AutoLogout>` component which introduces an optional automatic logout mechanism on user inactivity +- 117027636b10: Minor internal tweak to handle `classnames` update +- 8cec7664e146: Removed `@types/node` dependency +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- 47782f4bfa5b: Add loading indicator to Table +- 3d63e60f3c36: Internal restructure to avoid circular imports +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/version-bridge@1.0.5 + ## 0.13.5-next.3 ### Patch Changes @@ -254,7 +287,7 @@ - 67140d9f96f: Upgrade `react-virtualized-auto-sizer´ to version `^1.0.11` - 6e0b71493df: Switched internal declaration of `DependencyGraphTypes` to use `namespace`. - c8779cc1d09: Updated `LogLine` component, which is used by the `LogViewer`, to turn URLs into clickable links. This feature is on by default -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. - 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. - 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. - 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) @@ -332,7 +365,7 @@ ### Patch Changes -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. - 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) - 7245e744ab1: Fixed the font color on `BackstageHeaderLabel` to respect the active page theme. - Updated dependencies diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 0aade4549e..44a8b33e04 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -67,6 +67,18 @@ export type AlertDisplayProps = { transientTimeoutMs?: number; }; +// @public +export const AutoLogout: (props: AutoLogoutProps) => JSX.Element | null; + +// @public (undocumented) +export type AutoLogoutProps = { + enabled?: boolean; + idleTimeoutMinutes?: number; + promptBeforeIdleSeconds?: number; + useWorkerTimers?: boolean; + logoutIfDisconnected?: boolean; +}; + // @public export function Avatar(props: AvatarProps): React_2.JSX.Element; diff --git a/packages/core-components/config.d.ts b/packages/core-components/config.d.ts new file mode 100644 index 0000000000..fac678ef2a --- /dev/null +++ b/packages/core-components/config.d.ts @@ -0,0 +1,60 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export interface Config { + auth?: { + /** + * Autologout feature configuration + */ + autologout?: { + /** + * Enable or disable the autologout feature + * @visibility frontend + */ + enabled?: boolean; + + /** + * Number of minutes after which the inactive user is logged out automatically. + * Default is 60 minutes (1 hour) + * @visibility frontend + */ + idleTimeoutMinutes?: number; + + /** + * Number of seconds before the idle timeout where the user will be asked if it's still active. + * A dialog will be shown. + * Default is 10 seconds. + * Set to 0 seconds to disable the prompt. + * @visibility frontend + */ + promptBeforeIdleSeconds?: number; + + /** + * Enable/disable the usage of worker thread timers instead of main thread timers. + * Default is true. + * If you experience some browser incompatibility, you may try to set this to false. + * @visibility frontend + */ + useWorkerTimers?: boolean; + + /** + * Enable/disable the automatic logout also on users that are logged in but with no Backstage tabs open. + * Default is true. + * @visibility frontend + */ + logoutIfDisconnected?: boolean; + }; + }; +} diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 31d0dfb005..2d534609c2 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.13.5-next.3", + "version": "0.13.6-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -33,9 +33,11 @@ "start": "backstage-cli package start" }, "dependencies": { + "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/plugin-catalog-react": "workspace:^", "@backstage/theme": "workspace:^", "@backstage/version-bridge": "workspace:^", "@date-io/core": "^1.3.13", @@ -64,6 +66,7 @@ "rc-progress": "3.5.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", + "react-idle-timer": "5.6.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", @@ -101,9 +104,12 @@ "@types/react-virtualized-auto-sizer": "^1.0.1", "@types/react-window": "^1.8.5", "@types/zen-observable": "^0.8.0", + "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, "files": [ - "dist" - ] + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" } diff --git a/packages/core-components/src/components/AutoLogout/AutoLogout.tsx b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx new file mode 100644 index 0000000000..a345ca4b2d --- /dev/null +++ b/packages/core-components/src/components/AutoLogout/AutoLogout.tsx @@ -0,0 +1,313 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + ConfigApi, + configApiRef, + IdentityApi, + identityApiRef, + useApi, +} from '@backstage/core-plugin-api'; +import React, { useEffect, useMemo, useState } from 'react'; +import { + EventsType, + IIdleTimer, + workerTimers, + useIdleTimer, +} from 'react-idle-timer'; + +import { + LAST_SEEN_ONLINE_STORAGE_KEY, + useLogoutDisconnectedUserEffect, +} from './disconnectedUsers'; +import { StillTherePrompt } from './StillTherePrompt'; +import { DefaultTimestampStore, TimestampStore } from './timestampStore'; + +type AutoLogoutTrackableEvent = EventsType; + +/** @public */ +export type AutoLogoutProps = { + /** + * Enable/disable the AutoLogoutMechanism. + * defauls to true. + */ + enabled?: boolean; + /** + * The amount of time (in minutes) of inactivity + * after which the user is automatically logged out. + * defaults to 60 minutes. + */ + idleTimeoutMinutes?: number; + /** + * The number of seconds before the idleTimeout expires, + * at which the user will be alerted by a Dialog that + * they are about to be logged out. + * defaults to 10 seconds + */ + promptBeforeIdleSeconds?: number; + /** + * Enable/disable the usage of Node's worker thread timers instead of main thread timers. + * This is helpful if you notice that the your browser is killing inactive tab's timers, like the one used by AutoLogout. + * If you experience some browser incompatibility, you may try to set this to false. + * defaults to true. + */ + useWorkerTimers?: boolean; + /** + * Enable/disable the autologout for disconnected users. + * disconnected users are the ones that are logged in but have no Backstage tab open in their browsers. + * If enabled, disconnected users will be automatically logged out after `idleTimeoutMinutes` + * defaults to true + */ + logoutIfDisconnected?: boolean; +}; + +type AutoLogoutInternalProps = Omit<Required<AutoLogoutProps>, 'enabled'> & { + events: AutoLogoutTrackableEvent[]; + promptOpen: boolean; + setPromptOpen: (value: boolean) => void; + remainingTimeCountdown: number; + setRemainingTimeCountdown: (amount: number) => void; + identityApi: IdentityApi; + lastSeenOnlineStore: TimestampStore; +}; + +const ConditionalAutoLogout = ({ + idleTimeoutMinutes, + events, + useWorkerTimers, + logoutIfDisconnected, + promptBeforeIdleSeconds, + promptOpen, + setPromptOpen, + remainingTimeCountdown, + setRemainingTimeCountdown, + identityApi, + lastSeenOnlineStore, +}: AutoLogoutInternalProps): JSX.Element => { + const promptBeforeIdleMillis = promptBeforeIdleSeconds * 1000; + const promptBeforeIdle = promptBeforeIdleMillis > 0 ? true : false; + + const onPrompt = async () => { + // onPrompt will be called `promptBeforeIdle` milliseconds before `timeout`. + // All events are disabled while the prompt is active. + // If the user wishes to stay active, call the `activate()` method. + // You can get the remaining prompt time with the `getRemainingTime()` method, + setPromptOpen(true); + setRemainingTimeCountdown(promptBeforeIdleMillis); + }; + + const onIdle = () => { + // onIdle will be called after the timeout is reached. + // Events will be rebound as long as `stopOnMount` is not set. + setPromptOpen(false); + setRemainingTimeCountdown(0); + identityApi.signOut(); + }; + + const onActive = () => { + // onActive will only be called if `activate()` is called while `isPrompted()` + // is true. Here you will also want to close your modal and perform + // any active actions. + setPromptOpen(false); + setRemainingTimeCountdown(0); + }; + + const onAction = ( + _event?: Event | undefined, + _idleTimer?: IIdleTimer | null, + ) => { + // onAction will be called if any user event is detected. The list of events that triggers a user event detection is the list of configured events + // If any user event is detected we update the Last seen online in storage + lastSeenOnlineStore.save(new Date()); + }; + + const timer = useIdleTimer({ + timeout: idleTimeoutMinutes * 60 * 1000, + events: events, + crossTab: true, + name: 'autologout-timer', + timers: useWorkerTimers ? workerTimers : undefined, + onIdle: onIdle, + onActive: promptBeforeIdle ? onActive : undefined, + onAction: logoutIfDisconnected ? onAction : undefined, + onPrompt: promptBeforeIdle ? onPrompt : undefined, + promptBeforeIdle: promptBeforeIdle ? promptBeforeIdleMillis : undefined, + syncTimers: 1000, + }); + + return ( + <> + {promptBeforeIdle && ( + <StillTherePrompt + idleTimer={timer} + open={promptOpen} + setOpen={setPromptOpen} + remainingTime={remainingTimeCountdown} + setRemainingTime={setRemainingTimeCountdown} + promptTimeoutMillis={promptBeforeIdleMillis} + /> + )} + </> + ); +}; + +const defaultConfig: Required<AutoLogoutProps> = { + enabled: true, + idleTimeoutMinutes: 0.5, + promptBeforeIdleSeconds: 10, + useWorkerTimers: true, + logoutIfDisconnected: true, +}; + +/** + * A list of DOM events that the activity tracker will use to determine if the user is active or not. + */ +const defaultTrackedEvents: AutoLogoutTrackableEvent[] = [ + 'mousemove', + 'keydown', + 'wheel', + 'DOMMouseScroll', + 'mousewheel', + 'mousedown', + 'touchstart', + 'touchmove', + 'MSPointerDown', + 'MSPointerMove', + 'visibilitychange', +]; + +/** + * Parses configuration for the AutoLogout. Properties configured in `app-config` take precedence over the props passed to the React component. + * If neither props nor config properties are found, a default value will be set accordingly. + */ +const parseConfig = ( + configApi: ConfigApi, + props: AutoLogoutProps, +): Required<AutoLogoutProps> => { + return { + enabled: + configApi.getOptionalBoolean('auth.autologout.enabled') ?? + props.enabled ?? + defaultConfig.enabled, + idleTimeoutMinutes: + configApi.getOptionalNumber('auth.autologout.idleTimeoutMinutes') ?? + props.idleTimeoutMinutes ?? + defaultConfig.idleTimeoutMinutes, + promptBeforeIdleSeconds: + configApi.getOptionalNumber('auth.autologout.promptBeforeIdleSeconds') ?? + props.promptBeforeIdleSeconds ?? + defaultConfig.promptBeforeIdleSeconds, + useWorkerTimers: + configApi.getOptionalBoolean('auth.autologout.useWorkerTimers') ?? + props.useWorkerTimers ?? + defaultConfig.useWorkerTimers, + logoutIfDisconnected: + configApi.getOptionalBoolean('auth.autologout.logoutIfDisconnected') ?? + props.logoutIfDisconnected ?? + defaultConfig.logoutIfDisconnected, + }; +}; + +/** + * The Autologout feature enables platform engineers to add a mechanism to log out users after a configurable amount of time of inactivity. + * When enabled, the mechanism will track user actions (mouse movement, mouse click, key pressing, taps, etc.) in order to determine if they are active or not. + * After a certain amount of inactivity/idle time, the user session is invalidated and they are required to sign in again. + * + * @public + */ +export const AutoLogout = (props: AutoLogoutProps): JSX.Element | null => { + const identityApi = useApi(identityApiRef); + const configApi = useApi(configApiRef); + const [isLogged, setIsLogged] = useState(false); + useEffect(() => { + // if the user is not logged in, the autologout feature won't affect the app even if enabled + async function isLoggedIn(identity: IdentityApi) { + if ((await identity.getCredentials()).token) { + setIsLogged(true); + } else { + setIsLogged(false); + } + } + isLoggedIn(identityApi); + }, [identityApi]); + + const { + enabled, + idleTimeoutMinutes, + promptBeforeIdleSeconds, + logoutIfDisconnected, + useWorkerTimers, + }: AutoLogoutProps = useMemo(() => { + return parseConfig(configApi, props); + }, [configApi, props]); + + useEffect(() => { + if (idleTimeoutMinutes < 0.5) { + throw new Error( + '❌ idleTimeoutMinutes property should be >= 0.5 minutes (30 seconds).', + ); + } + + if (promptBeforeIdleSeconds < 0) { + throw new Error( + '❌ promptBeforeIdleSeconds property should be >= 0 seconds. Set to 0 to disable the prompt.', + ); + } + + if (idleTimeoutMinutes * 60 <= promptBeforeIdleSeconds) { + throw new Error( + `❌ promptBeforeIdleSeconds should be smaller than idleTimeoutMinutes`, + ); + } + }, [idleTimeoutMinutes, promptBeforeIdleSeconds]); + + const lastSeenOnlineStore: TimestampStore = useMemo( + () => new DefaultTimestampStore(LAST_SEEN_ONLINE_STORAGE_KEY), + [], + ); + const [promptOpen, setPromptOpen] = useState<boolean>(false); + + const [remainingTimeCountdown, setRemainingTimeCountdown] = + useState<number>(0); + + useLogoutDisconnectedUserEffect({ + enableEffect: logoutIfDisconnected, + autologoutIsEnabled: enabled && isLogged, + idleTimeoutSeconds: idleTimeoutMinutes * 60, + lastSeenOnlineStore, + identityApi, + }); + + if (!enabled || !isLogged) { + return null; + } + + return ( + <ConditionalAutoLogout + idleTimeoutMinutes={idleTimeoutMinutes} + promptBeforeIdleSeconds={promptBeforeIdleSeconds} + useWorkerTimers={useWorkerTimers} + events={defaultTrackedEvents} + logoutIfDisconnected={logoutIfDisconnected} + promptOpen={promptOpen} + setPromptOpen={setPromptOpen} + remainingTimeCountdown={remainingTimeCountdown} + setRemainingTimeCountdown={setRemainingTimeCountdown} + identityApi={identityApi} + lastSeenOnlineStore={lastSeenOnlineStore} + /> + ); +}; diff --git a/packages/core-components/src/components/AutoLogout/Autologout.test.tsx b/packages/core-components/src/components/AutoLogout/Autologout.test.tsx new file mode 100644 index 0000000000..0d414524a5 --- /dev/null +++ b/packages/core-components/src/components/AutoLogout/Autologout.test.tsx @@ -0,0 +1,70 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createMocks } from 'react-idle-timer'; +// eslint-disable-next-line no-restricted-imports +import { MessageChannel } from 'worker_threads'; +import { ApiProvider } from '@backstage/core-app-api'; +import { identityApiRef } from '@backstage/core-plugin-api'; +import { TestApiRegistry } from '@backstage/test-utils'; +import React from 'react'; + +import { AutoLogout } from './AutoLogout'; +import { cleanup, render } from '@testing-library/react'; + +// Mock the signOut function of identityApiRef +const mockSignOut = jest.fn(); +const mockIdentityApi = { signOut: mockSignOut }; + +const apis = TestApiRegistry.from([identityApiRef, mockIdentityApi]); + +describe('AutoLogout', () => { + beforeAll(() => { + createMocks(); + // @ts-ignore + global.MessageChannel = MessageChannel; + }); + + afterAll(cleanup); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should throw error if idleTimeoutMinutes is smaller than promptBeforeSeconds', async () => { + expect(() => + render( + <ApiProvider apis={apis}> + <AutoLogout + enabled + idleTimeoutMinutes={0.5} + promptBeforeIdleSeconds={120} + /> + </ApiProvider>, + ), + ).toThrow(); + }); + + it('should throw error if idleTimeoutMinutes is smaller than 30 seconds', async () => { + expect(() => + render( + <ApiProvider apis={apis}> + <AutoLogout enabled idleTimeoutMinutes={0.49} /> + <div>Test Child</div> + </ApiProvider>, + ), + ).toThrow(); + }); +}); diff --git a/packages/core-components/src/components/AutoLogout/StillTherePrompt.tsx b/packages/core-components/src/components/AutoLogout/StillTherePrompt.tsx new file mode 100644 index 0000000000..e0cfc8dd56 --- /dev/null +++ b/packages/core-components/src/components/AutoLogout/StillTherePrompt.tsx @@ -0,0 +1,90 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import React, { useEffect } from 'react'; +import { IIdleTimer } from 'react-idle-timer'; + +export interface StillTherePromptProps { + idleTimer: IIdleTimer; + promptTimeoutMillis: number; + remainingTime: number; + setRemainingTime: (amount: number) => void; + open: boolean; + setOpen: (value: boolean) => void; +} + +export const StillTherePrompt = (props: StillTherePromptProps) => { + const { + idleTimer, + setOpen, + open, + promptTimeoutMillis, + remainingTime, + setRemainingTime, + } = props; + + useEffect(() => { + const interval = setInterval(() => { + setRemainingTime(Math.ceil(idleTimer.getRemainingTime())); + }, 500); + + return () => { + clearInterval(interval); + }; + }, [idleTimer, setRemainingTime]); + + const handleStillHere = () => { + setOpen(false); + idleTimer.activate(); + }; + + const timeTillPrompt = Math.max( + remainingTime - promptTimeoutMillis / 1000, + 0, + ); + const seconds = timeTillPrompt > 1 ? 'seconds' : 'second'; + + return ( + <Dialog open={open} data-testid="inactivity-prompt-dialog"> + <DialogTitle>Logging out due to inactivity</DialogTitle> + <DialogContent> + <DialogContentText> + You are about to be disconnected in{' '} + <b> + {Math.ceil(remainingTime / 1000)} {seconds} + </b> + . Are you still there? + </DialogContentText> + </DialogContent> + <DialogActions> + <Button + onClick={handleStillHere} + color="secondary" + variant="contained" + size="small" + > + Yes! Don't log me out + </Button> + </DialogActions> + </Dialog> + ); +}; diff --git a/packages/core-components/src/components/AutoLogout/disconnectedUsers.test.ts b/packages/core-components/src/components/AutoLogout/disconnectedUsers.test.ts new file mode 100644 index 0000000000..87d6369eda --- /dev/null +++ b/packages/core-components/src/components/AutoLogout/disconnectedUsers.test.ts @@ -0,0 +1,110 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { renderHook } from '@testing-library/react-hooks'; +import { act } from 'react-dom/test-utils'; + +import { + useLogoutDisconnectedUserEffect, + UseLogoutDisconnectedUserEffectProps, +} from './disconnectedUsers'; + +const mockIdentityApi = { + signOut: jest.fn(), + getProfileInfo: jest.fn(), + getBackstageIdentity: jest.fn(), + getCredentials: jest.fn(), +}; + +const mockTimestampStore = { + get: jest.fn(), + save: jest.fn(), + delete: jest.fn(), +}; + +describe('useLogoutDisconnectedUserEffect', () => { + it('should not do anything if effect is not enabled', () => { + const props: UseLogoutDisconnectedUserEffectProps = { + enableEffect: false, + autologoutIsEnabled: true, + idleTimeoutSeconds: 300, + lastSeenOnlineStore: mockTimestampStore, + identityApi: mockIdentityApi, + }; + + renderHook(() => useLogoutDisconnectedUserEffect(props)); + + expect(mockTimestampStore.get).not.toHaveBeenCalled(); + expect(mockIdentityApi.signOut).not.toHaveBeenCalled(); + }); + + it('should delete the store if autologout is not enabled', () => { + const props: UseLogoutDisconnectedUserEffectProps = { + enableEffect: true, + autologoutIsEnabled: false, + idleTimeoutSeconds: 300, + lastSeenOnlineStore: mockTimestampStore, + identityApi: mockIdentityApi, + }; + + renderHook(() => useLogoutDisconnectedUserEffect(props)); + + expect(mockTimestampStore.delete).toHaveBeenCalled(); + }); + + it('should call signOut if idle timeout passed', () => { + jest.useFakeTimers(); + + const props: UseLogoutDisconnectedUserEffectProps = { + enableEffect: true, + autologoutIsEnabled: true, + idleTimeoutSeconds: 1, + lastSeenOnlineStore: { + ...mockTimestampStore, + get: jest.fn().mockReturnValue(new Date(Date.now() - 2000)), // 2 seconds before now + }, + identityApi: mockIdentityApi, + }; + + renderHook(() => useLogoutDisconnectedUserEffect(props)); + + act(() => { + jest.advanceTimersByTime(2000); + }); + + expect(mockIdentityApi.signOut).toHaveBeenCalled(); + + jest.useRealTimers(); + }); + + it('should save the current time to the store when app is loaded', () => { + const props: UseLogoutDisconnectedUserEffectProps = { + enableEffect: true, + autologoutIsEnabled: true, + idleTimeoutSeconds: 300, + lastSeenOnlineStore: mockTimestampStore, + identityApi: mockIdentityApi, + }; + + renderHook(() => useLogoutDisconnectedUserEffect(props)); + + expect(mockTimestampStore.get).toHaveBeenCalled(); + expect(mockTimestampStore.save).toHaveBeenCalled(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); +}); diff --git a/packages/core-components/src/components/AutoLogout/disconnectedUsers.ts b/packages/core-components/src/components/AutoLogout/disconnectedUsers.ts new file mode 100644 index 0000000000..c09e272eaa --- /dev/null +++ b/packages/core-components/src/components/AutoLogout/disconnectedUsers.ts @@ -0,0 +1,72 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { IdentityApi } from '@backstage/core-plugin-api'; +import { useEffect } from 'react'; + +import { TimestampStore } from './timestampStore'; + +export const LAST_SEEN_ONLINE_STORAGE_KEY = + '@backstage/autologout:lastSeenOnline'; + +export type UseLogoutDisconnectedUserEffectProps = { + enableEffect: boolean; + autologoutIsEnabled: boolean; + idleTimeoutSeconds: number; + lastSeenOnlineStore: TimestampStore; + identityApi: IdentityApi; +}; + +export const useLogoutDisconnectedUserEffect = ({ + enableEffect, + autologoutIsEnabled, + idleTimeoutSeconds, + lastSeenOnlineStore, + identityApi, +}: UseLogoutDisconnectedUserEffectProps) => { + useEffect(() => { + /** + * Considers disconnected users as inactive users. + * If all Backstage tabs are closed and idleTimeoutMinutes are passed then logout the user anyway. + */ + if (autologoutIsEnabled && enableEffect) { + const lastSeenOnline = lastSeenOnlineStore.get(); + if (lastSeenOnline) { + const now = new Date(); + const nowSeconds = Math.ceil(now.getTime() / 1000); + const lastSeenOnlineSeconds = Math.ceil( + lastSeenOnline.getTime() / 1000, + ); + if (nowSeconds - lastSeenOnlineSeconds > idleTimeoutSeconds) { + identityApi.signOut(); + } + } + /** + * save for the first time when app is loaded, so that + * if user logs in and does nothing we still have a + * lastSeenOnline value in store + */ + lastSeenOnlineStore.save(new Date()); + } else { + lastSeenOnlineStore.delete(); + } + }, [ + autologoutIsEnabled, + enableEffect, + identityApi, + idleTimeoutSeconds, + lastSeenOnlineStore, + ]); +}; diff --git a/plugins/adr/src/alpha.ts b/packages/core-components/src/components/AutoLogout/index.ts similarity index 94% rename from plugins/adr/src/alpha.ts rename to packages/core-components/src/components/AutoLogout/index.ts index 587cfce3d6..470689e45f 100644 --- a/plugins/adr/src/alpha.ts +++ b/packages/core-components/src/components/AutoLogout/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './translations'; +export * from './AutoLogout'; diff --git a/packages/core-components/src/components/AutoLogout/timestampStore.test.ts b/packages/core-components/src/components/AutoLogout/timestampStore.test.ts new file mode 100644 index 0000000000..ce69a1846a --- /dev/null +++ b/packages/core-components/src/components/AutoLogout/timestampStore.test.ts @@ -0,0 +1,75 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DefaultTimestampStore, TimestampStore } from './timestampStore'; + +const mockLocalStorage: any = { + __STORE__: {}, + getItem: jest.fn(key => mockLocalStorage.__STORE__[key] || null), + setItem: jest.fn((key, value) => { + mockLocalStorage.__STORE__[key] = value; + }), + removeItem: jest.fn(key => { + delete mockLocalStorage.__STORE__[key]; + }), + clear: jest.fn(() => { + mockLocalStorage.__STORE__ = {}; + }), +}; + +describe('DefaultTimestampStore', () => { + let timestampStore: TimestampStore; + const key = 'test-key'; + const date = new Date(); + + beforeEach(() => { + timestampStore = new DefaultTimestampStore(key); + + // Set up mock localStorage + Object.defineProperty(window, 'localStorage', { + value: mockLocalStorage, + }); + + // Clear the mock storage before each test + localStorage.clear(); + }); + + it('should save the date into the localStorage', () => { + timestampStore.save(date); + expect(localStorage.setItem).toHaveBeenCalledWith(key, date.toJSON()); + expect(localStorage.__STORE__[key]).toBe(date.toJSON()); + }); + + it('should get the date from the localStorage', () => { + localStorage.setItem(key, date.toJSON()); + const retrievedDate = timestampStore.get(); + expect(localStorage.getItem).toHaveBeenCalledWith(key); + expect(retrievedDate).toEqual(date); + }); + + it('should return null if no date is set in the localStorage', () => { + const retrievedDate = timestampStore.get(); + expect(localStorage.getItem).toHaveBeenCalledWith(key); + expect(retrievedDate).toBeNull(); + }); + + it('should delete the date from the localStorage', () => { + localStorage.setItem(key, date.toJSON()); + timestampStore.delete(); + expect(localStorage.removeItem).toHaveBeenCalledWith(key); + expect(localStorage.__STORE__[key]).toBeUndefined(); + }); +}); diff --git a/plugins/cost-insights/src/options.ts b/packages/core-components/src/components/AutoLogout/timestampStore.ts similarity index 50% rename from plugins/cost-insights/src/options.ts rename to packages/core-components/src/components/AutoLogout/timestampStore.ts index acc977771d..124d44f8e6 100644 --- a/plugins/cost-insights/src/options.ts +++ b/packages/core-components/src/components/AutoLogout/timestampStore.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2023 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,16 +14,26 @@ * limitations under the License. */ -import { usePluginOptions } from '@backstage/core-plugin-api/alpha'; +export interface TimestampStore { + save(date: Date): void; + delete(): void; + get(): Date | null; +} -export type CostInsightsPluginOptions = { - hideTrendLine?: boolean; -}; +export class DefaultTimestampStore implements TimestampStore { + constructor(private readonly key: string) {} -/** @ignore */ -export type CostInsightsInputPluginOptions = { - hideTrendLine?: boolean; -}; + save(date: Date): void { + localStorage.setItem(this.key, date.toJSON()); + } -export const useCostInsightsOptions = () => - usePluginOptions<CostInsightsPluginOptions>(); + delete(): void { + localStorage.removeItem(this.key); + } + + get(): Date | null { + const timestamp = localStorage.getItem(this.key); + + return timestamp !== null ? new Date(Date.parse(timestamp)) : null; + } +} diff --git a/packages/core-components/src/components/EmptyState/MissingAnnotationEmptyState.tsx b/packages/core-components/src/components/EmptyState/MissingAnnotationEmptyState.tsx index 9fc9eee959..c89129670a 100644 --- a/packages/core-components/src/components/EmptyState/MissingAnnotationEmptyState.tsx +++ b/packages/core-components/src/components/EmptyState/MissingAnnotationEmptyState.tsx @@ -25,23 +25,8 @@ import { CodeSnippet } from '../CodeSnippet'; import { Link } from '../Link'; import { EmptyState } from './EmptyState'; -const COMPONENT_YAML_TEMPLATE = `apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: example - description: example.com - annotations: - ANNOTATION: value -spec: - type: website - lifecycle: production - owner: user:guest`; - -const ANNOTATION_REGEXP = /^.*ANNOTATION.*$/m; -const ANNOTATION_YAML = COMPONENT_YAML_TEMPLATE.match(ANNOTATION_REGEXP)![0]; -const ANNOTATION_LINE = COMPONENT_YAML_TEMPLATE.split('\n').findIndex(line => - ANNOTATION_REGEXP.test(line), -); +import { useEntity } from '@backstage/plugin-catalog-react'; +import { Entity } from '@backstage/catalog-model'; type Props = { annotation: string | string[]; @@ -62,19 +47,38 @@ const useStyles = makeStyles<BackstageTheme>( { name: 'BackstageMissingAnnotationEmptyState' }, ); -function generateLineNumbers(lineCount: number) { - return Array.from(Array(lineCount + 1).keys(), i => i + ANNOTATION_LINE); +function generateYamlExample( + annotations: string[], + entity?: Entity, +): { yamlText: string; lineNumbers: number[] } { + const kind = entity?.kind || 'Component'; + const name = entity?.metadata.name || 'example'; + const type = entity?.spec?.type || 'website'; + const owner = entity?.spec?.owner || 'user:default/guest'; + + const yamlText = `apiVersion: backstage.io/v1alpha1 +kind: ${kind} +metadata: + name: ${name} + annotations:${annotations.map(ann => `\n ${ann}: value`).join('')} +spec: + type: ${type} + owner: ${owner}`; + + let line = 6; // Line 6 is the line number that annotations are added to. + const lineNumbers: number[] = []; + annotations.forEach(() => { + lineNumbers.push(line); + line++; + }); + + return { + yamlText, + lineNumbers, + }; } -function generateComponentYaml(annotations: string[]) { - const annotationYaml = annotations - .map(ann => ANNOTATION_YAML.replace('ANNOTATION', ann)) - .join('\n'); - - return COMPONENT_YAML_TEMPLATE.replace(ANNOTATION_YAML, annotationYaml); -} - -function generateDescription(annotations: string[]) { +function generateDescription(annotations: string[], entityKind = 'Component') { const isSingular = annotations.length <= 1; return ( <> @@ -87,13 +91,21 @@ function generateDescription(annotations: string[]) { </> ))}{' '} {isSingular ? 'is' : 'are'} missing. You need to add the{' '} - {isSingular ? 'annotation' : 'annotations'} to your component if you want - to enable this tool. + {isSingular ? 'annotation' : 'annotations'} to your {entityKind} if you + want to enable this tool. </> ); } export function MissingAnnotationEmptyState(props: Props) { + let entity: Entity | undefined; + try { + const entityContext = useEntity(); + entity = entityContext.entity; + } catch (err) { + // ignore when entity context doesnt exist + } + const { annotation, readMoreUrl } = props; const annotations = Array.isArray(annotation) ? annotation : [annotation]; const url = @@ -101,23 +113,25 @@ export function MissingAnnotationEmptyState(props: Props) { 'https://backstage.io/docs/features/software-catalog/well-known-annotations'; const classes = useStyles(); + const entityKind = entity?.kind || 'Component'; + const { yamlText, lineNumbers } = generateYamlExample(annotations, entity); return ( <EmptyState missing="field" title="Missing Annotation" - description={generateDescription(annotations)} + description={generateDescription(annotations, entityKind)} action={ <> <Typography variant="body1"> - Add the annotation to your component YAML as shown in the + Add the annotation to your {entityKind} YAML as shown in the highlighted example below: </Typography> <Box className={classes.code}> <CodeSnippet - text={generateComponentYaml(annotations)} + text={yamlText} language="yaml" showLineNumbers - highlightedNumbers={generateLineNumbers(annotations.length)} + highlightedNumbers={lineNumbers} customStyle={{ background: 'inherit', fontSize: '115%' }} /> </Box> diff --git a/packages/core-components/src/components/SupportButton/SupportButton.tsx b/packages/core-components/src/components/SupportButton/SupportButton.tsx index dcd4ead321..a07c03b7d2 100644 --- a/packages/core-components/src/components/SupportButton/SupportButton.tsx +++ b/packages/core-components/src/components/SupportButton/SupportButton.tsx @@ -46,6 +46,9 @@ const useStyles = makeStyles( minWidth: 260, maxWidth: 400, }, + menuItem: { + whiteSpace: 'normal', + }, }, { name: 'BackstageSupportButton' }, ); @@ -145,12 +148,16 @@ export function SupportButton(props: SupportButtonProps) { autoFocusItem={Boolean(anchorEl)} > {title && ( - <MenuItem alignItems="flex-start"> + <MenuItem alignItems="flex-start" className={classes.menuItem}> <Typography variant="subtitle1">{title}</Typography> </MenuItem> )} {React.Children.map(children, (child, i) => ( - <MenuItem alignItems="flex-start" key={`child-${i}`}> + <MenuItem + alignItems="flex-start" + key={`child-${i}`} + className={classes.menuItem} + > {child} </MenuItem> ))} diff --git a/packages/core-components/src/components/TabbedLayout/TabbedLayout.test.tsx b/packages/core-components/src/components/TabbedLayout/TabbedLayout.test.tsx index b84a7f262d..f5a059d615 100644 --- a/packages/core-components/src/components/TabbedLayout/TabbedLayout.test.tsx +++ b/packages/core-components/src/components/TabbedLayout/TabbedLayout.test.tsx @@ -17,6 +17,7 @@ import { renderInTestApp, withLogCollector } from '@backstage/test-utils'; import { act, fireEvent } from '@testing-library/react'; import React from 'react'; import { TabbedLayout } from './TabbedLayout'; +import { Link, Route, Routes } from 'react-router-dom'; describe('TabbedLayout', () => { it('renders simplest case', async () => { @@ -81,4 +82,41 @@ describe('TabbedLayout', () => { expect(getByText('tabbed-test-title-2')).toBeInTheDocument(); expect(getByText('tabbed-test-content-2')).toBeInTheDocument(); }); + + it('navigates when user clicks the same tab', async () => { + const { getByText, queryByText, queryAllByRole } = await renderInTestApp( + <TabbedLayout> + <TabbedLayout.Route path="/" title="tabbed-test-title"> + <div> + tabbed-test-content + <div> + <Link to="test">tabbed-test-sub-link</Link> + <Routes> + <Route + path="test" + element={<div>tabbed-test-sub-content</div>} + /> + </Routes> + </div> + </div> + </TabbedLayout.Route> + <TabbedLayout.Route path="/some-other-path" title="tabbed-test-title-2"> + <div>tabbed-test-content-2</div> + </TabbedLayout.Route> + </TabbedLayout>, + ); + + const subLink = getByText('tabbed-test-sub-link'); + expect(subLink).toBeInTheDocument(); + act(() => { + fireEvent.click(subLink); + }); + + expect(queryByText('tabbed-test-sub-content')).toBeInTheDocument(); + const [firstTab] = queryAllByRole('tab'); + act(() => { + fireEvent.click(firstTab); + }); + expect(queryByText('tabbed-test-sub-content')).not.toBeInTheDocument(); + }); }); diff --git a/packages/core-components/src/components/index.ts b/packages/core-components/src/components/index.ts index 0222b82aa4..a58208fabb 100644 --- a/packages/core-components/src/components/index.ts +++ b/packages/core-components/src/components/index.ts @@ -15,6 +15,7 @@ */ export * from './AlertDisplay'; +export * from './AutoLogout'; export * from './Avatar'; export * from './LinkButton'; export * from './CodeSnippet'; diff --git a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx index 48e0a8906a..704df67374 100644 --- a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx +++ b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx @@ -85,7 +85,7 @@ export function HeaderTabs(props: HeaderTabsProps) { if (selectedIndex === undefined) { setSelectedTab(index); } - if (onChange && selectedIndex !== index) onChange(index); + if (onChange) onChange(index); }, [selectedIndex, onChange], ); diff --git a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx index 5dcf31d884..e124036648 100644 --- a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx +++ b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx @@ -79,14 +79,14 @@ const useStyles = makeStyles<BackstageTheme, { sidebarConfig: SidebarConfig }>( overlayHeader: { display: 'flex', - color: theme.palette.text.primary, + color: theme.palette.navigation.color, alignItems: 'center', justifyContent: 'space-between', padding: theme.spacing(2, 3), }, overlayHeaderClose: { - color: theme.palette.text.primary, + color: theme.palette.navigation.color, }, marginMobileSidebar: props => ({ diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 306974dc8a..d206487074 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/core-plugin-api +## 1.7.0-next.0 + +### Minor Changes + +- 322bbcae24: Removed the exprimental plugin configuration API. The `__experimentalReconfigure()` from the plugin options as well as the `__experimentalConfigure()` method on plugin instances have both been removed. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.6.0 + +### Minor Changes + +- 18619f793c94: Added the optional `expiresAt` field that may now be part of a `BackstageIdentityResponse`. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.6.0-next.3 ### Patch Changes diff --git a/packages/core-plugin-api/alpha-api-report.md b/packages/core-plugin-api/alpha-api-report.md index bea27cfa5e..ba3583142f 100644 --- a/packages/core-plugin-api/alpha-api-report.md +++ b/packages/core-plugin-api/alpha-api-report.md @@ -4,9 +4,7 @@ ```ts import { ApiRef } from '@backstage/core-plugin-api'; -import { BackstagePlugin } from '@backstage/core-plugin-api'; import { Observable } from '@backstage/types'; -import { ReactNode } from 'react'; import { TranslationMessages as TranslationMessages_2 } from '@backstage/core-plugin-api/alpha'; import { TranslationRef as TranslationRef_2 } from '@backstage/core-plugin-api/alpha'; @@ -41,7 +39,7 @@ export function createTranslationMessages< // @alpha (undocumented) export function createTranslationRef< TId extends string, - TMessages extends { + const TMessages extends { [key in string]: string; }, TTranslations extends { @@ -74,17 +72,6 @@ export function createTranslationResource< options: TranslationResourceOptions<TId, TMessages, TTranslations>, ): TranslationResource<TId>; -// @alpha -export interface PluginOptionsProviderProps { - // (undocumented) - children: ReactNode; - // (undocumented) - plugin?: BackstagePlugin; -} - -// @alpha -export const PluginProvider: (props: PluginOptionsProviderProps) => JSX.Element; - // @alpha (undocumented) export type TranslationApi = { getTranslation< @@ -245,11 +232,6 @@ export type TranslationSnapshot< t: TranslationFunction<TMessages>; }; -// @alpha -export function usePluginOptions< - TPluginOptions extends {} = {}, ->(): TPluginOptions; - // @alpha (undocumented) export const useTranslationRef: < TMessages extends { diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md index 930f1f979d..7873b23f13 100644 --- a/packages/core-plugin-api/api-report.md +++ b/packages/core-plugin-api/api-report.md @@ -222,7 +222,7 @@ export type BackstageIdentityResponse = { export type BackstagePlugin< Routes extends AnyRoutes = {}, ExternalRoutes extends AnyExternalRoutes = {}, - PluginInputOptions extends {} = {}, + _Ignored extends {} = {}, > = { getId(): string; getApis(): Iterable<AnyApiFactory>; @@ -230,7 +230,6 @@ export type BackstagePlugin< provide<T>(extension: Extension<T>): T; routes: Routes; externalRoutes: ExternalRoutes; - __experimentalReconfigure(options: PluginInputOptions): void; }; // @public @@ -318,10 +317,9 @@ export function createExternalRouteRef< export function createPlugin< Routes extends AnyRoutes = {}, ExternalRoutes extends AnyExternalRoutes = {}, - PluginInputOptions extends {} = {}, >( - config: PluginConfig<Routes, ExternalRoutes, PluginInputOptions>, -): BackstagePlugin<Routes, ExternalRoutes, PluginInputOptions>; + config: PluginConfig<Routes, ExternalRoutes>, +): BackstagePlugin<Routes, ExternalRoutes>; // @public export function createReactExtension< @@ -647,14 +645,12 @@ export type PendingOAuthRequest = { export type PluginConfig< Routes extends AnyRoutes, ExternalRoutes extends AnyExternalRoutes, - PluginInputOptions extends {}, > = { id: string; apis?: Iterable<AnyApiFactory>; routes?: Routes; externalRoutes?: ExternalRoutes; featureFlags?: PluginFeatureFlagConfig[]; - __experimentalConfigure?(options?: PluginInputOptions): {}; }; // @public diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 53e993f0cf..64fdd00915 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.6.0-next.3", + "version": "1.7.0-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/core-plugin-api/src/alpha.ts b/packages/core-plugin-api/src/alpha.ts index 505fd9b818..ebcbcf34c0 100644 --- a/packages/core-plugin-api/src/alpha.ts +++ b/packages/core-plugin-api/src/alpha.ts @@ -14,6 +14,5 @@ * limitations under the License. */ -export * from './plugin-options'; export * from './translation'; export * from './apis/alpha'; diff --git a/packages/core-plugin-api/src/extensions/extensions.tsx b/packages/core-plugin-api/src/extensions/extensions.tsx index a9a3127aee..b94354fa2c 100644 --- a/packages/core-plugin-api/src/extensions/extensions.tsx +++ b/packages/core-plugin-api/src/extensions/extensions.tsx @@ -21,7 +21,6 @@ import { RouteRef, useRouteRef } from '../routing'; import { attachComponentData } from './componentData'; import { Extension, BackstagePlugin } from '../plugin'; import { PluginErrorBoundary } from './PluginErrorBoundary'; -import { PluginProvider } from '../plugin-options'; import { routableExtensionRenderedEvent } from '../analytics/Tracker'; /** @@ -258,9 +257,7 @@ export function createReactExtension< ...(mountPoint && { routeRef: mountPoint.id }), }} > - <PluginProvider plugin={plugin}> - <Component {...props} /> - </PluginProvider> + <Component {...props} /> </AnalyticsContext> </PluginErrorBoundary> </Suspense> diff --git a/packages/core-plugin-api/src/plugin-options/usePluginOptions.test.tsx b/packages/core-plugin-api/src/plugin-options/usePluginOptions.test.tsx deleted file mode 100644 index 96691d503b..0000000000 --- a/packages/core-plugin-api/src/plugin-options/usePluginOptions.test.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; -import { usePluginOptions, PluginProvider } from './usePluginOptions'; -import { createPlugin } from '../plugin'; - -describe('usePluginOptions', () => { - it('should provide a versioned value to hook', () => { - type TestInputPluginOptions = { - 'key-1': string; - }; - - type TestPluginOptions = { - 'key-1': string; - 'key-2': string; - }; - - const plugin = createPlugin({ - id: 'my-plugin', - __experimentalConfigure(_: TestInputPluginOptions): TestPluginOptions { - return { 'key-1': 'value-1', 'key-2': 'value-2' }; - }, - }); - - const rendered = renderHook(() => usePluginOptions(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - <PluginProvider plugin={plugin}>{children}</PluginProvider> - ), - }); - - const config = rendered.result.current; - - expect(config).toEqual({ - 'key-1': 'value-1', - 'key-2': 'value-2', - }); - }); -}); diff --git a/packages/core-plugin-api/src/plugin-options/usePluginOptions.tsx b/packages/core-plugin-api/src/plugin-options/usePluginOptions.tsx deleted file mode 100644 index 8b3f7c109c..0000000000 --- a/packages/core-plugin-api/src/plugin-options/usePluginOptions.tsx +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 { - createVersionedContext, - createVersionedValueMap, - useVersionedContext, -} from '@backstage/version-bridge'; -import { BackstagePlugin } from '@backstage/core-plugin-api'; -import React, { ReactNode } from 'react'; - -const contextKey: string = 'plugin-context'; - -/** - * Properties for the PluginProvider component. - * - * @alpha - */ -export interface PluginOptionsProviderProps { - children: ReactNode; - plugin?: BackstagePlugin; -} - -/** - * Contains the plugin configuration. - * - * @alpha - */ -export const PluginProvider = ( - props: PluginOptionsProviderProps, -): JSX.Element => { - const { children, plugin } = props; - - const { Provider } = createVersionedContext<{ - 1: { plugin: BackstagePlugin | undefined }; - }>(contextKey); - - return ( - <Provider - value={createVersionedValueMap({ - 1: { - plugin, - }, - })} - > - {children} - </Provider> - ); -}; - -/** - * Grab the current entity from the context, throws if the entity has not yet been loaded - * or is not available. - * - * @alpha - */ -export function usePluginOptions< - TPluginOptions extends {} = {}, ->(): TPluginOptions { - const versionedHolder = useVersionedContext<{ 1: TPluginOptions }>( - contextKey, - ); - - if (!versionedHolder) { - throw new Error('Plugin Options context is not available'); - } - - const value = versionedHolder.atVersion(1); - if (!value) { - throw new Error('Plugin Options v1 is not available'); - } - - return ( - value as unknown as { - plugin: { - getPluginOptions(): {}; - }; - } - ).plugin.getPluginOptions() as TPluginOptions; -} diff --git a/packages/core-plugin-api/src/plugin/Plugin.tsx b/packages/core-plugin-api/src/plugin/Plugin.tsx index da26cd4db0..d97554b27b 100644 --- a/packages/core-plugin-api/src/plugin/Plugin.tsx +++ b/packages/core-plugin-api/src/plugin/Plugin.tsx @@ -30,18 +30,9 @@ import { AnyApiFactory } from '../apis'; export class PluginImpl< Routes extends AnyRoutes, ExternalRoutes extends AnyExternalRoutes, - PluginInputOptions extends {}, -> implements BackstagePlugin<Routes, ExternalRoutes, PluginInputOptions> +> implements BackstagePlugin<Routes, ExternalRoutes> { - constructor( - private readonly config: PluginConfig< - Routes, - ExternalRoutes, - PluginInputOptions - >, - ) {} - - private options: {} | undefined = undefined; + constructor(private readonly config: PluginConfig<Routes, ExternalRoutes>) {} getId(): string { return this.config.id; @@ -67,19 +58,6 @@ export class PluginImpl< return extension.expose(this); } - __experimentalReconfigure(options: PluginInputOptions): void { - if (this.config.__experimentalConfigure) { - this.options = this.config.__experimentalConfigure(options); - } - } - - getPluginOptions(): {} { - if (this.config.__experimentalConfigure && !this.options) { - this.options = this.config.__experimentalConfigure(); - } - return this.options ?? {}; - } - toString() { return `plugin{${this.config.id}}`; } @@ -94,9 +72,8 @@ export class PluginImpl< export function createPlugin< Routes extends AnyRoutes = {}, ExternalRoutes extends AnyExternalRoutes = {}, - PluginInputOptions extends {} = {}, >( - config: PluginConfig<Routes, ExternalRoutes, PluginInputOptions>, -): BackstagePlugin<Routes, ExternalRoutes, PluginInputOptions> { + config: PluginConfig<Routes, ExternalRoutes>, +): BackstagePlugin<Routes, ExternalRoutes> { return new PluginImpl(config); } diff --git a/packages/core-plugin-api/src/plugin/types.ts b/packages/core-plugin-api/src/plugin/types.ts index 37ce6c9e7c..3ba7706e16 100644 --- a/packages/core-plugin-api/src/plugin/types.ts +++ b/packages/core-plugin-api/src/plugin/types.ts @@ -52,7 +52,7 @@ export type AnyExternalRoutes = { [name: string]: ExternalRouteRef }; export type BackstagePlugin< Routes extends AnyRoutes = {}, ExternalRoutes extends AnyExternalRoutes = {}, - PluginInputOptions extends {} = {}, + _Ignored extends {} = {}, > = { getId(): string; getApis(): Iterable<AnyApiFactory>; @@ -63,7 +63,6 @@ export type BackstagePlugin< provide<T>(extension: Extension<T>): T; routes: Routes; externalRoutes: ExternalRoutes; - __experimentalReconfigure(options: PluginInputOptions): void; }; /** @@ -84,14 +83,12 @@ export type PluginFeatureFlagConfig = { export type PluginConfig< Routes extends AnyRoutes, ExternalRoutes extends AnyExternalRoutes, - PluginInputOptions extends {}, > = { id: string; apis?: Iterable<AnyApiFactory>; routes?: Routes; externalRoutes?: ExternalRoutes; featureFlags?: PluginFeatureFlagConfig[]; - __experimentalConfigure?(options?: PluginInputOptions): {}; }; /** diff --git a/packages/core-plugin-api/src/translation/TranslationMessages.test.ts b/packages/core-plugin-api/src/translation/TranslationMessages.test.ts index 5314c8a054..a4ba376e66 100644 --- a/packages/core-plugin-api/src/translation/TranslationMessages.test.ts +++ b/packages/core-plugin-api/src/translation/TranslationMessages.test.ts @@ -23,7 +23,7 @@ const ref = createTranslationRef({ one: 'one', two: 'two', three: 'three', - } as const, + }, }); describe('createTranslationMessages', () => { diff --git a/packages/core-plugin-api/src/translation/TranslationRef.ts b/packages/core-plugin-api/src/translation/TranslationRef.ts index 9ebf39a423..345a9c3f65 100644 --- a/packages/core-plugin-api/src/translation/TranslationRef.ts +++ b/packages/core-plugin-api/src/translation/TranslationRef.ts @@ -108,7 +108,7 @@ class TranslationRefImpl< /** @alpha */ export function createTranslationRef< TId extends string, - TMessages extends { [key in string]: string }, + const TMessages extends { [key in string]: string }, TTranslations extends { [language in string]: () => Promise<{ default: { [key in keyof TMessages]: string | null }; diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 81656967a9..03bd32e124 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,64 @@ # @backstage/create-app +## 0.5.6-next.0 + +### Patch Changes + +- ba6a3b59c1: Removed duplicate `apple-touch-icon` link from `packages/app/public/index.html` that linked to nonexistent icon. +- c8ec0dea4a: Create unique temp directory for each `create-app` execution. +- b665f2ce65: Change base node image from node:18-bullseye-slim to node:18-bookworm-slim due to Docker build error on bullseye. + + You can apply these change to your own `Dockerfile` by replacing `node:18-bullseye-slim` with `node:18-bookworm-slim` + +- deed089a3d: Bump `cypress` to fix the end-to-end tests +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- 04a3f65e15: Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build. + + You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bullseye-slim` + +- 5eacd5d213: The E2E test setup based on Cypress has been replaced with one based on [Playwright](https://playwright.dev/). Migrating existing apps is not required as this is a standalone setup, only do so if you also want to switch from Cypress to Playwright. + + The scripts to run the E2E tests have been removed from `packages/app/package.json`, as they are now instead run from the root. Instead, a new script has been added to the root `package.json`, `yarn test:e2e`, which runs the E2E tests in development mode, unless `CI` is set in the environment. + + The Playwright setup uses utilities from the new `@backstage/e2e-test-utils` package to find and include all packages in the monorepo that have an `e2e-tests` folder. + +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + +## 0.5.5 + +### Patch Changes + +- 05508a9757d2: Updated the backend template to no longer create duplicate connection pools to plugins that use the task scheduler. + + To apply this change in your own repository, perform the following small update: + + ```diff + // in packages/backend/src/index.ts + - const taskScheduler = TaskScheduler.fromConfig(config); + + const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); + ``` + +- a4c08241ad92: Switched the template to use TypeScript 5.2 by default. +- f8c8e8de37b6: Bumped create-app version. +- fc1a38bc5723: Bumped create-app version. +- 4606e005df5d: Added a `fix` scripts that calls the new `backstage-cli repo fix` command. + + To apply this change to an existing app, make the following change to your root `package.json`: + + ```diff + "test": "backstage-cli repo test", + "test:all": "backstage-cli repo test --coverage", + + "fix": "backstage-cli repo fix", + "lint": "backstage-cli repo lint --since origin/master", + ``` + +- 612594022245: Add a notification when `yarn install` is taking a long time. +- 8db70ecbb325: Updated Dockerfile to include `apt-get update` when installing the SQLite dependency +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.5.5-next.3 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index ce19ed6362..c46d4f43fa 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.5.5-next.3", + "version": "0.5.6-next.0", "publishConfig": { "access": "public" }, @@ -46,9 +46,9 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/inquirer": "^8.1.3", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/recursive-readdir": "^2.2.0", - "mock-fs": "^5.1.1", + "mock-fs": "^5.2.0", "nodemon": "^3.0.1", "ts-node": "^10.0.0" }, diff --git a/packages/create-app/src/createApp.test.ts b/packages/create-app/src/createApp.test.ts index 47c62520e0..7cb9733567 100644 --- a/packages/create-app/src/createApp.test.ts +++ b/packages/create-app/src/createApp.test.ts @@ -36,10 +36,6 @@ const templatingMock = jest.spyOn(tasks, 'templatingTask'); const checkAppExistsMock = jest.spyOn(tasks, 'checkAppExistsTask'); const tryInitGitRepositoryMock = jest.spyOn(tasks, 'tryInitGitRepository'); const readGitConfig = jest.spyOn(tasks, 'readGitConfig'); -const createTemporaryAppFolderMock = jest.spyOn( - tasks, - 'createTemporaryAppFolderTask', -); const moveAppMock = jest.spyOn(tasks, 'moveAppTask'); const buildAppMock = jest.spyOn(tasks, 'buildAppTask'); @@ -73,7 +69,6 @@ describe('command entrypoint', () => { const cmd = {} as unknown as Command; await createApp(cmd); expect(checkAppExistsMock).toHaveBeenCalled(); - expect(createTemporaryAppFolderMock).toHaveBeenCalled(); expect(tryInitGitRepositoryMock).toHaveBeenCalled(); expect(templatingMock).toHaveBeenCalled(); expect(templatingMock.mock.lastCall?.[0]).toEqual( @@ -85,7 +80,7 @@ describe('command entrypoint', () => { 'default-app', ), ); - expect(templatingMock.mock.lastCall?.[1]).toEqual( + expect(templatingMock.mock.lastCall?.[1]).toContain( path.join(tmpdir(), 'MyApp'), ); expect(moveAppMock).toHaveBeenCalled(); diff --git a/packages/create-app/src/createApp.ts b/packages/create-app/src/createApp.ts index efa299a3c9..09cede933d 100644 --- a/packages/create-app/src/createApp.ts +++ b/packages/create-app/src/createApp.ts @@ -20,12 +20,12 @@ import inquirer, { Answers } from 'inquirer'; import { resolve as resolvePath } from 'path'; import { findPaths } from '@backstage/cli-common'; import os from 'os'; +import fs from 'fs-extra'; import { Task, buildAppTask, checkAppExistsTask, checkPathExistsTask, - createTemporaryAppFolderTask, moveAppTask, templatingTask, tryInitGitRepository, @@ -37,7 +37,6 @@ const DEFAULT_BRANCH = 'master'; export default async (opts: OptionValues): Promise<void> => { /* eslint-disable-next-line no-restricted-syntax */ const paths = findPaths(__dirname); - const answers: Answers = await inquirer.prompt([ { type: 'input', @@ -68,7 +67,6 @@ export default async (opts: OptionValues): Promise<void> => { const templateDir = opts.templatePath ? paths.resolveTarget(opts.templatePath) : paths.resolveOwn('templates/default-app'); - const tempDir = resolvePath(os.tmpdir(), answers.name); // Use `--path` argument as application directory when specified, otherwise // create a directory using `answers.name` @@ -100,7 +98,7 @@ export default async (opts: OptionValues): Promise<void> => { await checkAppExistsTask(paths.targetDir, answers.name); Task.section('Creating a temporary app directory'); - await createTemporaryAppFolderTask(tempDir); + const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), answers.name)); Task.section('Preparing files'); await templatingTask(templateDir, tempDir, { diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 95ced49490..68afdc9222 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -24,7 +24,6 @@ import { buildAppTask, checkAppExistsTask, checkPathExistsTask, - createTemporaryAppFolderTask, moveAppTask, templatingTask, tryInitGitRepository, @@ -66,6 +65,7 @@ jest.mock('./versions', () => ({ '@backstage/core-app-api': '1.0.0', '@backstage/core-components': '1.0.0', '@backstage/core-plugin-api': '1.0.0', + '@backstage/e2e-test-utils': '1.0.0', '@backstage/integration-react': '1.0.0', '@backstage/plugin-api-docs': '1.0.0', '@backstage/plugin-catalog': '1.0.0', @@ -162,30 +162,6 @@ describe('tasks', () => { }); }); - describe('createTemporaryAppFolderTask', () => { - it('should create a directory at a given path', async () => { - const tempDir = 'projects/tmpFolder'; - await expect( - createTemporaryAppFolderTask(tempDir), - ).resolves.not.toThrow(); - expect(fs.existsSync(tempDir)).toBe(true); - }); - - it('should fail if a directory of the same name exists', async () => { - const tempDir = 'projects/dir'; - await expect(createTemporaryAppFolderTask(tempDir)).rejects.toThrow( - 'file already exists', - ); - }); - - it('should fail if a file of the same name exists', async () => { - const tempDir = 'projects/dir/my-file.txt'; - await expect(createTemporaryAppFolderTask(tempDir)).rejects.toThrow( - 'file already exists', - ); - }); - }); - describe('buildAppTask', () => { it('should change to `appDir` and run `yarn install` and `yarn tsc`', async () => { const mockChdir = jest.spyOn(process, 'chdir'); @@ -304,13 +280,13 @@ describe('tasks', () => { }, ); // catalog was populated with `context.name` - expect( - fs.readFileSync('templatedApp/catalog-info.yaml', 'utf-8'), - ).toContain('name: SuperCoolBackstageInstance'); + await expect( + fs.readFile('templatedApp/catalog-info.yaml', 'utf-8'), + ).resolves.toContain('name: SuperCoolBackstageInstance'); // backend dependencies include `sqlite3` from `context.SQLite` - expect( - fs.readFileSync('templatedApp/packages/backend/package.json', 'utf-8'), - ).toContain('sqlite3"'); + await expect( + fs.readFile('templatedApp/packages/backend/package.json', 'utf-8'), + ).resolves.toContain('sqlite3"'); }); }); diff --git a/packages/create-app/src/lib/tasks.ts b/packages/create-app/src/lib/tasks.ts index 1943b0c3cc..90e6f6ae53 100644 --- a/packages/create-app/src/lib/tasks.ts +++ b/packages/create-app/src/lib/tasks.ts @@ -178,22 +178,6 @@ export async function checkPathExistsTask(path: string) { }); } -/** - * Create a folder to store templated files - * - * @param tempDir - target temporary directory - * @throws if `fs.mkdir` fails - */ -export async function createTemporaryAppFolderTask(tempDir: string) { - await Task.forItem('creating', 'temporary directory', async () => { - try { - await fs.mkdir(tempDir); - } catch (error) { - throw new Error(`Failed to create temporary app directory, ${error}`); - } - }); -} - /** * Run `yarn install` and `run tsc` in application directory * diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts index 72f5c2c9d5..67db8b4a78 100644 --- a/packages/create-app/src/lib/versions.ts +++ b/packages/create-app/src/lib/versions.ts @@ -41,6 +41,7 @@ import { version as config } from '../../../config/package.json'; import { version as coreAppApi } from '../../../core-app-api/package.json'; import { version as coreComponents } from '../../../core-components/package.json'; import { version as corePluginApi } from '../../../core-plugin-api/package.json'; +import { version as e2eTestUtils } from '../../../e2e-test-utils/package.json'; import { version as errors } from '../../../errors/package.json'; import { version as integrationReact } from '../../../integration-react/package.json'; import { version as testUtils } from '../../../test-utils/package.json'; @@ -92,6 +93,7 @@ export const packageVersions = { '@backstage/core-app-api': coreAppApi, '@backstage/core-components': coreComponents, '@backstage/core-plugin-api': corePluginApi, + '@backstage/e2e-test-utils': e2eTestUtils, '@backstage/errors': errors, '@backstage/integration-react': integrationReact, '@backstage/plugin-api-docs': pluginApiDocs, diff --git a/packages/create-app/templates/default-app/.gitignore.hbs b/packages/create-app/templates/default-app/.gitignore.hbs index d452ac2932..fbf813909c 100644 --- a/packages/create-app/templates/default-app/.gitignore.hbs +++ b/packages/create-app/templates/default-app/.gitignore.hbs @@ -49,3 +49,6 @@ site # vscode database functionality support files *.session.sql + +# E2E test reports +e2e-test-report/ diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 315d039187..844a7bca9d 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "engines": { - "node": "16 || 18" + "node": "18 || 20" }, "scripts": { "dev": "concurrently \"yarn start\" \"yarn start-backend\"", @@ -17,6 +17,7 @@ "clean": "backstage-cli repo clean", "test": "backstage-cli repo test", "test:all": "backstage-cli repo test --coverage", + "test:e2e": "playwright test", "fix": "backstage-cli repo fix", "lint": "backstage-cli repo lint --since origin/{{defaultBranch}}", "lint:all": "backstage-cli repo lint", @@ -31,6 +32,8 @@ }, "devDependencies": { "@backstage/cli": "^{{version '@backstage/cli'}}", + "@backstage/e2e-test-utils": "^{{version '@backstage/e2e-test-utils'}}", + "@playwright/test": "^1.32.3", "@spotify/prettier-config": "^12.0.0", "concurrently": "^8.0.0", "lerna": "^4.0.0", diff --git a/packages/create-app/templates/default-app/packages/app/cypress.json b/packages/create-app/templates/default-app/packages/app/cypress.json deleted file mode 100644 index 0cb845a86d..0000000000 --- a/packages/create-app/templates/default-app/packages/app/cypress.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "baseUrl": "http://localhost:3001", - "fixturesFolder": false, - "pluginsFile": false, - "retries": 3 -} diff --git a/packages/create-app/templates/default-app/packages/app/cypress/.eslintrc.json b/packages/create-app/templates/default-app/packages/app/cypress/.eslintrc.json deleted file mode 100644 index b903ff250a..0000000000 --- a/packages/create-app/templates/default-app/packages/app/cypress/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "plugins": ["cypress"], - "extends": ["plugin:cypress/recommended"], - "rules": { - "jest/expect-expect": [ - "error", - { - "assertFunctionNames": ["expect", "cy.contains", "cy.**.should"] - } - ] - } -} diff --git a/packages/create-app/templates/default-app/packages/app/cypress/integration/app.js b/packages/create-app/templates/default-app/packages/app/cypress/integration/app.js deleted file mode 100644 index 43fb2e32de..0000000000 --- a/packages/create-app/templates/default-app/packages/app/cypress/integration/app.js +++ /dev/null @@ -1,6 +0,0 @@ -describe('App', () => { - it('should render the catalog', () => { - cy.visit('/'); - cy.contains('My Company Catalog'); - }); -}); diff --git a/plugins/catalog-customized/src/plugin.ts b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts similarity index 74% rename from plugins/catalog-customized/src/plugin.ts rename to packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts index ce729d5226..d45bc0dbf0 100644 --- a/plugins/catalog-customized/src/plugin.ts +++ b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts @@ -14,9 +14,10 @@ * limitations under the License. */ -import { catalogPlugin } from '@backstage/plugin-catalog'; +import { test, expect } from '@playwright/test'; -// id: 'catalog-customized' -catalogPlugin.__experimentalReconfigure({ - createButtonTitle: 'New', +test('App should render the welcome page', async ({ page }) => { + await page.goto('/'); + + await expect(page.getByText('My Company Catalog')).toBeVisible(); }); diff --git a/packages/create-app/templates/default-app/packages/app/package.json.hbs b/packages/create-app/templates/default-app/packages/app/package.json.hbs index 6793a91dd0..598f049a4c 100644 --- a/packages/create-app/templates/default-app/packages/app/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/app/package.json.hbs @@ -11,11 +11,7 @@ "build": "backstage-cli package build", "clean": "backstage-cli package clean", "test": "backstage-cli package test", - "lint": "backstage-cli package lint", - "test:e2e": "cross-env PORT=3001 start-server-and-test start http://localhost:3001 cy:dev", - "test:e2e:ci": "cross-env PORT=3001 start-server-and-test start http://localhost:3001 cy:run", - "cy:dev": "cypress open", - "cy:run": "cypress run --browser chrome" + "lint": "backstage-cli package lint" }, "dependencies": { "@backstage/app-defaults": "^{{version '@backstage/app-defaults'}}", @@ -54,15 +50,13 @@ }, "devDependencies": { "@backstage/test-utils": "^{{version '@backstage/test-utils'}}", + "@playwright/test": "^1.32.3", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@testing-library/dom": "^8.0.0", "@types/react-dom": "*", - "cross-env": "^7.0.0", - "cypress": "^9.7.0", - "eslint-plugin-cypress": "^2.10.3", - "start-server-and-test": "^1.10.11" + "cross-env": "^7.0.0" }, "browserslist": { "production": [ diff --git a/packages/create-app/templates/default-app/packages/app/public/index.html b/packages/create-app/templates/default-app/packages/app/public/index.html index c6083b3dd2..fc758eee32 100644 --- a/packages/create-app/templates/default-app/packages/app/public/index.html +++ b/packages/create-app/templates/default-app/packages/app/public/index.html @@ -8,7 +8,6 @@ name="description" content="Backstage is an open platform for building developer portals" /> - <link rel="apple-touch-icon" href="<%= publicPath %>/logo192.png" /> <!-- manifest.json provides metadata used when your web app is installed on a user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ diff --git a/packages/create-app/templates/default-app/packages/backend/Dockerfile b/packages/create-app/templates/default-app/packages/backend/Dockerfile index a60fee7a9c..18548e9337 100644 --- a/packages/create-app/templates/default-app/packages/backend/Dockerfile +++ b/packages/create-app/templates/default-app/packages/backend/Dockerfile @@ -9,7 +9,7 @@ # # Once the commands have been run, you can build the image using `yarn build-image` -FROM node:16-bullseye-slim +FROM node:18-bookworm-slim # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ diff --git a/packages/create-app/templates/default-app/playwright.config.ts b/packages/create-app/templates/default-app/playwright.config.ts new file mode 100644 index 0000000000..37c7fb14c7 --- /dev/null +++ b/packages/create-app/templates/default-app/playwright.config.ts @@ -0,0 +1,60 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig } from '@playwright/test'; +import { generateProjects } from '@backstage/e2e-test-utils/playwright'; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + timeout: 60_000, + + expect: { + timeout: 5_000, + }, + + // Run your local dev server before starting the tests + webServer: process.env.CI + ? [] + : [ + { + command: 'yarn start', + port: 3000, + reuseExistingServer: true, + timeout: 60_000, + }, + ], + + forbidOnly: !!process.env.CI, + + retries: process.env.CI ? 2 : 0, + + reporter: [['html', { open: 'never', outputFolder: 'e2e-test-report' }]], + + use: { + actionTimeout: 0, + baseURL: + process.env.PLAYWRIGHT_URL ?? + (process.env.CI ? 'http://localhost:7007' : 'http://localhost:3000'), + screenshot: 'only-on-failure', + trace: 'on-first-retry', + }, + + outputDir: 'node_modules/.cache/e2e-test-results', + + projects: generateProjects(), // Find all packages with e2e-test folders +}); diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 1b9d30478c..714ca3bd1f 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/dev-utils +## 1.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/test-utils@1.4.4-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 1.0.21 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 1.0.21-next.3 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index ba417c02e1..fb2b086d44 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.21-next.3", + "version": "1.0.22-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/e2e-test-utils/.eslintrc.js b/packages/e2e-test-utils/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/e2e-test-utils/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/e2e-test-utils/CHANGELOG.md b/packages/e2e-test-utils/CHANGELOG.md new file mode 100644 index 0000000000..de15b39751 --- /dev/null +++ b/packages/e2e-test-utils/CHANGELOG.md @@ -0,0 +1,7 @@ +# @backstage/e2e-test-utils + +## 0.1.0-next.0 + +### Minor Changes + +- f5b41b27a9: Initial release. diff --git a/packages/e2e-test-utils/README.md b/packages/e2e-test-utils/README.md new file mode 100644 index 0000000000..d9459dc64a --- /dev/null +++ b/packages/e2e-test-utils/README.md @@ -0,0 +1,12 @@ +# @backstage/e2e-test-utils + +_This package was created through the Backstage CLI_. + +## Installation + +Install the package via Yarn: + +```sh +cd <package-dir> # if within a monorepo +yarn add --dev @backstage/e2e-test-utils +``` diff --git a/packages/e2e-test-utils/catalog-info.yaml b/packages/e2e-test-utils/catalog-info.yaml new file mode 100644 index 0000000000..d1dea51dc5 --- /dev/null +++ b/packages/e2e-test-utils/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-e2e-test-utils + title: '@backstage/e2e-test-utils' + description: Shared end-to-end test utilities Backstage +spec: + lifecycle: experimental + type: backstage-node-library + owner: maintainers diff --git a/packages/e2e-test-utils/package.json b/packages/e2e-test-utils/package.json new file mode 100644 index 0000000000..fcbae56796 --- /dev/null +++ b/packages/e2e-test-utils/package.json @@ -0,0 +1,57 @@ +{ + "name": "@backstage/e2e-test-utils", + "description": "Shared end-to-end test utilities Backstage", + "version": "0.1.0-next.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "exports": { + "./playwright": "./src/playwright/index.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "playwright": [ + "src/playwright/index.ts" + ], + "package.json": [ + "package.json" + ] + } + }, + "backstage": { + "role": "node-library" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^10.1.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/cli-node": "workspace:^", + "@types/fs-extra": "^9.0.1" + }, + "peerDependencies": { + "@playwright/test": "^1.32.3" + }, + "peerDependenciesMeta": { + "@playwright/test": { + "optional": true + } + }, + "files": [ + "dist" + ] +} diff --git a/packages/e2e-test-utils/playwright-api-report.md b/packages/e2e-test-utils/playwright-api-report.md new file mode 100644 index 0000000000..7153f2e578 --- /dev/null +++ b/packages/e2e-test-utils/playwright-api-report.md @@ -0,0 +1,15 @@ +## API Report File for "@backstage/e2e-test-utils" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { PlaywrightTestConfig } from '@playwright/test'; + +// @public +export function failOnBrowserErrors(): void; + +// @public +export function generateProjects(): PlaywrightTestConfig['projects']; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/kubernetes/src/components/ResourceUtilization/index.ts b/packages/e2e-test-utils/src/index.ts similarity index 90% rename from plugins/kubernetes/src/components/ResourceUtilization/index.ts rename to packages/e2e-test-utils/src/index.ts index 33d232cbf4..4b9026cde5 100644 --- a/plugins/kubernetes/src/components/ResourceUtilization/index.ts +++ b/packages/e2e-test-utils/src/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { ResourceUtilization } from './ResourceUtilization'; +export {}; diff --git a/packages/e2e-test-utils/src/playwright.ts b/packages/e2e-test-utils/src/playwright.ts new file mode 100644 index 0000000000..63599d30db --- /dev/null +++ b/packages/e2e-test-utils/src/playwright.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './playwright/index'; diff --git a/packages/e2e-test-utils/src/playwright/failOnBrowserErrors.ts b/packages/e2e-test-utils/src/playwright/failOnBrowserErrors.ts new file mode 100644 index 0000000000..af7baa9540 --- /dev/null +++ b/packages/e2e-test-utils/src/playwright/failOnBrowserErrors.ts @@ -0,0 +1,37 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test } from '@playwright/test'; + +/** + * Calling this at the top of your test file will ensure that tests fail if the browser + * logs any errors or if there are any uncaught exceptions. + * + * @public + */ +export function failOnBrowserErrors(): void { + test.beforeEach(async ({ page }) => { + page.on('pageerror', error => { + throw new Error(`Uncaught exception on page, ${error}`); + }); + + page.on('console', msg => { + if (msg.type() === 'error') { + throw new Error(`Unexpected console error message "${msg.text()}"`); + } + }); + }); +} diff --git a/packages/e2e-test-utils/src/playwright/generateProjects.ts b/packages/e2e-test-utils/src/playwright/generateProjects.ts new file mode 100644 index 0000000000..b6f3d159c5 --- /dev/null +++ b/packages/e2e-test-utils/src/playwright/generateProjects.ts @@ -0,0 +1,42 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import fs from 'fs-extra'; +import { resolve as resolvePath } from 'path'; +import { PlaywrightTestConfig } from '@playwright/test'; +import { getPackagesSync } from '@manypkg/get-packages'; +import type { BackstagePackage } from '@backstage/cli-node'; + +/** + * Generates a list of playwright projects by scanning the monorepo for packages with an `e2e-tests/` folder. + * + * @public + */ +export function generateProjects(): PlaywrightTestConfig['projects'] { + // TODO(Rugvip): Switch this over to use @backstage/cli-node once released, and support SINCE=origin/main + const { root, packages } = getPackagesSync(process.cwd()); + const e2eTestPackages = [...(root ? [root] : []), ...packages].filter(pkg => { + return fs.pathExistsSync(resolvePath(pkg.dir, 'e2e-tests')); + }) as BackstagePackage[]; + + return e2eTestPackages.map(pkg => ({ + name: pkg.packageJson.name, + testDir: resolvePath(pkg.dir, 'e2e-tests'), + use: { + channel: 'chrome', + }, + })); +} diff --git a/packages/e2e-test-utils/src/playwright/index.ts b/packages/e2e-test-utils/src/playwright/index.ts new file mode 100644 index 0000000000..c5750581d7 --- /dev/null +++ b/packages/e2e-test-utils/src/playwright/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { generateProjects } from './generateProjects'; +export { failOnBrowserErrors } from './failOnBrowserErrors'; diff --git a/packages/e2e-test-utils/src/setupTests.ts b/packages/e2e-test-utils/src/setupTests.ts new file mode 100644 index 0000000000..4b9026cde5 --- /dev/null +++ b/packages/e2e-test-utils/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export {}; diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index c061c8707f..1fdf65a72e 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,23 @@ # e2e-test +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.6-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/errors@1.2.2 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.5 + - @backstage/errors@1.2.2 + - @backstage/cli-common@0.1.12 + ## 0.2.7-next.3 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 3824804a4f..1308c60d96 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,7 +1,7 @@ { "name": "e2e-test", "description": "E2E test for verifying Backstage packages", - "version": "0.2.7-next.3", + "version": "0.2.8-next.0", "private": true, "backstage": { "role": "cli" @@ -37,13 +37,12 @@ "handlebars": "^4.7.3", "mysql2": "^2.2.5", "pgtools": "^1.0.0", - "puppeteer": "^17.0.0", "tree-kill": "^1.2.2" }, "devDependencies": { "@backstage/cli": "workspace:^", "@types/fs-extra": "^9.0.1", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/puppeteer": "^5.4.4", "nodemon": "^3.0.1", "ts-node": "^10.0.0" diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts index 20b2753f6b..cf95f6856d 100644 --- a/packages/e2e-test/src/commands/run.ts +++ b/packages/e2e-test/src/commands/run.ts @@ -20,13 +20,11 @@ import fetch from 'cross-fetch'; 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, runPlain, - waitForPageWithText, waitFor, waitForExit, print, @@ -42,6 +40,7 @@ const paths = findPaths(__dirname); const templatePackagePaths = [ 'packages/cli/templates/default-plugin/package.json.hbs', + 'packages/create-app/templates/default-app/package.json.hbs', 'packages/create-app/templates/default-app/packages/app/package.json.hbs', 'packages/create-app/templates/default-app/packages/backend/package.json.hbs', ]; @@ -66,8 +65,11 @@ export async function run() { print('Creating a Backstage Backend Plugin'); await createPlugin({ appDir, pluginId, select: 'backend-plugin' }); - print('Starting the app'); - await testAppServe(pluginId, appDir); + print(`Running 'yarn test:e2e' in newly created app with new plugin`); + await runPlain(['yarn', 'test:e2e'], { + cwd: appDir, + env: { ...process.env, CI: undefined }, + }); if ( Boolean(process.env.POSTGRES_USER) || @@ -181,6 +183,12 @@ async function buildDistWorkspace(workspaceName: string, rootDir: string) { print('Pinning yarn version in workspace'); await pinYarnVersion(workspaceDir); + const yarnPatchesPath = paths.resolveOwnRoot('.yarn/patches'); + if (await fs.pathExists(yarnPatchesPath)) { + print('Copying yarn patches'); + await fs.copy(yarnPatchesPath, resolvePath(workspaceDir, '.yarn/patches')); + } + print('Installing workspace dependencies'); await runPlain(['yarn', 'workspaces', 'focus', '--all', '--production'], { cwd: workspaceDir, @@ -291,15 +299,6 @@ async function createApp( await runPlain(['yarn', cmd], { cwd: appDir }); } - print(`Running 'yarn test:e2e:ci' in newly created app`); - await runPlain(['yarn', 'test:e2e:ci'], { - cwd: resolvePath(appDir, 'packages', 'app'), - env: { - ...process.env, - APP_CONFIG_app_baseUrl: '"http://localhost:3001"', - }, - }); - return appDir; } finally { child.kill(); @@ -375,63 +374,6 @@ async function createPlugin(options: { } } -/** - * Start serving the newly created app and make sure that the create plugin is rendering correctly - */ -async function testAppServe(pluginId: string, appDir: string) { - const startApp = spawnPiped(['yarn', 'start'], { - cwd: appDir, - env: { - ...process.env, - GITHUB_TOKEN: 'abc', - }, - }); - - let successful = false; - - let browser; - try { - for (let attempts = 1; ; attempts++) { - try { - browser = await puppeteer.launch(); - const page = await browser.newPage(); - - await page.goto('http://localhost:3000', { waitUntil: 'networkidle0' }); - - await waitForPageWithText(page, '/', 'My Company Catalog'); - await waitForPageWithText( - page, - `/${pluginId}`, - `Welcome to ${pluginId}!`, - ); - - print('Both App and Plugin loaded correctly'); - successful = true; - break; - } catch (error) { - if (attempts >= 20) { - throw new Error(`App serve test failed, ${error}`); - } - print(`App serve failed, trying again, ${error}`); - await new Promise(resolve => setTimeout(resolve, 1000)); - } - } - } finally { - // Kill entire process group, otherwise we'll end up with hanging serve processes - await new Promise<void>((res, rej) => { - killTree(startApp.pid!, err => (err ? rej(err) : res())); - }); - } - - try { - await waitForExit(startApp); - } catch (error) { - if (!successful) { - throw error; - } - } -} - /** Drops PG databases */ async function dropDB(database: string, client: string) { try { @@ -521,6 +463,10 @@ async function testBackendStart(appDir: string, ...args: string[]) { !l.includes('check the migration guide at https://a.co/7PzMCcy') && !l.includes( '(Use `node --trace-warnings ...` to show where the warning was created)', + ) && + !l.includes('Custom ESM Loaders is an experimental feature') && + !l.includes( + 'ExperimentalWarning: `globalPreload` is planned for removal', ), ).length !== 0 ); diff --git a/packages/e2e-test/src/lib/helpers.ts b/packages/e2e-test/src/lib/helpers.ts index b3fd665fd2..fc5aefcff9 100644 --- a/packages/e2e-test/src/lib/helpers.ts +++ b/packages/e2e-test/src/lib/helpers.ts @@ -22,7 +22,6 @@ import { ChildProcess, } from 'child_process'; import { promisify } from 'util'; -import puppeteer from 'puppeteer'; const execFile = promisify(execFileCb); @@ -125,50 +124,6 @@ export async function waitForExit(child: ChildProcess) { ); } -export async function waitForPageWithText( - page: puppeteer.Page, - path: string, - text: string, - { intervalMs = 1000, maxFindAttempts = 50 } = {}, -) { - let findAttempts = 0; - for (;;) { - try { - const waitTimeMs = intervalMs * (findAttempts + 1); - console.log(`Attempting to load page at ${path}, waiting ${waitTimeMs}`); - await new Promise(resolve => setTimeout(resolve, waitTimeMs)); - - await page.goto(`http://localhost:3000${path}`, { - waitUntil: 'networkidle0', - }); - - const match = await page.evaluate( - textContent => - Array.from(document.querySelectorAll('*')).some( - el => el.textContent === textContent, - ), - text, - ); - - if (!match) { - throw new Error(`Expected to find text ${text}`); - } - - break; - } catch (error) { - console.log(error); - assertError(error); - - findAttempts++; - if (findAttempts >= maxFindAttempts) { - throw new Error( - `Failed to load page '${path}', max number of attempts reached`, - ); - } - } - } -} - export function print(msg: string) { return process.stdout.write(`${msg}\n`); } diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 901fe69c0c..689b3617fc 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/errors +## 1.2.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/types@1.1.1 + ## 1.2.2-next.0 ### Patch Changes diff --git a/packages/errors/package.json b/packages/errors/package.json index 68e030aed8..8d274be401 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/errors", "description": "Common utilities for error handling within Backstage", - "version": "1.2.2-next.0", + "version": "1.2.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 5c669f4d3d..a1228e084c 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/frontend-app-api +## 0.2.0-next.0 + +### Minor Changes + +- 9d03dfe5e3: The `createApp` config option has been replaced by a new `configLoader` option. There is now also a `pluginLoader` option that can be used to dynamically load plugins into the app. + +### Patch Changes + +- 322bbcae24: Internal update for removal of experimental plugin configuration API. +- 66d51a4827: Prevents root extension override and duplicated plugin extensions. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-graphiql@0.2.55-next.0 + - @backstage/types@1.1.1 + +## 0.1.0 + +### Minor Changes + +- 628ca7e458e4: Initial release + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-graphiql@0.2.54 + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + ## 0.1.0-next.0 ### Minor Changes diff --git a/packages/frontend-app-api/api-report.md b/packages/frontend-app-api/api-report.md index 12cf853f9d..2e77ef904b 100644 --- a/packages/frontend-app-api/api-report.md +++ b/packages/frontend-app-api/api-report.md @@ -12,7 +12,8 @@ import { JSX as JSX_2 } from 'react'; // @public (undocumented) export function createApp(options: { plugins: BackstagePlugin[]; - config?: ConfigApi; + configLoader?: () => Promise<ConfigApi>; + pluginLoader?: (ctx: { config: ConfigApi }) => Promise<BackstagePlugin[]>; }): { createRoot(): JSX_2.Element; }; diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 9a4c8a44da..6c45e9239a 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.1.0-next.0", + "version": "0.2.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,7 +24,9 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@testing-library/jest-dom": "^5.10.1" + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3" }, "configSchema": "config.d.ts", "files": [ @@ -38,8 +40,10 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", "@backstage/plugin-graphiql": "workspace:^", + "@backstage/theme": "workspace:^", "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.4", + "@material-ui/icons": "^4.11.3", "@types/react": "^16.13.1 || ^17.0.0", "lodash": "^4.17.21" }, diff --git a/packages/frontend-app-api/src/extensions/Core.tsx b/packages/frontend-app-api/src/extensions/Core.tsx index cb93b2888f..4cb21a8702 100644 --- a/packages/frontend-app-api/src/extensions/Core.tsx +++ b/packages/frontend-app-api/src/extensions/Core.tsx @@ -17,17 +17,16 @@ import { coreExtensionData, createExtension, + createExtensionInput, } from '@backstage/frontend-plugin-api'; export const Core = createExtension({ id: 'core', at: 'root', inputs: { - apis: { - extensionData: { - api: coreExtensionData.apiFactory, - }, - }, + apis: createExtensionInput({ + api: coreExtensionData.apiFactory, + }), }, output: {}, factory() {}, diff --git a/packages/frontend-app-api/src/extensions/CoreLayout.tsx b/packages/frontend-app-api/src/extensions/CoreLayout.tsx index 29680bf23c..0c5c0446fc 100644 --- a/packages/frontend-app-api/src/extensions/CoreLayout.tsx +++ b/packages/frontend-app-api/src/extensions/CoreLayout.tsx @@ -18,6 +18,7 @@ import React from 'react'; import { createExtension, coreExtensionData, + createExtensionInput, } from '@backstage/frontend-plugin-api'; import { SidebarPage } from '@backstage/core-components'; @@ -25,39 +26,28 @@ export const CoreLayout = createExtension({ id: 'core.layout', at: 'root', inputs: { - nav: { - extensionData: { + nav: createExtensionInput( + { element: coreExtensionData.reactElement, }, - }, - content: { - extensionData: { + { singleton: true }, + ), + content: createExtensionInput( + { element: coreExtensionData.reactElement, }, - }, + { singleton: true }, + ), }, output: { element: coreExtensionData.reactElement, }, factory({ bind, inputs }) { - // TODO: Support this as part of the core system - if (inputs.nav.length !== 1) { - throw Error( - `Extension 'core.layout' did not receive exactly one 'nav' input, got ${inputs.nav.length}`, - ); - } - if (inputs.content.length !== 1) { - throw Error( - `Extension 'core.layout' did not receive exactly one 'content' input, got ${inputs.content.length}`, - ); - } - bind({ - // TODO: set base path using the logic from AppRouter element: ( <SidebarPage> - {inputs.nav[0].element} - {inputs.content[0].element} + {inputs.nav.element} + {inputs.content.element} </SidebarPage> ), }); diff --git a/packages/frontend-app-api/src/extensions/CoreNav.tsx b/packages/frontend-app-api/src/extensions/CoreNav.tsx index da709d1eb3..71ab71a6aa 100644 --- a/packages/frontend-app-api/src/extensions/CoreNav.tsx +++ b/packages/frontend-app-api/src/extensions/CoreNav.tsx @@ -18,6 +18,9 @@ import React from 'react'; import { createExtension, coreExtensionData, + createExtensionInput, + useRouteRef, + NavTarget, } from '@backstage/frontend-plugin-api'; import { makeStyles } from '@material-ui/core'; import { @@ -28,7 +31,6 @@ import { SidebarDivider, SidebarItem, } from '@backstage/core-components'; -import { GraphiQLIcon } from '@backstage/plugin-graphiql'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import LogoIcon from '../../../app/src/components/Root/LogoIcon'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports @@ -62,27 +64,33 @@ const SidebarLogo = () => { ); }; +const SidebarNavItem = (props: NavTarget) => { + const { icon: Icon, title, routeRef } = props; + const to = useRouteRef(routeRef)(); + // TODO: Support opening modal, for example, the search one + return <SidebarItem to={to} icon={Icon} text={title} />; +}; + export const CoreNav = createExtension({ id: 'core.nav', at: 'core.layout/nav', inputs: { - targets: { - extensionData: { - path: coreExtensionData.navTarget, - }, - }, + items: createExtensionInput({ + target: coreExtensionData.navTarget, + }), }, output: { element: coreExtensionData.reactElement, }, - factory({ bind }) { + factory({ bind, inputs }) { bind({ - // TODO: set base path using the logic from AppRouter element: ( <Sidebar> <SidebarLogo /> <SidebarDivider /> - <SidebarItem icon={GraphiQLIcon} to="graphiql" text="GraphiQL" /> + {inputs.items.map((item, index) => ( + <SidebarNavItem {...item.target} key={index} /> + ))} </Sidebar> ), }); diff --git a/packages/frontend-app-api/src/extensions/CoreRoutes.tsx b/packages/frontend-app-api/src/extensions/CoreRoutes.tsx index 5a6cd87bfd..5c79b56f43 100644 --- a/packages/frontend-app-api/src/extensions/CoreRoutes.tsx +++ b/packages/frontend-app-api/src/extensions/CoreRoutes.tsx @@ -18,6 +18,7 @@ import React from 'react'; import { createExtension, coreExtensionData, + createExtensionInput, } from '@backstage/frontend-plugin-api'; import { useRoutes } from 'react-router-dom'; @@ -25,13 +26,11 @@ export const CoreRoutes = createExtension({ id: 'core.routes', at: 'core.layout/content', inputs: { - routes: { - extensionData: { - path: coreExtensionData.routePath, - ref: coreExtensionData.routeRef, - element: coreExtensionData.reactElement, - }, - }, + routes: createExtensionInput({ + path: coreExtensionData.routePath, + ref: coreExtensionData.routeRef.optional(), + element: coreExtensionData.reactElement, + }), }, output: { element: coreExtensionData.reactElement, diff --git a/packages/frontend-app-api/src/extensions/themes.tsx b/packages/frontend-app-api/src/extensions/themes.tsx new file mode 100644 index 0000000000..ea11b6a638 --- /dev/null +++ b/packages/frontend-app-api/src/extensions/themes.tsx @@ -0,0 +1,44 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { + UnifiedThemeProvider, + themes as builtinThemes, +} from '@backstage/theme'; +import DarkIcon from '@material-ui/icons/Brightness2'; +import LightIcon from '@material-ui/icons/WbSunny'; +import { createThemeExtension } from '@backstage/frontend-plugin-api'; + +export const LightTheme = createThemeExtension({ + id: 'light', + title: 'Light Theme', + variant: 'light', + icon: <LightIcon />, + Provider: ({ children }) => ( + <UnifiedThemeProvider theme={builtinThemes.light} children={children} /> + ), +}); + +export const DarkTheme = createThemeExtension({ + id: 'dark', + title: 'Dark Theme', + variant: 'dark', + icon: <DarkIcon />, + Provider: ({ children }) => ( + <UnifiedThemeProvider theme={builtinThemes.dark} children={children} /> + ), +}); diff --git a/packages/frontend-app-api/src/wiring/createApp.test.tsx b/packages/frontend-app-api/src/wiring/createApp.test.tsx new file mode 100644 index 0000000000..f6172f5a4b --- /dev/null +++ b/packages/frontend-app-api/src/wiring/createApp.test.tsx @@ -0,0 +1,137 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + createExtension, + createPageExtension, + createPlugin, + createThemeExtension, +} from '@backstage/frontend-plugin-api'; +import { createApp, createInstances } from './createApp'; +import { screen } from '@testing-library/react'; +import { MockConfigApi, renderWithEffects } from '@backstage/test-utils'; +import React from 'react'; +import { createRouteRef } from '@backstage/core-plugin-api'; + +describe('createInstances', () => { + it('throws an error when a root extension is parametrized', () => { + const config = new MockConfigApi({ + app: { + extensions: [ + { + root: { + at: '', + }, + }, + ], + }, + }); + const plugins = [ + createPlugin({ + id: 'plugin', + extensions: [], + }), + ]; + expect(() => createInstances({ config, plugins })).toThrow( + "A 'root' extension configuration was detected, but the root extension is not configurable", + ); + }); + + it('throws an error when a root extension is overridden', () => { + const config = new MockConfigApi({}); + const plugins = [ + createPlugin({ + id: 'plugin', + extensions: [ + createExtension({ + id: 'root', + at: 'core.routes/route', + inputs: {}, + output: {}, + factory() {}, + }), + ], + }), + ]; + expect(() => createInstances({ config, plugins })).toThrow( + "The following plugin(s) are overriding the 'root' extension which is forbidden: plugin", + ); + }); + + it('throws an error when duplicated extensions are detected', () => { + const config = new MockConfigApi({}); + + const ExtensionA = createPageExtension({ + id: 'A', + defaultPath: '/', + routeRef: createRouteRef({ id: 'A.route' }), + loader: async () => <div>Extension A</div>, + }); + + const ExtensionB = createPageExtension({ + id: 'B', + defaultPath: '/', + routeRef: createRouteRef({ id: 'B.route' }), + loader: async () => <div>Extension B</div>, + }); + + const PluginA = createPlugin({ + id: 'A', + extensions: [ExtensionA, ExtensionA], + }); + + const PluginB = createPlugin({ + id: 'B', + extensions: [ExtensionA, ExtensionB, ExtensionB], + }); + + const plugins = [PluginA, PluginB]; + + expect(() => createInstances({ config, plugins })).toThrow( + "The following extensions are duplicated: The extension 'A' was provided 2 time(s) by the plugin 'A' and 1 time(s) by the plugin 'B', The extension 'B' was provided 2 time(s) by the plugin 'B'", + ); + }); +}); + +describe('createApp', () => { + it('should allow themes to be installed', async () => { + const app = createApp({ + configLoader: async () => + new MockConfigApi({ + app: { + extensions: [{ 'themes.light': false }, { 'themes.dark': false }], + }, + }), + plugins: [ + createPlugin({ + id: 'test', + extensions: [ + createThemeExtension({ + id: 'derp', + title: 'Derp', + variant: 'dark', + Provider: () => <div>Derp</div>, + }), + ], + }), + ], + }); + + await renderWithEffects(app.createRoot()); + + await expect(screen.findByText('Derp')).resolves.toBeInTheDocument(); + }); +}); diff --git a/packages/frontend-app-api/src/wiring/createApp.tsx b/packages/frontend-app-api/src/wiring/createApp.tsx index 44d534f702..deb19d919d 100644 --- a/packages/frontend-app-api/src/wiring/createApp.tsx +++ b/packages/frontend-app-api/src/wiring/createApp.tsx @@ -49,6 +49,8 @@ import { featureFlagsApiRef, attachComponentData, useRouteRef, + identityApiRef, + AppTheme, } from '@backstage/core-plugin-api'; import { getAvailablePlugins } from './discovery'; import { @@ -62,6 +64,8 @@ import { // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { AppThemeProvider } from '../../../core-app-api/src/app/AppThemeProvider'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { AppIdentityProxy } from '../../../core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports import { AppContextProvider } from '../../../core-app-api/src/app/AppContext'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { LocalStorageFeatureFlags } from '../../../core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags'; @@ -74,10 +78,10 @@ import { apis as defaultApis, components as defaultComponents, icons as defaultIcons, - themes as defaultThemes, } from '../../../app-defaults/src/defaults'; import { BrowserRouter, Route } from 'react-router-dom'; import { SidebarItem } from '@backstage/core-components'; +import { DarkTheme, LightTheme } from '../extensions/themes'; /** @public */ export interface ExtensionTreeNode { @@ -168,7 +172,14 @@ export function createInstances(options: { plugins: BackstagePlugin[]; config: Config; }) { - const builtinExtensions = [Core, CoreRoutes, CoreNav, CoreLayout]; + const builtinExtensions = [ + Core, + CoreRoutes, + CoreNav, + CoreLayout, + LightTheme, + DarkTheme, + ]; // pull in default extension instance from discovered packages // apply config to adjust default extension instances and add more @@ -209,18 +220,18 @@ export function createInstances(options: { function createInstance( instanceParams: ExtensionInstanceParameters, ): ExtensionInstance { - const existingInstance = instances.get(instanceParams.extension.id); + const extensionId = instanceParams.extension.id; + const existingInstance = instances.get(extensionId); if (existingInstance) { return existingInstance; } const attachments = new Map( - Array.from( - attachmentMap.get(instanceParams.extension.id)?.entries() ?? [], - ).map(([inputName, attachmentConfigs]) => [ - inputName, - attachmentConfigs.map(createInstance), - ]), + Array.from(attachmentMap.get(extensionId)?.entries() ?? []).map( + ([inputName, attachmentConfigs]) => { + return [inputName, attachmentConfigs.map(createInstance)]; + }, + ), ); const newInstance = createExtensionInstance({ @@ -230,7 +241,7 @@ export function createInstances(options: { attachments, }); - instances.set(instanceParams.extension.id, newInstance); + instances.set(extensionId, newInstance); return newInstance; } @@ -247,48 +258,71 @@ export function createInstances(options: { /** @public */ export function createApp(options: { plugins: BackstagePlugin[]; - config?: ConfigApi; + configLoader?: () => Promise<ConfigApi>; + pluginLoader?: (ctx: { config: ConfigApi }) => Promise<BackstagePlugin[]>; }): { createRoot(): JSX.Element; } { - const discoveredPlugins = getAvailablePlugins(); - const allPlugins = [...discoveredPlugins, ...options.plugins]; - const appConfig = - options?.config ?? - ConfigReader.fromConfigs(overrideBaseUrlConfigs(defaultConfigLoaderSync())); + async function appLoader() { + const config = + (await options?.configLoader?.()) ?? + ConfigReader.fromConfigs( + overrideBaseUrlConfigs(defaultConfigLoaderSync()), + ); - const { rootInstances } = createInstances({ - plugins: allPlugins, - config: appConfig, - }); + const discoveredPlugins = getAvailablePlugins(); + const loadedPlugins = (await options.pluginLoader?.({ config })) ?? []; + const allPlugins = Array.from( + new Set([...discoveredPlugins, ...options.plugins, ...loadedPlugins]), + ); - const routePaths = extractRouteInfoFromInstanceTree(rootInstances); + const { rootInstances } = createInstances({ + plugins: allPlugins, + config, + }); - const coreInstance = rootInstances.find(({ id }) => id === 'core'); - if (!coreInstance) { - throw Error('Unable to find core extension instance'); + const routePaths = extractRouteInfoFromInstanceTree(rootInstances); + + const coreInstance = rootInstances.find(({ id }) => id === 'core'); + if (!coreInstance) { + throw Error('Unable to find core extension instance'); + } + + const apiHolder = createApiHolder(coreInstance, config); + + const appContext = createLegacyAppContext(allPlugins); + + const rootElements = rootInstances + .map(e => ( + <React.Fragment key={e.id}> + {e.getData(coreExtensionData.reactElement)} + </React.Fragment> + )) + .filter((x): x is JSX.Element => !!x); + + const App = () => ( + <ApiProvider apis={apiHolder}> + <AppContextProvider appContext={appContext}> + <AppThemeProvider> + <RoutingProvider routePaths={routePaths}> + {/* TODO: set base path using the logic from AppRouter */} + <BrowserRouter>{rootElements}</BrowserRouter> + </RoutingProvider> + </AppThemeProvider> + </AppContextProvider> + </ApiProvider> + ); + + return { default: App }; } - const apiHolder = createApiHolder(coreInstance, appConfig); - - const appContext = createLegacyAppContext(allPlugins); - return { createRoot() { - const rootElements = rootInstances - .map(e => e.getData(coreExtensionData.reactElement)) - .filter((x): x is JSX.Element => !!x); + const LazyApp = React.lazy(appLoader); return ( - <ApiProvider apis={apiHolder}> - <AppContextProvider appContext={appContext}> - <AppThemeProvider> - <RoutingProvider routePaths={routePaths}> - {/* TODO: set base path using the logic from AppRouter */} - <BrowserRouter>{rootElements}</BrowserRouter> - </RoutingProvider> - </AppThemeProvider> - </AppContextProvider> - </ApiProvider> + <React.Suspense fallback="Loading..."> + <LazyApp /> + </React.Suspense> ); }, }; @@ -312,7 +346,6 @@ function toLegacyPlugin(plugin: BackstagePlugin): LegacyBackstagePlugin { getApis: notImplemented, getFeatureFlags: notImplemented, provide: notImplemented, - __experimentalReconfigure: notImplemented, }; } @@ -344,13 +377,19 @@ function createApiHolder( ): ApiHolder { const factoryRegistry = new ApiFactoryRegistry(); - const apiFactories = + const pluginApis = coreExtension.attachments .get('apis') ?.map(e => e.getData(coreExtensionData.apiFactory)) .filter((x): x is AnyApiFactory => !!x) ?? []; - for (const factory of apiFactories) { + const themeExtensions = + coreExtension.attachments + .get('themes') + ?.map(e => e.getData(coreExtensionData.theme)) + .filter((x): x is AppTheme => !!x) ?? []; + + for (const factory of [...defaultApis, ...pluginApis]) { factoryRegistry.register('default', factory); } @@ -361,11 +400,43 @@ function createApiHolder( factory: () => new LocalStorageFeatureFlags(), }); + factoryRegistry.register('static', { + api: identityApiRef, + deps: {}, + factory: () => { + const appIdentityProxy = new AppIdentityProxy(); + // TODO: Remove this when sign-in page is migrated + appIdentityProxy.setTarget( + { + getUserId: () => 'guest', + getIdToken: async () => undefined, + getProfile: () => ({ + email: 'guest@example.com', + displayName: 'Guest', + }), + getProfileInfo: async () => ({ + email: 'guest@example.com', + displayName: 'Guest', + }), + getBackstageIdentity: async () => ({ + type: 'user', + userEntityRef: 'user:default/guest', + ownershipEntityRefs: ['user:default/guest'], + }), + getCredentials: async () => ({}), + signOut: async () => {}, + }, + { signOutTargetUrl: '/' }, + ); + return appIdentityProxy; + }, + }); + factoryRegistry.register('static', { api: appThemeApiRef, deps: {}, // TODO: add extension for registering themes - factory: () => AppThemeSelector.createWithStorage(defaultThemes), + factory: () => AppThemeSelector.createWithStorage(themeExtensions), }); factoryRegistry.register('static', { diff --git a/packages/frontend-app-api/src/wiring/createExtensionInstance.test.ts b/packages/frontend-app-api/src/wiring/createExtensionInstance.test.ts new file mode 100644 index 0000000000..12e109874a --- /dev/null +++ b/packages/frontend-app-api/src/wiring/createExtensionInstance.test.ts @@ -0,0 +1,370 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + createExtension, + createExtensionDataRef, + createExtensionInput, + createSchemaFromZod, +} from '@backstage/frontend-plugin-api'; +import { createExtensionInstance } from './createExtensionInstance'; + +const testDataRef = createExtensionDataRef<string>('test'); +const otherDataRef = createExtensionDataRef<number>('other'); +const inputMirrorDataRef = createExtensionDataRef<unknown>('mirror'); + +const simpleExtension = createExtension({ + id: 'core.test', + at: 'ignored', + output: { + test: testDataRef, + other: otherDataRef.optional(), + }, + configSchema: createSchemaFromZod(z => + z.object({ + output: z.string().default('test'), + other: z.number().optional(), + }), + ), + factory({ bind, config }) { + bind({ test: config.output, other: config.other }); + }, +}); + +describe('createExtensionInstance', () => { + it('should create a simple extension instance', () => { + const attachments = new Map(); + const instance = createExtensionInstance({ + attachments, + config: undefined, + extension: simpleExtension, + }); + + expect(instance.id).toBe('core.test'); + expect(instance.attachments).toBe(attachments); + expect(instance.getData(testDataRef)).toEqual('test'); + }); + + it('should create an extension with different kind of inputs', () => { + const attachments = new Map([ + [ + 'optionalSingletonPresent', + [ + createExtensionInstance({ + attachments: new Map(), + config: { output: 'optionalSingletonPresent' }, + extension: simpleExtension, + }), + ], + ], + [ + 'singleton', + [ + createExtensionInstance({ + attachments: new Map(), + config: { output: 'singleton', other: 2 }, + extension: simpleExtension, + }), + ], + ], + [ + 'many', + [ + createExtensionInstance({ + attachments: new Map(), + config: { output: 'many1' }, + extension: simpleExtension, + }), + createExtensionInstance({ + attachments: new Map(), + config: { output: 'many2', other: 3 }, + extension: simpleExtension, + }), + ], + ], + ]); + const instance = createExtensionInstance({ + attachments, + config: undefined, + extension: createExtension({ + id: 'core.test', + at: 'ignored', + inputs: { + optionalSingletonPresent: createExtensionInput( + { + test: testDataRef, + other: otherDataRef.optional(), + }, + { singleton: true, optional: true }, + ), + optionalSingletonMissing: createExtensionInput( + { + test: testDataRef, + other: otherDataRef.optional(), + }, + { singleton: true, optional: true }, + ), + singleton: createExtensionInput( + { + test: testDataRef, + other: otherDataRef.optional(), + }, + { singleton: true }, + ), + many: createExtensionInput({ + test: testDataRef, + other: otherDataRef.optional(), + }), + }, + output: { + inputMirror: inputMirrorDataRef, + }, + factory({ bind, inputs }) { + bind({ inputMirror: inputs }); + }, + }), + }); + + expect(instance.id).toBe('core.test'); + expect(instance.attachments).toBe(attachments); + expect(instance.getData(inputMirrorDataRef)).toEqual({ + optionalSingletonPresent: { test: 'optionalSingletonPresent' }, + singleton: { test: 'singleton', other: 2 }, + many: [{ test: 'many1' }, { test: 'many2', other: 3 }], + }); + }); + + it('should refuse to create an extension with invalid config', () => { + expect(() => + createExtensionInstance({ + attachments: new Map(), + config: { other: 'not-a-number' }, + extension: simpleExtension, + }), + ).toThrow( + "Invalid configuration for extension 'core.test'; caused by Error: Expected number, received string at 'other'", + ); + }); + + it('should forward extension factory errors', () => { + expect(() => + createExtensionInstance({ + attachments: new Map(), + config: { other: 'not-a-number' }, + extension: createExtension({ + id: 'core.test', + at: 'ignored', + output: {}, + factory() { + const error = new Error('NOPE'); + error.name = 'NopeError'; + throw error; + }, + }), + }), + ).toThrow( + "Failed to instantiate extension 'core.test'; caused by NopeError: NOPE", + ); + }); + + it('should refuse to create an instance with duplicate output', () => { + const attachments = new Map(); + expect(() => + createExtensionInstance({ + attachments, + config: undefined, + extension: createExtension({ + id: 'core.test', + at: 'ignored', + output: { + test1: testDataRef, + test2: testDataRef, + }, + factory({ bind }) { + bind({ test1: 'test', test2: 'test2' }); + }, + }), + }), + ).toThrow( + "Failed to instantiate extension 'core.test', duplicate extension data 'test' received via output 'test2'", + ); + }); + + it('should refuse to create an instance with disconnected output data', () => { + const attachments = new Map(); + expect(() => + createExtensionInstance({ + attachments, + config: undefined, + extension: createExtension({ + id: 'core.test', + at: 'ignored', + output: { + test: testDataRef, + }, + factory({ bind }) { + bind({ nonexistent: 'test' } as any); + }, + }), + }), + ).toThrow( + "Failed to instantiate extension 'core.test', unknown output provided via 'nonexistent'", + ); + }); + + it('should refuse to create an instance with missing required input', () => { + expect(() => + createExtensionInstance({ + attachments: new Map(), + config: undefined, + extension: createExtension({ + id: 'core.test', + at: 'ignored', + inputs: { + singleton: createExtensionInput( + { + test: testDataRef, + }, + { singleton: true }, + ), + }, + output: {}, + factory() {}, + }), + }), + ).toThrow( + "Failed to instantiate extension 'core.test', input 'singleton' is required but was not received", + ); + }); + + it('should refuse to create an instance with multiple inputs for required singleton', () => { + expect(() => + createExtensionInstance({ + attachments: new Map([ + [ + 'singleton', + [ + createExtensionInstance({ + attachments: new Map(), + config: { output: 'many1' }, + extension: simpleExtension, + }), + createExtensionInstance({ + attachments: new Map(), + config: { output: 'many2' }, + extension: simpleExtension, + }), + ], + ], + ]), + config: undefined, + extension: createExtension({ + id: 'core.test', + at: 'ignored', + inputs: { + singleton: createExtensionInput( + { + test: testDataRef, + }, + { singleton: true }, + ), + }, + output: {}, + factory() {}, + }), + }), + ).toThrow( + "Failed to instantiate extension 'core.test', expected exactly one 'singleton' input but received multiple: 'core.test', 'core.test'", + ); + }); + + it('should refuse to create an instance with multiple inputs for optional singleton', () => { + expect(() => + createExtensionInstance({ + attachments: new Map([ + [ + 'singleton', + [ + createExtensionInstance({ + attachments: new Map(), + config: { output: 'many1' }, + extension: simpleExtension, + }), + createExtensionInstance({ + attachments: new Map(), + config: { output: 'many2' }, + extension: simpleExtension, + }), + ], + ], + ]), + config: undefined, + extension: createExtension({ + id: 'core.test', + at: 'ignored', + inputs: { + singleton: createExtensionInput( + { + test: testDataRef, + }, + { singleton: true, optional: true }, + ), + }, + output: {}, + factory() {}, + }), + }), + ).toThrow( + "Failed to instantiate extension 'core.test', expected at most one 'singleton' input but received multiple: 'core.test', 'core.test'", + ); + }); + + it('should refuse to create an instance with multiple inputs that did not provide required data', () => { + expect(() => + createExtensionInstance({ + attachments: new Map([ + [ + 'singleton', + [ + createExtensionInstance({ + attachments: new Map(), + config: undefined, + extension: simpleExtension, + }), + ], + ], + ]), + config: undefined, + extension: createExtension({ + id: 'core.test', + at: 'ignored', + inputs: { + singleton: createExtensionInput( + { + other: otherDataRef, + }, + { singleton: true }, + ), + }, + output: {}, + factory() {}, + }), + }), + ).toThrow( + "Failed to instantiate extension 'core.test', input 'singleton' did not receive required extension data 'other' from extension 'core.test'", + ); + }); +}); diff --git a/packages/frontend-app-api/src/wiring/createExtensionInstance.ts b/packages/frontend-app-api/src/wiring/createExtensionInstance.ts index 52afe95121..afa3cbfefc 100644 --- a/packages/frontend-app-api/src/wiring/createExtensionInstance.ts +++ b/packages/frontend-app-api/src/wiring/createExtensionInstance.ts @@ -15,6 +15,8 @@ */ import { + AnyExtensionDataMap, + AnyExtensionInputMap, BackstagePlugin, Extension, ExtensionDataRef, @@ -36,6 +38,56 @@ export interface ExtensionInstance { readonly attachments: Map<string, ExtensionInstance[]>; } +function resolveInputData( + dataMap: AnyExtensionDataMap, + attachment: ExtensionInstance, + inputName: string, +) { + return mapValues(dataMap, ref => { + const value = attachment.getData(ref); + if (value === undefined && !ref.config.optional) { + throw new Error( + `input '${inputName}' did not receive required extension data '${ref.id}' from extension '${attachment.id}'`, + ); + } + return value; + }); +} + +function resolveInputs( + inputMap: AnyExtensionInputMap, + attachments: Map<string, ExtensionInstance[]>, +) { + return mapValues(inputMap, (input, inputName) => { + const attachedInstances = attachments.get(inputName) ?? []; + if (input.config.singleton) { + if (attachedInstances.length > 1) { + throw Error( + `expected ${ + input.config.optional ? 'at most' : 'exactly' + } one '${inputName}' input but received multiple: '${attachedInstances + .map(e => e.id) + .join("', '")}'`, + ); + } else if (attachedInstances.length === 0) { + if (input.config.optional) { + return undefined; + } + throw Error(`input '${inputName}' is required but was not received`); + } + return resolveInputData( + input.extensionData, + attachedInstances[0], + inputName, + ); + } + + return attachedInstances.map(attachment => + resolveInputData(input.extensionData, attachment, inputName), + ); + }); +} + /** @internal */ export function createExtensionInstance(options: { extension: Extension<unknown>; @@ -51,7 +103,7 @@ export function createExtensionInstance(options: { parsedConfig = extension.configSchema?.parse(config ?? {}); } catch (e) { throw new Error( - `Invalid configuration for extension instance '${extension.id}', ${e}`, + `Invalid configuration for extension '${extension.id}'; caused by ${e}`, ); } @@ -63,26 +115,23 @@ export function createExtensionInstance(options: { for (const [name, output] of Object.entries(namedOutputs)) { const ref = extension.output[name]; if (!ref) { + throw new Error(`unknown output provided via '${name}'`); + } + if (extensionData.has(ref.id)) { throw new Error( - `Extension instance '${extension.id}' tried to bind unknown output '${name}'`, + `duplicate extension data '${ref.id}' received via output '${name}'`, ); } extensionData.set(ref.id, output); } }, - inputs: mapValues( - extension.inputs, - ({ extensionData: pointData }, inputName) => { - // TODO: validation - return (attachments.get(inputName) ?? []).map(attachment => - mapValues(pointData, ref => attachment.getData(ref)), - ); - }, - ), + inputs: resolveInputs(extension.inputs, attachments), }); } catch (e) { throw new Error( - `Failed to instantiate extension instance '${extension.id}', ${e}`, + `Failed to instantiate extension '${extension.id}'${ + e.name === 'Error' ? `, ${e.message}` : `; caused by ${e}` + }`, ); } diff --git a/packages/frontend-app-api/src/wiring/parameters.ts b/packages/frontend-app-api/src/wiring/parameters.ts index 1b2831aaca..efe0fbf678 100644 --- a/packages/frontend-app-api/src/wiring/parameters.ts +++ b/packages/frontend-app-api/src/wiring/parameters.ts @@ -196,18 +196,32 @@ export function mergeExtensionParameters(options: { }): ExtensionInstanceParameters[] { const { sources, builtinExtensions, parameters } = options; + const pluginExtensions = sources.flatMap(source => { + return source.extensions.map(extension => ({ ...extension, source })); + }); + + // Prevent root override + if (pluginExtensions.some(({ id }) => id === 'root')) { + const rootPluginIds = pluginExtensions + .filter(({ id }) => id === 'root') + .map(({ source }) => source.id); + throw new Error( + `The following plugin(s) are overriding the 'root' extension which is forbidden: ${rootPluginIds.join( + ',', + )}`, + ); + } + const overrides = [ - ...sources.flatMap(plugin => - plugin.extensions.map(extension => ({ - extension, - params: { - source: plugin, - at: extension.at, - disabled: extension.disabled, - config: undefined as unknown, - }, - })), - ), + ...pluginExtensions.map(({ source, ...extension }) => ({ + extension, + params: { + source, + at: extension.at, + disabled: extension.disabled, + config: undefined as unknown, + }, + })), ...builtinExtensions.map(extension => ({ extension, params: { @@ -219,9 +233,53 @@ export function mergeExtensionParameters(options: { })), ]; + const duplicatedExtensionIds = new Set<string>(); + const duplicatedExtensionData = overrides.reduce< + Record<string, Record<string, number>> + >((data, { extension, params }) => { + const extensionId = extension.id; + const extensionData = data?.[extensionId]; + if (extensionData) duplicatedExtensionIds.add(extensionId); + const pluginId = params.source?.id ?? 'internal'; + const pluginCount = extensionData?.[pluginId] ?? 0; + return { + ...data, + [extensionId]: { ...extensionData, [pluginId]: pluginCount + 1 }, + }; + }, {}); + + if (duplicatedExtensionIds.size > 0) { + throw new Error( + `The following extensions are duplicated: ${Array.from( + duplicatedExtensionIds, + ) + .map( + extensionId => + `The extension '${extensionId}' was provided ${Object.keys( + duplicatedExtensionData[extensionId], + ) + .map( + pluginId => + `${duplicatedExtensionData[extensionId][pluginId]} time(s) by the plugin '${pluginId}'`, + ) + .join(' and ')}`, + ) + .join(', ')}`, + ); + } + for (const overrideParam of parameters) { + const extensionId = overrideParam.id; + + // Prevent root parametrization + if (extensionId === 'root') { + throw new Error( + "A 'root' extension configuration was detected, but the root extension is not configurable", + ); + } + const existingIndex = overrides.findIndex( - e => e.extension.id === overrideParam.id, + e => e.extension.id === extensionId, ); if (existingIndex !== -1) { const existing = overrides[existingIndex]; @@ -243,7 +301,7 @@ export function mergeExtensionParameters(options: { } } } else { - throw new Error(`Extension ${overrideParam.id} does not exist`); + throw new Error(`Extension ${extensionId} does not exist`); } } diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index 25b4f98648..22620aebe2 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/frontend-plugin-api +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/types@1.1.1 + +## 0.1.0 + +### Minor Changes + +- 628ca7e458e4: Initial release + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + ## 0.1.0-next.0 ### Minor Changes diff --git a/packages/frontend-plugin-api/api-report.md b/packages/frontend-plugin-api/api-report.md index 88a0dc1793..e28d7d5993 100644 --- a/packages/frontend-plugin-api/api-report.md +++ b/packages/frontend-plugin-api/api-report.md @@ -7,6 +7,7 @@ import { AnyApiFactory } from '@backstage/core-plugin-api'; import { AnyApiRef } from '@backstage/core-plugin-api'; +import { AppTheme } from '@backstage/core-plugin-api'; import { IconComponent } from '@backstage/core-plugin-api'; import { JsonObject } from '@backstage/types'; import { JSX as JSX_2 } from 'react'; @@ -19,7 +20,23 @@ import { ZodTypeDef } from 'zod'; // @public (undocumented) export type AnyExtensionDataMap = { - [name in string]: ExtensionDataRef<any, any>; + [name in string]: ExtensionDataRef< + unknown, + { + optional?: true; + } + >; +}; + +// @public (undocumented) +export type AnyExtensionInputMap = { + [inputName in string]: ExtensionInput< + AnyExtensionDataMap, + { + optional: boolean; + singleton: boolean; + } + >; }; // @public (undocumented) @@ -55,24 +72,20 @@ export const coreExtensionData: { apiFactory: ConfigurableExtensionDataRef<AnyApiFactory, {}>; routeRef: ConfigurableExtensionDataRef<RouteRef, {}>; navTarget: ConfigurableExtensionDataRef<NavTarget, {}>; + theme: ConfigurableExtensionDataRef<AppTheme, {}>; }; // @public (undocumented) export function createApiExtension< TConfig extends {}, - TInputs extends Record< - string, - { - extensionData: AnyExtensionDataMap; - } - >, + TInputs extends AnyExtensionInputMap, >( options: ( | { api: AnyApiRef; factory: (options: { config: TConfig; - inputs: ExtensionDataInputValues<TInputs>; + inputs: Expand<ExtensionInputValues<TInputs>>; }) => AnyApiFactory; } | { @@ -87,12 +100,7 @@ export function createApiExtension< // @public (undocumented) export function createExtension< TOutput extends AnyExtensionDataMap, - TInputs extends Record< - string, - { - extensionData: AnyExtensionDataMap; - } - >, + TInputs extends AnyExtensionInputMap, TConfig = never, >( options: CreateExtensionOptions<TOutput, TInputs, TConfig>, @@ -103,15 +111,28 @@ export function createExtensionDataRef<TData>( id: string, ): ConfigurableExtensionDataRef<TData>; +// @public (undocumented) +export function createExtensionInput< + TExtensionData extends AnyExtensionDataMap, + TConfig extends { + singleton?: boolean; + optional?: boolean; + }, +>( + extensionData: TExtensionData, + config?: TConfig, +): ExtensionInput< + TExtensionData, + { + singleton: TConfig['singleton'] extends true ? true : false; + optional: TConfig['optional'] extends true ? true : false; + } +>; + // @public (undocumented) export interface CreateExtensionOptions< TOutput extends AnyExtensionDataMap, - TInputs extends Record< - string, - { - extensionData: AnyExtensionDataMap; - } - >, + TInputs extends AnyExtensionInputMap, TConfig, > { // (undocumented) @@ -123,9 +144,9 @@ export interface CreateExtensionOptions< // (undocumented) factory(options: { source?: BackstagePlugin; - bind: ExtensionDataBind<TOutput>; + bind(values: Expand<ExtensionDataValues<TOutput>>): void; config: TConfig; - inputs: ExtensionDataInputValues<TInputs>; + inputs: Expand<ExtensionInputValues<TInputs>>; }): void; // (undocumented) id: string; @@ -150,12 +171,7 @@ export function createPageExtension< TConfig extends { path: string; }, - TInputs extends Record< - string, - { - extensionData: AnyExtensionDataMap; - } - >, + TInputs extends AnyExtensionInputMap, >( options: ( | { @@ -172,7 +188,7 @@ export function createPageExtension< routeRef?: RouteRef; loader: (options: { config: TConfig; - inputs: ExtensionDataInputValues<TInputs>; + inputs: Expand<ExtensionInputValues<TInputs>>; }) => Promise<JSX.Element>; }, ): Extension<TConfig>; @@ -185,6 +201,9 @@ export function createSchemaFromZod<TOutput, TInput>( schemaCreator: (zImpl: typeof z) => ZodSchema<TOutput, ZodTypeDef, TInput>, ): PortableSchema<TOutput>; +// @public (undocumented) +export function createThemeExtension(theme: AppTheme): Extension<never>; + // @public (undocumented) export interface Extension<TConfig> { // (undocumented) @@ -198,19 +217,17 @@ export interface Extension<TConfig> { // (undocumented) factory(options: { source?: BackstagePlugin; - bind: ExtensionDataBind<AnyExtensionDataMap>; + bind(values: ExtensionInputValues<any>): void; config: TConfig; - inputs: Record<string, Array<Record<string, unknown>>>; + inputs: Record< + string, + undefined | Record<string, unknown> | Array<Record<string, unknown>> + >; }): void; // (undocumented) id: string; // (undocumented) - inputs: Record< - string, - { - extensionData: AnyExtensionDataMap; - } - >; + inputs: AnyExtensionInputMap; // (undocumented) output: AnyExtensionDataMap; } @@ -228,48 +245,6 @@ export interface ExtensionBoundaryProps { source?: BackstagePlugin; } -// @public (undocumented) -export type ExtensionDataBind<TMap extends AnyExtensionDataMap> = ( - values: { - [DataName in keyof TMap as TMap[DataName]['config'] extends { - optional: true; - } - ? never - : DataName]: TMap[DataName]['T']; - } & { - [DataName in keyof TMap as TMap[DataName]['config'] extends { - optional: true; - } - ? DataName - : never]?: TMap[DataName]['T']; - }, -) => void; - -// @public (undocumented) -export type ExtensionDataInputValues< - TInputs extends { - [name in string]: { - extensionData: AnyExtensionDataMap; - }; - }, -> = { - [InputName in keyof TInputs]: Array< - { - [DataName in keyof TInputs[InputName]['extensionData'] as TInputs[InputName]['extensionData'][DataName]['config'] extends { - optional: true; - } - ? never - : DataName]: TInputs[InputName]['extensionData'][DataName]['T']; - } & { - [DataName in keyof TInputs[InputName]['extensionData'] as TInputs[InputName]['extensionData'][DataName]['config'] extends { - optional: true; - } - ? DataName - : never]?: TInputs[InputName]['extensionData'][DataName]['T']; - } - >; -}; - // @public (undocumented) export type ExtensionDataRef< TData, @@ -283,6 +258,52 @@ export type ExtensionDataRef< $$type: '@backstage/ExtensionDataRef'; }; +// @public +export type ExtensionDataValues<TExtensionData extends AnyExtensionDataMap> = { + [DataName in keyof TExtensionData as TExtensionData[DataName]['config'] extends { + optional: true; + } + ? never + : DataName]: TExtensionData[DataName]['T']; +} & { + [DataName in keyof TExtensionData as TExtensionData[DataName]['config'] extends { + optional: true; + } + ? DataName + : never]?: TExtensionData[DataName]['T']; +}; + +// @public (undocumented) +export interface ExtensionInput< + TExtensionData extends AnyExtensionDataMap, + TConfig extends { + singleton: boolean; + optional: boolean; + }, +> { + // (undocumented) + $$type: '@backstage/ExtensionInput'; + // (undocumented) + config: TConfig; + // (undocumented) + extensionData: TExtensionData; +} + +// @public +export type ExtensionInputValues< + TInputs extends { + [name in string]: ExtensionInput<any, any>; + }, +> = { + [InputName in keyof TInputs]: false extends TInputs[InputName]['config']['singleton'] + ? Array<Expand<ExtensionDataValues<TInputs[InputName]['extensionData']>>> + : false extends TInputs[InputName]['config']['optional'] + ? Expand<ExtensionDataValues<TInputs[InputName]['extensionData']>> + : Expand< + ExtensionDataValues<TInputs[InputName]['extensionData']> | undefined + >; +}; + // @public (undocumented) export type NavTarget = { title: string; diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index adc0907ab6..8e71544393 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.1.0-next.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/frontend-plugin-api/src/extensions/createApiExtension.ts b/packages/frontend-plugin-api/src/extensions/createApiExtension.ts index f81f07ca72..a142a5af61 100644 --- a/packages/frontend-plugin-api/src/extensions/createApiExtension.ts +++ b/packages/frontend-plugin-api/src/extensions/createApiExtension.ts @@ -17,23 +17,23 @@ import { AnyApiFactory, AnyApiRef } from '@backstage/core-plugin-api'; import { PortableSchema } from '../schema'; import { - AnyExtensionDataMap, - ExtensionDataInputValues, + ExtensionInputValues, createExtension, coreExtensionData, } from '../wiring'; +import { AnyExtensionInputMap, Expand } from '../wiring/createExtension'; /** @public */ export function createApiExtension< TConfig extends {}, - TInputs extends Record<string, { extensionData: AnyExtensionDataMap }>, + TInputs extends AnyExtensionInputMap, >( options: ( | { api: AnyApiRef; factory: (options: { config: TConfig; - inputs: ExtensionDataInputValues<TInputs>; + inputs: Expand<ExtensionInputValues<TInputs>>; }) => AnyApiFactory; } | { diff --git a/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx b/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx index 8bca1153bf..7de6ee3253 100644 --- a/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx +++ b/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx @@ -16,7 +16,7 @@ import React from 'react'; import { PortableSchema } from '../schema'; -import { coreExtensionData } from '../wiring'; +import { coreExtensionData, createExtensionInput } from '../wiring'; import { createPageExtension } from './createPageExtension'; describe('createPageExtension', () => { @@ -54,9 +54,9 @@ describe('createPageExtension', () => { disabled: true, configSchema, inputs: { - first: { - extensionData: { element: coreExtensionData.reactElement }, - }, + first: createExtensionInput({ + element: coreExtensionData.reactElement, + }), }, loader: async () => <div />, }), @@ -67,9 +67,9 @@ describe('createPageExtension', () => { configSchema: expect.anything(), disabled: true, inputs: { - first: { - extensionData: { element: coreExtensionData.reactElement }, - }, + first: createExtensionInput({ + element: coreExtensionData.reactElement, + }), }, output: { element: expect.anything(), diff --git a/packages/frontend-plugin-api/src/extensions/createPageExtension.tsx b/packages/frontend-plugin-api/src/extensions/createPageExtension.tsx index 4c5ff2d8be..5460fb518d 100644 --- a/packages/frontend-plugin-api/src/extensions/createPageExtension.tsx +++ b/packages/frontend-plugin-api/src/extensions/createPageExtension.tsx @@ -19,12 +19,12 @@ import React from 'react'; import { ExtensionBoundary } from '../components'; import { createSchemaFromZod, PortableSchema } from '../schema'; import { - AnyExtensionDataMap, coreExtensionData, createExtension, Extension, - ExtensionDataInputValues, + ExtensionInputValues, } from '../wiring'; +import { AnyExtensionInputMap, Expand } from '../wiring/createExtension'; /** * Helper for creating extensions for a routable React page component. @@ -33,7 +33,7 @@ import { */ export function createPageExtension< TConfig extends { path: string }, - TInputs extends Record<string, { extensionData: AnyExtensionDataMap }>, + TInputs extends AnyExtensionInputMap, >( options: ( | { @@ -50,7 +50,7 @@ export function createPageExtension< routeRef?: RouteRef; loader: (options: { config: TConfig; - inputs: ExtensionDataInputValues<TInputs>; + inputs: Expand<ExtensionInputValues<TInputs>>; }) => Promise<JSX.Element>; }, ): Extension<TConfig> { diff --git a/cypress/src/integration/user/login.spec.ts b/packages/frontend-plugin-api/src/extensions/createThemeExtension.ts similarity index 57% rename from cypress/src/integration/user/login.spec.ts rename to packages/frontend-plugin-api/src/extensions/createThemeExtension.ts index 8e84ebbf06..5c13dd199e 100644 --- a/cypress/src/integration/user/login.spec.ts +++ b/packages/frontend-plugin-api/src/extensions/createThemeExtension.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2023 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,19 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/// <reference types="cypress" /> -import 'os'; -describe('Login', () => { - it('should render the login page', () => { - cy.visit('/'); - cy.contains('Select a sign-in method'); +import { createExtension, coreExtensionData } from '../wiring'; +import { AppTheme } from '@backstage/core-plugin-api'; + +/** @public */ +export function createThemeExtension(theme: AppTheme) { + return createExtension({ + id: `themes.${theme.id}`, + at: 'core/themes', + output: { + theme: coreExtensionData.theme, + }, + factory({ bind }) { + bind({ theme }); + }, }); - - it('should be able to login', () => { - cy.get('button').contains('Enter').click(); - cy.url().should('include', '/catalog'); - - cy.contains('artist-lookup'); - }); -}); +} diff --git a/packages/frontend-plugin-api/src/extensions/index.ts b/packages/frontend-plugin-api/src/extensions/index.ts index 0ec0cdf652..00cf4f919c 100644 --- a/packages/frontend-plugin-api/src/extensions/index.ts +++ b/packages/frontend-plugin-api/src/extensions/index.ts @@ -17,3 +17,4 @@ export { createApiExtension } from './createApiExtension'; export { createPageExtension } from './createPageExtension'; export { createNavItemExtension } from './createNavItemExtension'; +export { createThemeExtension } from './createThemeExtension'; diff --git a/packages/frontend-plugin-api/src/wiring/coreExtensionData.ts b/packages/frontend-plugin-api/src/wiring/coreExtensionData.ts index 079d5bcb18..6913501907 100644 --- a/packages/frontend-plugin-api/src/wiring/coreExtensionData.ts +++ b/packages/frontend-plugin-api/src/wiring/coreExtensionData.ts @@ -17,6 +17,7 @@ import { JSX } from 'react'; import { AnyApiFactory, + AppTheme, IconComponent, RouteRef, } from '@backstage/core-plugin-api'; @@ -36,4 +37,5 @@ export const coreExtensionData = { apiFactory: createExtensionDataRef<AnyApiFactory>('core.api.factory'), routeRef: createExtensionDataRef<RouteRef>('core.routing.ref'), navTarget: createExtensionDataRef<NavTarget>('core.nav.target'), + theme: createExtensionDataRef<AppTheme>('core.theme'), }; diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.test.ts b/packages/frontend-plugin-api/src/wiring/createExtension.test.ts index a992642d61..6f4a21399d 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.test.ts @@ -16,6 +16,7 @@ import { createExtension } from './createExtension'; import { createExtensionDataRef } from './createExtensionDataRef'; +import { createExtensionInput } from './createExtensionInput'; const stringData = createExtensionDataRef<string>('string'); @@ -95,22 +96,16 @@ describe('createExtension', () => { id: 'test', at: 'root', inputs: { - mixed: { - extensionData: { - required: stringData, - optional: stringData.optional(), - }, - }, - onlyRequired: { - extensionData: { - required: stringData, - }, - }, - onlyOptional: { - extensionData: { - optional: stringData.optional(), - }, - }, + mixed: createExtensionInput({ + required: stringData, + optional: stringData.optional(), + }), + onlyRequired: createExtensionInput({ + required: stringData, + }), + onlyOptional: createExtensionInput({ + optional: stringData.optional(), + }), }, output: { foo: stringData, diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index 1a7e02804e..dd365a87d8 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -15,51 +15,68 @@ */ import { PortableSchema } from '../schema'; +import { ExtensionDataRef } from './createExtensionDataRef'; +import { ExtensionInput } from './createExtensionInput'; import { BackstagePlugin } from './createPlugin'; -import { AnyExtensionDataMap, Extension } from './types'; /** @public */ -export type ExtensionDataInputValues< - TInputs extends { [name in string]: { extensionData: AnyExtensionDataMap } }, -> = { - [InputName in keyof TInputs]: Array< - { - [DataName in keyof TInputs[InputName]['extensionData'] as TInputs[InputName]['extensionData'][DataName]['config'] extends { - optional: true; - } - ? never - : DataName]: TInputs[InputName]['extensionData'][DataName]['T']; - } & { - [DataName in keyof TInputs[InputName]['extensionData'] as TInputs[InputName]['extensionData'][DataName]['config'] extends { - optional: true; - } - ? DataName - : never]?: TInputs[InputName]['extensionData'][DataName]['T']; - } - >; +export type AnyExtensionDataMap = { + [name in string]: ExtensionDataRef<unknown, { optional?: true }>; }; /** @public */ -export type ExtensionDataBind<TMap extends AnyExtensionDataMap> = ( - values: { - [DataName in keyof TMap as TMap[DataName]['config'] extends { - optional: true; - } - ? never - : DataName]: TMap[DataName]['T']; - } & { - [DataName in keyof TMap as TMap[DataName]['config'] extends { - optional: true; - } - ? DataName - : never]?: TMap[DataName]['T']; - }, -) => void; +export type AnyExtensionInputMap = { + [inputName in string]: ExtensionInput< + AnyExtensionDataMap, + { optional: boolean; singleton: boolean } + >; +}; + +// TODO(Rugvip): This might be a quite useful utility type, maybe add to @backstage/types? +/** + * Utility type to expand type aliases into their equivalent type. + * @ignore + */ +export type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never; + +/** + * Converts an extension data map into the matching concrete data values type. + * @public + */ +export type ExtensionDataValues<TExtensionData extends AnyExtensionDataMap> = { + [DataName in keyof TExtensionData as TExtensionData[DataName]['config'] extends { + optional: true; + } + ? never + : DataName]: TExtensionData[DataName]['T']; +} & { + [DataName in keyof TExtensionData as TExtensionData[DataName]['config'] extends { + optional: true; + } + ? DataName + : never]?: TExtensionData[DataName]['T']; +}; + +/** + * Converts an extension input map into the matching concrete input values type. + * @public + */ +export type ExtensionInputValues< + TInputs extends { [name in string]: ExtensionInput<any, any> }, +> = { + [InputName in keyof TInputs]: false extends TInputs[InputName]['config']['singleton'] + ? Array<Expand<ExtensionDataValues<TInputs[InputName]['extensionData']>>> + : false extends TInputs[InputName]['config']['optional'] + ? Expand<ExtensionDataValues<TInputs[InputName]['extensionData']>> + : Expand< + ExtensionDataValues<TInputs[InputName]['extensionData']> | undefined + >; +}; /** @public */ export interface CreateExtensionOptions< TOutput extends AnyExtensionDataMap, - TInputs extends Record<string, { extensionData: AnyExtensionDataMap }>, + TInputs extends AnyExtensionInputMap, TConfig, > { id: string; @@ -70,16 +87,36 @@ export interface CreateExtensionOptions< configSchema?: PortableSchema<TConfig>; factory(options: { source?: BackstagePlugin; - bind: ExtensionDataBind<TOutput>; + bind(values: Expand<ExtensionDataValues<TOutput>>): void; config: TConfig; - inputs: ExtensionDataInputValues<TInputs>; + inputs: Expand<ExtensionInputValues<TInputs>>; + }): void; +} + +/** @public */ +export interface Extension<TConfig> { + $$type: '@backstage/Extension'; + id: string; + at: string; + disabled: boolean; + inputs: AnyExtensionInputMap; + output: AnyExtensionDataMap; + configSchema?: PortableSchema<TConfig>; + factory(options: { + source?: BackstagePlugin; + bind(values: ExtensionInputValues<any>): void; + config: TConfig; + inputs: Record< + string, + undefined | Record<string, unknown> | Array<Record<string, unknown>> + >; }): void; } /** @public */ export function createExtension< TOutput extends AnyExtensionDataMap, - TInputs extends Record<string, { extensionData: AnyExtensionDataMap }>, + TInputs extends AnyExtensionInputMap, TConfig = never, >( options: CreateExtensionOptions<TOutput, TInputs, TConfig>, @@ -94,7 +131,7 @@ export function createExtension< return options.factory({ bind, config, - inputs: inputs as ExtensionDataInputValues<TInputs>, + inputs: inputs as Expand<ExtensionInputValues<TInputs>>, }); }, }; diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts b/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts new file mode 100644 index 0000000000..1fd8fea972 --- /dev/null +++ b/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts @@ -0,0 +1,55 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AnyExtensionDataMap } from './createExtension'; + +/** @public */ +export interface ExtensionInput< + TExtensionData extends AnyExtensionDataMap, + TConfig extends { singleton: boolean; optional: boolean }, +> { + $$type: '@backstage/ExtensionInput'; + extensionData: TExtensionData; + config: TConfig; +} + +/** @public */ +export function createExtensionInput< + TExtensionData extends AnyExtensionDataMap, + TConfig extends { singleton?: boolean; optional?: boolean }, +>( + extensionData: TExtensionData, + config?: TConfig, +): ExtensionInput< + TExtensionData, + { + singleton: TConfig['singleton'] extends true ? true : false; + optional: TConfig['optional'] extends true ? true : false; + } +> { + return { + $$type: '@backstage/ExtensionInput', + extensionData, + config: { + singleton: Boolean(config?.singleton) as TConfig['singleton'] extends true + ? true + : false, + optional: Boolean(config?.optional) as TConfig['optional'] extends true + ? true + : false, + }, + }; +} diff --git a/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts b/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts index 08d07f2226..b14838c17a 100644 --- a/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts @@ -16,14 +16,15 @@ import React from 'react'; import { createApp } from '@backstage/frontend-app-api'; -import { render, screen } from '@testing-library/react'; +import { screen } from '@testing-library/react'; import { createSchemaFromZod } from '../schema/createSchemaFromZod'; import { createPlugin, BackstagePlugin } from './createPlugin'; import { JsonObject } from '@backstage/types'; import { createExtension } from './createExtension'; import { createExtensionDataRef } from './createExtensionDataRef'; import { coreExtensionData } from './coreExtensionData'; -import { MockConfigApi } from '@backstage/test-utils'; +import { MockConfigApi, renderWithEffects } from '@backstage/test-utils'; +import { createExtensionInput } from './createExtensionInput'; const nameExtensionDataRef = createExtensionDataRef<string>('name'); @@ -70,11 +71,9 @@ const TechDocsPage = createExtension({ id: 'plugin.techdocs.page', at: 'test.output/names', inputs: { - addons: { - extensionData: { - name: nameExtensionDataRef, - }, - }, + addons: createExtensionInput({ + name: nameExtensionDataRef, + }), }, output: { name: nameExtensionDataRef, @@ -88,11 +87,9 @@ const outputExtension = createExtension({ id: 'test.output', at: 'root', inputs: { - names: { - extensionData: { - name: nameExtensionDataRef, - }, - }, + names: createExtensionInput({ + name: nameExtensionDataRef, + }), }, output: { element: coreExtensionData.reactElement, @@ -115,7 +112,7 @@ function createTestAppRoot({ }) { return createApp({ plugins: plugins, - config: new MockConfigApi(config), + configLoader: async () => new MockConfigApi(config), }).createRoot(); } @@ -126,24 +123,26 @@ describe('createPlugin', () => { expect(plugin).toBeDefined(); }); - it('should create a plugin with extension instances', () => { + it('should create a plugin with extension instances', async () => { const plugin = createPlugin({ id: 'empty', extensions: [TechRadarPage, CatalogPage, outputExtension], }); expect(plugin).toBeDefined(); - render( + await renderWithEffects( createTestAppRoot({ plugins: [plugin], config: { app: { extensions: [{ 'core.layout': false }] } }, }), ); - expect(screen.getByText('Names: TechRadar, Catalog')).toBeInTheDocument(); + await expect( + screen.findByText('Names: TechRadar, Catalog'), + ).resolves.toBeInTheDocument(); }); - it('should create a plugin with nested extension instances', () => { + it('should create a plugin with nested extension instances', async () => { const plugin = createPlugin({ id: 'empty', extensions: [ @@ -156,7 +155,7 @@ describe('createPlugin', () => { }); expect(plugin).toBeDefined(); - render( + await renderWithEffects( createTestAppRoot({ plugins: [plugin], config: { @@ -174,10 +173,10 @@ describe('createPlugin', () => { }), ); - expect( - screen.getByText( + await expect( + screen.findByText( 'Names: TechRadar, CatalogRenamed, TechDocs-TechDocsAddon', ), - ).toBeInTheDocument(); + ).resolves.toBeInTheDocument(); }); }); diff --git a/packages/frontend-plugin-api/src/wiring/createPlugin.ts b/packages/frontend-plugin-api/src/wiring/createPlugin.ts index bb372f63c1..bd8e9954ef 100644 --- a/packages/frontend-plugin-api/src/wiring/createPlugin.ts +++ b/packages/frontend-plugin-api/src/wiring/createPlugin.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Extension } from './types'; +import { Extension } from './createExtension'; /** @public */ export interface PluginOptions { diff --git a/packages/frontend-plugin-api/src/wiring/index.ts b/packages/frontend-plugin-api/src/wiring/index.ts index 4177ffbfcc..b7f0acefd9 100644 --- a/packages/frontend-plugin-api/src/wiring/index.ts +++ b/packages/frontend-plugin-api/src/wiring/index.ts @@ -17,10 +17,17 @@ export { coreExtensionData, type NavTarget } from './coreExtensionData'; export { createExtension, + type Extension, type CreateExtensionOptions, - type ExtensionDataBind, - type ExtensionDataInputValues, + type ExtensionDataValues, + type ExtensionInputValues, + type AnyExtensionInputMap, + type AnyExtensionDataMap, } from './createExtension'; +export { + createExtensionInput, + type ExtensionInput, +} from './createExtensionInput'; export { createExtensionDataRef, type ExtensionDataRef, @@ -31,4 +38,3 @@ export { type BackstagePlugin, type PluginOptions, } from './createPlugin'; -export type { AnyExtensionDataMap, Extension } from './types'; diff --git a/packages/frontend-plugin-api/src/wiring/types.ts b/packages/frontend-plugin-api/src/wiring/types.ts deleted file mode 100644 index 46b76e30f4..0000000000 --- a/packages/frontend-plugin-api/src/wiring/types.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2023 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { PortableSchema } from '../schema'; -import { ExtensionDataBind } from './createExtension'; -import { ExtensionDataRef } from './createExtensionDataRef'; -import { BackstagePlugin } from './createPlugin'; - -/** @public */ -export type AnyExtensionDataMap = { - [name in string]: ExtensionDataRef<any, any>; -}; - -/** @public */ -export interface Extension<TConfig> { - $$type: '@backstage/Extension'; - id: string; - at: string; - disabled: boolean; - inputs: Record<string, { extensionData: AnyExtensionDataMap }>; - output: AnyExtensionDataMap; - configSchema?: PortableSchema<TConfig>; - factory(options: { - source?: BackstagePlugin; - bind: ExtensionDataBind<AnyExtensionDataMap>; - config: TConfig; - inputs: Record<string, Array<Record<string, unknown>>>; - }): void; -} diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index dc02aa5eb6..e62b3ff7fe 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration-aws-node +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + ## 0.1.6-next.2 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index 225d5fa679..cfe691b85c 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-aws-node", "description": "Helpers for fetching AWS account credentials", - "version": "0.1.6-next.2", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 0f6b18f5ab..1f6cd21668 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/integration-react +## 1.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/theme@0.4.2 + +## 1.1.19 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 1.1.19-next.3 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 253a775721..89d7cf48e9 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.19-next.3", + "version": "1.1.20-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index b13e96db9f..961e6eb869 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/integration +## 1.7.1-next.0 + +### Patch Changes + +- 3963d0b885: Ensure that all relevant config fields are properly marked as secret +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## 1.7.0 + +### Minor Changes + +- 5f1a92b9f19f: Added `AzureDevOpsCredentialsProvider` to support multiple Azure DevOps organizations and **deprecated** `AzureIntegrationConfig.credential` and `AzureIntegrationConfig.token` in favour of `AzureIntegrationConfig.credentials`. You can now use specific credentials for different Azure DevOps (Server) organizations by specifying the `organizations` field on a credential: + + ```yaml + integrations: + azure: + - host: dev.azure.com + credentials: + - organizations: + - my-org + - my-other-org + clientId: ${AZURE_CLIENT_ID} + clientSecret: ${AZURE_CLIENT_SECRET} + tenantId: ${AZURE_TENANT_ID} + - organizations: + - yet-another-org + personalAccessToken: ${PERSONAL_ACCESS_TOKEN} + ``` + + See the [Azure integration documentation](https://backstage.io/docs/integrations/azure/locations) for more information. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 2d2fc9d20ebb: Additional fix for Gitiles auth links +- cb2e19d82d95: Gitiles: Fixed auth prefix issue +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + ## 1.7.0-next.3 ### Patch Changes diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index 9c08ec03a9..44303bf25c 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -39,7 +39,7 @@ export interface Config { * * If no credential is specified anonymous access is used. * - * @visibility secret + * @deepVisibility secret * @deprecated Use `credentials` instead. */ credential?: { @@ -54,7 +54,7 @@ export interface Config { * If not organization matches the first credential without an organization is used. * * If no credentials are specified at all, either a default credential (for Azure DevOps) or anonymous access (for Azure DevOps Server) is used. - * @visibility secret + * @deepVisibility secret */ credentials?: { clientId?: string; diff --git a/packages/integration/package.json b/packages/integration/package.json index d522b0f803..ab78c07edf 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration", "description": "Helpers for managing integrations towards external systems", - "version": "1.7.0-next.3", + "version": "1.7.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/release-manifests/CHANGELOG.md b/packages/release-manifests/CHANGELOG.md index df166cf1fc..001c7b2055 100644 --- a/packages/release-manifests/CHANGELOG.md +++ b/packages/release-manifests/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/release-manifests +## 0.0.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency + ## 0.0.10-next.1 ### Patch Changes diff --git a/packages/release-manifests/package.json b/packages/release-manifests/package.json index 4c95e92c27..24003eeaa4 100644 --- a/packages/release-manifests/package.json +++ b/packages/release-manifests/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/release-manifests", "description": "Helper library for receiving release manifests", - "version": "0.0.10-next.1", + "version": "0.0.10", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 076e963437..0864fd7347 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/repo-tools +## 0.3.5-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + +## 0.3.4 + +### Patch Changes + +- 0109d3f11159: The `generate-catalog-info` command now uses the first listed `CODEOWNER` as Component owner when initially + creating the `catalog-info.yaml` file. It continues to allow any one listed `CODEOWNER` when updating + entity metadata. +- 6f874cdb04eb: Fixed a bug with the `generate-catalog-info` command that could cause `metadata.description` values to be overwritten by `package.json` description values only because unrelated attributes were being changed. +- ec13d3e86028: Fixed a bug with the `generate-catalog-info` command that could cause the `--dry-run` flag to indicate changes to files when no changes would actually be made if the command were run without the flag. +- db60a16e0a54: Added a `--ci` flag to the `generate-catalog-info` command. This flag behaves similarly to the same flag on `api-reports`: if `catalog-info.yaml` files would have been added or modified, then the process exits with status code `1`, and instructions are printed. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + ## 0.3.4-next.3 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 3b38ad01b1..8fc04fce71 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/repo-tools", "description": "CLI for Backstage repo tooling ", - "version": "0.3.4-next.3", + "version": "0.3.5-next.0", "publishConfig": { "access": "public" }, @@ -64,8 +64,8 @@ "@backstage/types": "workspace:^", "@types/is-glob": "^4.0.2", "@types/mock-fs": "^4.13.0", - "@types/node": "^16.11.26", - "mock-fs": "^5.1.0" + "@types/node": "^18.17.8", + "mock-fs": "^5.2.0" }, "peerDependencies": { "@microsoft/api-extractor-model": "*", diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index ba99062427..2e07601451 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,43 @@ # techdocs-cli-embedded-app +## 0.2.87-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/test-utils@1.4.4-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.2.86 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.13 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + ## 0.2.86-next.3 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/cypress.json b/packages/techdocs-cli-embedded-app/cypress.json deleted file mode 100644 index 5de7ebffea..0000000000 --- a/packages/techdocs-cli-embedded-app/cypress.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "baseUrl": "http://localhost:3001", - "fixturesFolder": false, - "pluginsFile": false -} diff --git a/packages/techdocs-cli-embedded-app/cypress/.eslintrc.json b/packages/techdocs-cli-embedded-app/cypress/.eslintrc.json deleted file mode 100644 index b903ff250a..0000000000 --- a/packages/techdocs-cli-embedded-app/cypress/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "plugins": ["cypress"], - "extends": ["plugin:cypress/recommended"], - "rules": { - "jest/expect-expect": [ - "error", - { - "assertFunctionNames": ["expect", "cy.contains", "cy.**.should"] - } - ] - } -} diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 6237ac658f..7c5ceaf795 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.86-next.3", + "version": "0.2.87-next.0", "private": true, "backstage": { "role": "frontend" @@ -42,21 +42,14 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "*", "@types/react-dom": "*", - "cross-env": "^7.0.0", - "cypress": "^10.0.0", - "eslint-plugin-cypress": "^2.10.3", - "start-server-and-test": "^1.10.11" + "cross-env": "^7.0.0" }, "scripts": { "start": "backstage-cli package start --config ./app-config.yaml", "build": "backstage-cli package build --config ./app-config.yaml", "clean": "backstage-cli package clean", "test": "backstage-cli package test", - "lint": "backstage-cli package lint", - "test:e2e": "cross-env PORT=3001 start-server-and-test start http://localhost:3001 cy:dev", - "test:e2e:ci": "cross-env PORT=3001 start-server-and-test start http://localhost:3001 cy:run", - "cy:dev": "cypress open", - "cy:run": "cypress run" + "lint": "backstage-cli package lint" }, "prettier": "@spotify/prettier-config", "browserslist": { diff --git a/packages/techdocs-cli-embedded-app/public/index.html b/packages/techdocs-cli-embedded-app/public/index.html index c6083b3dd2..fc758eee32 100644 --- a/packages/techdocs-cli-embedded-app/public/index.html +++ b/packages/techdocs-cli-embedded-app/public/index.html @@ -8,7 +8,6 @@ name="description" content="Backstage is an open platform for building developer portals" /> - <link rel="apple-touch-icon" href="<%= publicPath %>/logo192.png" /> <!-- manifest.json provides metadata used when your web app is installed on a user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 889855e2c1..f24e216273 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,33 @@ # @techdocs/cli +## 1.5.2-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- 2b6e572051: Restructured tests. +- Updated dependencies + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-techdocs-node@1.8.2-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + +## 1.5.0 + +### Minor Changes + +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-techdocs-node@1.8.0 + - @backstage/cli-common@0.1.12 + ## 1.5.0-next.3 ### Patch Changes diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md index 85c0075946..e7ae51053b 100644 --- a/packages/techdocs-cli/README.md +++ b/packages/techdocs-cli/README.md @@ -75,38 +75,3 @@ pip install mkdocs-techdocs-core ``` Then run `yarn test`. - -#### Cypress (Integration and Visual regression) tests - -Running cypress tests requires you to run the CLI locally against our example docs. - -Run the local version of techdocs-cli against the example docs: - -```sh -# From the root of this repository run -# NOTE: This will build the techdocs-cli-embedded-app and copy the output into the cli dist directory -yarn build --scope @techdocs/cli - -# Navigate to the example project -cd packages/techdocs-cli/src/example-docs - -# Now execute the techdocs-cli serve command -../../bin/techdocs-cli serve -``` - -In another shell, run the cypress tests: - -```sh -# From the root of the project, navigate to the techdocs-cli package -cd packages/techdocs-cli - -# Run tests -yarn test:cypress -``` - -This will launch a cypress app where you can run the two different tests: - -- `backstage_serve` - will run against the backstage server -- `mkdocs_serve` - will run test against the mkdocs server - -> If its the first time you run Cypress, it will run a "Verifying Cypress can run" step. This step can result in a "Cypress verification timed out" error. If that is the case, let the verification step run and then run the command again and it should succeed. diff --git a/packages/techdocs-cli/e2e-test.config.js b/packages/techdocs-cli/cli-e2e-test.config.js similarity index 93% rename from packages/techdocs-cli/e2e-test.config.js rename to packages/techdocs-cli/cli-e2e-test.config.js index 2fa92462ab..b2e6e53918 100644 --- a/packages/techdocs-cli/e2e-test.config.js +++ b/packages/techdocs-cli/cli-e2e-test.config.js @@ -18,5 +18,5 @@ const path = require('path'); module.exports = require('@backstage/cli/config/jest').then(baseConfig => ({ ...baseConfig, - rootDir: path.resolve(__dirname, 'e2e-tests'), + rootDir: path.resolve(__dirname, 'cli-e2e-tests'), })); diff --git a/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts b/packages/techdocs-cli/cli-e2e-tests/techdocs-cli.test.ts similarity index 100% rename from packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts rename to packages/techdocs-cli/cli-e2e-tests/techdocs-cli.test.ts diff --git a/packages/techdocs-cli/cypress.config.js b/packages/techdocs-cli/cypress.config.js deleted file mode 100644 index abaa324d76..0000000000 --- a/packages/techdocs-cli/cypress.config.js +++ /dev/null @@ -1,30 +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 { defineConfig } from 'cypress'; -import { initPlugin } from '@frsource/cypress-plugin-visual-regression-diff/plugins'; - -module.exports = defineConfig({ - e2e: { - setupNodeEvents(on, config) { - initPlugin(on, config); - }, - - excludeSpecPattern: ['**/__snapshots__/*', '**/__image_snapshots__/*'], - }, - viewportWidth: 1920, - viewportHeight: 1080, - includeShadowDom: true, -}); diff --git a/packages/techdocs-cli/cypress/.eslintrc.json b/packages/techdocs-cli/cypress/.eslintrc.json deleted file mode 100644 index 06965a82da..0000000000 --- a/packages/techdocs-cli/cypress/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "plugins": ["cypress"], - "extends": ["plugin:cypress/recommended"], - "rules": { - "jest/expect-expect": [ - "error", - { - "assertFunctionNames": ["expect", "cy.contains", "cy.document"] - } - ] - } -} diff --git a/packages/techdocs-cli/cypress/e2e/__image_snapshots__/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0.png b/packages/techdocs-cli/cypress/e2e/__image_snapshots__/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0.png deleted file mode 100644 index 99fc1ea483..0000000000 Binary files a/packages/techdocs-cli/cypress/e2e/__image_snapshots__/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0.png and /dev/null differ diff --git a/packages/techdocs-cli/cypress/e2e/__image_snapshots__/TechDocs Live Preview - MkDocs Serve toMatchImageSnapshot - MkDocs Page #0.png b/packages/techdocs-cli/cypress/e2e/__image_snapshots__/TechDocs Live Preview - MkDocs Serve toMatchImageSnapshot - MkDocs Page #0.png deleted file mode 100644 index e6c63d5d57..0000000000 Binary files a/packages/techdocs-cli/cypress/e2e/__image_snapshots__/TechDocs Live Preview - MkDocs Serve toMatchImageSnapshot - MkDocs Page #0.png and /dev/null differ diff --git a/packages/techdocs-cli/cypress/e2e/backstage_serve.cy.js b/packages/techdocs-cli/cypress/e2e/backstage_serve.cy.js deleted file mode 100644 index 0267c8bfe6..0000000000 --- a/packages/techdocs-cli/cypress/e2e/backstage_serve.cy.js +++ /dev/null @@ -1,58 +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. - */ -/// <reference types="cypress" /> -describe('TechDocs Live Preview - Backstage Serve', () => { - it('successfully serves documentation', () => { - cy.visit(`${Cypress.env('backstageBaseUrl')}/docs/default/component/local`); - cy.contains('hello mock docs'); - }); - - it('successfully navigates to sub page of documentation', () => { - cy.contains('SubDocs').click(); - cy.contains('Home 2').click(); - cy.contains( - 'This is an md file in another docs folder using the MkDocs Monorepo Plugin', - ); - }); - - it('successfully renders all Backstage main elements', () => { - cy.contains('header', 'Live preview environment'); - cy.get('[data-testid="sidebar-root"]') - .children() - .should('have.length.gt', 0); - }); - - it('successfully renders all extracted MkDocs main elements', () => { - // as it gets replaced by Backstage header - cy.get('.md-header').should('have.length', 0); - cy.get('.md-main').should('have.length', 1); - cy.contains( - '.md-main', - 'This is an md file in another docs folder using the MkDocs Monorepo Plugin', - ); - cy.get('.md-sidebar.md-sidebar--primary').should('have.length', 1); - cy.get('.md-sidebar.md-sidebar--primary').should('have.length', 1); - cy.get('.md-footer').should('have.length', 1); - }); - - it('matchImage - Backstage TechDocs Page', () => { - cy.visit( - `${Cypress.env('backstageBaseUrl')}/docs/default/component/local`, - ).then(() => { - cy.document().matchImage(); - }); - }); -}); diff --git a/packages/techdocs-cli/cypress/e2e/mkdocs_serve.cy.js b/packages/techdocs-cli/cypress/e2e/mkdocs_serve.cy.js deleted file mode 100644 index d5417e615f..0000000000 --- a/packages/techdocs-cli/cypress/e2e/mkdocs_serve.cy.js +++ /dev/null @@ -1,48 +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. - */ -/// <reference types="cypress" /> -describe('TechDocs Live Preview - MkDocs Serve', () => { - it('successfully serves documentation', () => { - cy.visit(Cypress.env('mkdocsBaseUrl')); - cy.contains('hello mock docs'); - }); - - it('successfully navigates to sub page of documentation', () => { - cy.contains('SubDocs').click(); - cy.contains('Home 2').click(); - cy.contains( - 'This is an md file in another docs folder using the MkDocs Monorepo Plugin', - ); - }); - - it('successfully renders all main elements', () => { - cy.get('.md-header').should('have.length', 1); - cy.get('.md-main').should('have.length', 1); - cy.contains( - '.md-main', - 'This is an md file in another docs folder using the MkDocs Monorepo Plugin', - ); - cy.get('.md-sidebar.md-sidebar--primary').should('have.length', 1); - cy.get('.md-sidebar.md-sidebar--primary').should('have.length', 1); - cy.get('.md-footer').should('have.length', 1); - }); - - it('matchImage - MkDocs Page', () => { - cy.visit(Cypress.env('mkdocsBaseUrl')).then(() => { - cy.document().matchImage(); - }); - }); -}); diff --git a/packages/techdocs-cli/cypress/fixtures/example.json b/packages/techdocs-cli/cypress/fixtures/example.json deleted file mode 100644 index 02e4254378..0000000000 --- a/packages/techdocs-cli/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage Header #0.png b/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage Header #0.png deleted file mode 100644 index 867e8ddd81..0000000000 Binary files a/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage Header #0.png and /dev/null differ diff --git a/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0 (1).png b/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0 (1).png deleted file mode 100644 index 3f1078345d..0000000000 Binary files a/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0 (1).png and /dev/null differ diff --git a/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0 (2).png b/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0 (2).png deleted file mode 100644 index c576be51c5..0000000000 Binary files a/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0 (2).png and /dev/null differ diff --git a/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0.png b/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0.png deleted file mode 100644 index 3f1078345d..0000000000 Binary files a/packages/techdocs-cli/cypress/screenshots/backstage_serve.js/TechDocs Live Preview - Backstage Serve toMatchImageSnapshot - Backstage TechDocs Page #0.png and /dev/null differ diff --git a/packages/techdocs-cli/cypress/support/commands.js b/packages/techdocs-cli/cypress/support/commands.js deleted file mode 100644 index a8d6a5fdb7..0000000000 --- a/packages/techdocs-cli/cypress/support/commands.js +++ /dev/null @@ -1,40 +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. - */ - -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/packages/techdocs-cli/cypress/support/e2e.js b/packages/techdocs-cli/cypress/support/e2e.js deleted file mode 100644 index f06a08e9a5..0000000000 --- a/packages/techdocs-cli/cypress/support/e2e.js +++ /dev/null @@ -1,36 +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. - */ - -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands'; -import '@frsource/cypress-plugin-visual-regression-diff/commands'; - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 70bb000257..6991e2a2c2 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.5.0-next.3", + "version": "1.5.2-next.0", "publishConfig": { "access": "public" }, @@ -27,9 +27,8 @@ "clean": "backstage-cli package clean", "lint": "backstage-cli package lint", "test": "backstage-cli package test", - "test:e2e": "backstage-cli test --config e2e-test.config.js", - "test:e2e:ci": "backstage-cli test --config e2e-test.config.js --watchAll=false --ci", - "test:cypress": "cypress open", + "test:e2e": "backstage-cli test --config cli-e2e-test.config.js", + "test:e2e:ci": "backstage-cli test --config cli-e2e-test.config.js --watchAll=false --ci", "prepack": "./scripts/prepack.sh" }, "bin": { @@ -37,14 +36,12 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@frsource/cypress-plugin-visual-regression-diff": "^3.2.8", "@types/commander": "^2.12.2", "@types/fs-extra": "^9.0.6", "@types/http-proxy": "^1.17.4", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "@types/serve-handler": "^6.1.0", "@types/webpack-env": "^1.15.3", - "cypress": "^10.0.0", "find-process": "^1.4.5", "nodemon": "^3.0.1", "techdocs-cli-embedded-app": "link:../techdocs-cli-embedded-app", diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 2d5abefcc2..f65db68aff 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/test-utils +## 1.4.4-next.0 + +### Patch Changes + +- 322bbcae24: Removed the alpha `MockPluginProvider` export since the plugin configuration API has been removed. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.8 + +## 1.4.3 + +### Patch Changes + +- 7032c214f3b4: Add pod exec terminal to Container Card +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- b5fbddc15dca: Add a new `MockTranslationApi` as an `/alpha` export. +- 9ceb6195275a: Add support for React Testing Library 13+, and thus React 18. + + We're exposing an additional option to the `render*` methods to enable the [`legacyRoot`](https://testing-library.com/docs/react-testing-library/api/#legacyroot) flow. + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 1.4.3-next.3 ### Patch Changes @@ -243,7 +278,7 @@ ### Minor Changes -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. ### Patch Changes @@ -301,7 +336,7 @@ ### Minor Changes -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. ### Patch Changes diff --git a/packages/test-utils/alpha-api-report.md b/packages/test-utils/alpha-api-report.md index 4a9fd2e5a4..945c754f83 100644 --- a/packages/test-utils/alpha-api-report.md +++ b/packages/test-utils/alpha-api-report.md @@ -4,17 +4,10 @@ ```ts import { Observable } from '@backstage/types'; -import { PropsWithChildren } from 'react'; -import { default as React_2 } from 'react'; import { TranslationApi } from '@backstage/core-plugin-api/alpha'; import { TranslationRef } from '@backstage/core-plugin-api/alpha'; import { TranslationSnapshot } from '@backstage/core-plugin-api/alpha'; -// @alpha -export const MockPluginProvider: ({ - children, -}: PropsWithChildren<{}>) => React_2.JSX.Element; - // @alpha (undocumented) export class MockTranslationApi implements TranslationApi { // (undocumented) diff --git a/packages/test-utils/api-report.md b/packages/test-utils/api-report.md index fe4edd627a..60bd352726 100644 --- a/packages/test-utils/api-report.md +++ b/packages/test-utils/api-report.md @@ -55,6 +55,11 @@ export type ErrorWithContext = { context?: ErrorApiErrorContext; }; +// @public +export type LegacyRootOption = { + legacyRoot?: boolean; +}; + // @public export type LogCollector = AsyncLogCollector | SyncLogCollector; @@ -194,13 +199,13 @@ export type MockStorageBucket = { // @public export function renderInTestApp( Component: ComponentType<PropsWithChildren<{}>> | ReactNode, - options?: TestAppOptions, + options?: TestAppOptions & LegacyRootOption, ): Promise<RenderResult>; // @public export function renderWithEffects( nodes: ReactElement, - options?: Pick<RenderOptions, 'wrapper'>, + options?: Pick<RenderOptions, 'wrapper'> & LegacyRootOption, ): Promise<RenderResult>; // @public diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 5a291d605d..9c4c1642f6 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.4.3-next.3", + "version": "1.4.4-next.0", "publishConfig": { "access": "public" }, @@ -55,22 +55,20 @@ "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@testing-library/dom": "^8.0.0", - "@testing-library/jest-dom": "^5.10.1", - "@testing-library/react": "^12.1.3", - "@testing-library/user-event": "^14.0.0", "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "i18next": "^22.4.15", "zen-observable": "^0.10.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0", - "react-dom": "^16.13.1 || ^17.0.0", + "@testing-library/react": "^12.1.3 || ^13.0.0 || ^14.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", + "@testing-library/jest-dom": "^5.10.1", "msw": "^1.0.0" }, "files": [ diff --git a/packages/test-utils/src/alpha.ts b/packages/test-utils/src/alpha.ts index c6801993bc..2077ad3586 100644 --- a/packages/test-utils/src/alpha.ts +++ b/packages/test-utils/src/alpha.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export * from './testUtils/MockPluginProvider'; export * from './testUtils/apis/TranslationApi'; diff --git a/packages/test-utils/src/testUtils/MockPluginProvider.tsx b/packages/test-utils/src/testUtils/MockPluginProvider.tsx deleted file mode 100644 index 25442ae267..0000000000 --- a/packages/test-utils/src/testUtils/MockPluginProvider.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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 React, { PropsWithChildren } from 'react'; -import { PluginProvider } from '@backstage/core-plugin-api/alpha'; -import { createPlugin } from '@backstage/core-plugin-api'; - -/** - * Mock for PluginProvider to use in unit tests - * @alpha - */ -export const MockPluginProvider = ({ children }: PropsWithChildren<{}>) => { - type TestInputPluginOptions = {}; - type TestPluginOptions = {}; - const plugin = createPlugin({ - id: 'my-plugin', - __experimentalConfigure(_: TestInputPluginOptions): TestPluginOptions { - return {}; - }, - }); - - return <PluginProvider plugin={plugin}>{children}</PluginProvider>; -}; diff --git a/packages/test-utils/src/testUtils/apis/TranslationApi/MockTranslationApi.test.ts b/packages/test-utils/src/testUtils/apis/TranslationApi/MockTranslationApi.test.ts index 45d23d9db2..0cc755ecb5 100644 --- a/packages/test-utils/src/testUtils/apis/TranslationApi/MockTranslationApi.test.ts +++ b/packages/test-utils/src/testUtils/apis/TranslationApi/MockTranslationApi.test.ts @@ -18,9 +18,9 @@ import { createTranslationRef } from '@backstage/core-plugin-api/alpha'; import { MockTranslationApi } from './MockTranslationApi'; describe('MockTranslationApi', () => { - function snapshotWithMessages<TMessages extends { [key in string]: string }>( - messages: TMessages, - ) { + function snapshotWithMessages< + const TMessages extends { [key in string]: string }, + >(messages: TMessages) { const translationApi = MockTranslationApi.create(); const ref = createTranslationRef({ id: 'test', @@ -50,7 +50,7 @@ describe('MockTranslationApi', () => { shallow: 'Foo {{ bar }}', multiple: 'Foo {{ bar }} {{ baz }}', deep: 'Foo {{ bar.baz }}', - } as const); + }); // @ts-expect-error expect(snapshot.t('shallow')).toBe('Foo {{ bar }}'); @@ -73,7 +73,7 @@ describe('MockTranslationApi', () => { it('should not escape by default', () => { const snapshot = snapshotWithMessages({ foo: 'Foo {{ foo }}', - } as const); + }); expect(snapshot.t('foo', { foo: '<div>' })).toBe('Foo <div>'); expect( @@ -89,7 +89,7 @@ describe('MockTranslationApi', () => { foo: 'Foo $t(bar) $t(baz)', bar: 'Nested', baz: 'Baz {{ qux }}', - } as const); + }); expect(snapshot.t('foo', { qux: 'Deep' })).toBe('Foo Nested Baz Deep'); }); @@ -104,7 +104,7 @@ describe('MockTranslationApi', () => { relativeSecondsShort: '= {{ x, relativeTime(range: second; style: short) }}', list: '= {{ x, list }}', - } as const); + }); expect(snapshot.t('plain', { x: '5' })).toBe('= 5'); expect(snapshot.t('number', { x: 5 })).toBe('= 5'); @@ -154,7 +154,7 @@ describe('MockTranslationApi', () => { derp_other: 'derps', derpWithCount_one: '{{ count }} derp', derpWithCount_other: '{{ count }} derps', - } as const); + }); expect(snapshot.t('derp', { count: 1 })).toBe('derp'); expect(snapshot.t('derp', { count: 2 })).toBe('derps'); diff --git a/packages/test-utils/src/testUtils/appWrappers.tsx b/packages/test-utils/src/testUtils/appWrappers.tsx index a95fdf6d8f..ebded4d813 100644 --- a/packages/test-utils/src/testUtils/appWrappers.tsx +++ b/packages/test-utils/src/testUtils/appWrappers.tsx @@ -33,7 +33,7 @@ import { createRouteRef, } from '@backstage/core-plugin-api'; import { MatcherFunction, RenderResult } from '@testing-library/react'; -import { renderWithEffects } from './testingLibrary'; +import { renderWithEffects, LegacyRootOption } from './testingLibrary'; import { defaultApis } from './defaultApis'; import { mockApis } from './mockApis'; @@ -232,7 +232,7 @@ export function wrapInTestApp( */ export async function renderInTestApp( Component: ComponentType<PropsWithChildren<{}>> | ReactNode, - options: TestAppOptions = {}, + options: TestAppOptions & LegacyRootOption = {}, ): Promise<RenderResult> { let wrappedElement: React.ReactElement; if (Component instanceof Function) { @@ -240,9 +240,11 @@ export async function renderInTestApp( } else { wrappedElement = Component as React.ReactElement; } + const { legacyRoot } = options; return renderWithEffects(wrappedElement, { wrapper: createTestAppWrapper(options), + legacyRoot, }); } diff --git a/packages/test-utils/src/testUtils/testingLibrary.ts b/packages/test-utils/src/testUtils/testingLibrary.ts index adb9867de8..c5dbd99eb0 100644 --- a/packages/test-utils/src/testUtils/testingLibrary.ts +++ b/packages/test-utils/src/testUtils/testingLibrary.ts @@ -22,6 +22,13 @@ import { RenderResult, } from '@testing-library/react'; +/** + * @public + * Set legacy mode when using React 18/RTL 13+. + * Mock this option while we're working against React 17 or lower. + */ +export type LegacyRootOption = { legacyRoot?: boolean }; + /** * @public * Simplifies rendering of async components in by taking care of the wrapping inside act @@ -36,7 +43,7 @@ import { */ export async function renderWithEffects( nodes: ReactElement, - options?: Pick<RenderOptions, 'wrapper'>, + options?: Pick<RenderOptions, 'wrapper'> & LegacyRootOption, ): Promise<RenderResult> { let value: RenderResult; await act(async () => { diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md index 695d5fb8fa..445bc6055a 100644 --- a/packages/theme/CHANGELOG.md +++ b/packages/theme/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/theme +## 0.4.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.4.2-next.0 ### Patch Changes diff --git a/packages/theme/package.json b/packages/theme/package.json index abcc6a2b32..98be3baddd 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/theme", "description": "material-ui theme for use with Backstage.", - "version": "0.4.2-next.0", + "version": "0.4.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 42fa968b3c..c8b9243adb 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/types +## 1.1.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 1.1.1-next.0 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 4c2574f920..f1f634af3e 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/types", "description": "Common TypeScript types used within Backstage", - "version": "1.1.1-next.0", + "version": "1.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/version-bridge/CHANGELOG.md b/packages/version-bridge/CHANGELOG.md index 58b278c3d1..bd7136e3ed 100644 --- a/packages/version-bridge/CHANGELOG.md +++ b/packages/version-bridge/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/version-bridge +## 1.0.5 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 1.0.5-next.0 ### Patch Changes diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index d0b5c33a7e..f14b263747 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/version-bridge", "description": "Utilities used by @backstage packages to support multiple concurrent versions", - "version": "1.0.5-next.0", + "version": "1.0.5", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000000..ee8228e413 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,67 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig } from '@playwright/test'; +import { generateProjects } from '@backstage/e2e-test-utils/playwright'; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + timeout: 30_000, + + expect: { + timeout: 5_000, + }, + + // Run your local dev server before starting the tests + webServer: process.env.CI + ? [] + : [ + { + command: 'yarn start', + port: 3000, + reuseExistingServer: true, + timeout: 60_000, + }, + // TODO: Before encouraging e2e tests for backend we'll want to provide better utilities for mocking auth + // { + // command: 'yarn start-backend', + // port: 7007, + // reuseExistingServer: true, + // timeout: 60_000, + // }, + ], + + forbidOnly: !!process.env.CI, + + retries: process.env.CI ? 2 : 0, + + reporter: [['html', { open: 'never', outputFolder: 'e2e-test-report' }]], + + use: { + actionTimeout: 0, + baseURL: + process.env.PLAYWRIGHT_URL ?? + (process.env.CI ? 'http://localhost:7007' : 'http://localhost:3000'), + screenshot: 'only-on-failure', + trace: 'on-first-retry', + }, + + outputDir: 'node_modules/.cache/e2e-test-results', + + projects: generateProjects(), // Find all packages with e2e-test folders +}); diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 6c50f1a51d..16bf9fbc56 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-adr-backend +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-adr-common@0.2.16-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.4.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-adr-common@0.2.15 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + ## 0.4.0-next.3 ### Minor Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index ed17cd3310..ebb9367362 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.4.0-next.3", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 6fb6984988..961562e016 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-adr-common +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.2.15 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + ## 0.2.15-next.3 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index 6df2fd8242..5e8e236b42 100644 --- a/plugins/adr-common/package.json +++ b/plugins/adr-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-adr-common", "description": "Common functionalities for the adr plugin", - "version": "0.2.15-next.3", + "version": "0.2.16-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index 429632133c..0694cedf65 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-adr +## 0.6.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-adr-common@0.2.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.6.7 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- aa844e704a32: support for i18n feature +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr-common@0.2.15 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + ## 0.6.7-next.3 ### Patch Changes diff --git a/plugins/adr/alpha-api-report.md b/plugins/adr/alpha-api-report.md index 7ce9f6f055..9d0bd071b1 100644 --- a/plugins/adr/alpha-api-report.md +++ b/plugins/adr/alpha-api-report.md @@ -3,8 +3,16 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { Extension } from '@backstage/frontend-plugin-api'; import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +// @alpha (undocumented) +export const AdrSearchResultListItemExtension: Extension<{ + lineClamp: number; + noTrack: boolean; +}>; + // @alpha (undocumented) export const adrTranslationRef: TranslationRef< 'adr', @@ -15,5 +23,9 @@ export const adrTranslationRef: TranslationRef< } >; +// @alpha (undocumented) +const _default: BackstagePlugin; +export default _default; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/adr/api-report.md b/plugins/adr/api-report.md index 6ed7b68196..9ce5834574 100644 --- a/plugins/adr/api-report.md +++ b/plugins/adr/api-report.md @@ -72,7 +72,6 @@ export const adrPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/adr/package.json b/plugins/adr/package.json index ff61f8dd2d..d0db1a4ff2 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,18 +1,18 @@ { "name": "@backstage/plugin-adr", - "version": "0.6.7-next.3", + "version": "0.6.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "exports": { ".": "./src/index.ts", - "./alpha": "./src/alpha.ts", + "./alpha": "./src/alpha.tsx", "./package.json": "./package.json" }, "typesVersions": { "*": { "alpha": [ - "src/alpha.ts" + "src/alpha.tsx" ], "package.json": [ "package.json" @@ -45,6 +45,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/integration-react": "workspace:^", "@backstage/plugin-adr-common": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", diff --git a/plugins/adr/src/alpha.tsx b/plugins/adr/src/alpha.tsx new file mode 100644 index 0000000000..1f6fa0711d --- /dev/null +++ b/plugins/adr/src/alpha.tsx @@ -0,0 +1,58 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { + createPlugin, + createSchemaFromZod, +} from '@backstage/frontend-plugin-api'; +import { createSearchResultListItemExtension } from '@backstage/plugin-search-react/alpha'; +import { AdrDocument } from '@backstage/plugin-adr-common'; + +export * from './translations'; + +function isAdrDocument(result: any): result is AdrDocument { + return result.entityRef; +} + +/** @alpha */ +export const AdrSearchResultListItemExtension = + createSearchResultListItemExtension({ + id: 'adr', + configSchema: createSchemaFromZod(z => + z.object({ + // TODO: Define how the icon can be configurable + noTrack: z.boolean().default(false), + lineClamp: z.number().default(5), + }), + ), + predicate: result => result.type === 'adr', + component: async ({ config }) => { + const { AdrSearchResultListItem } = await import( + './search/AdrSearchResultListItem' + ); + return ({ result, ...rest }) => + isAdrDocument(result) ? ( + <AdrSearchResultListItem {...rest} {...config} result={result} /> + ) : null; + }, + }); + +/** @alpha */ +export default createPlugin({ + id: 'adr', + extensions: [AdrSearchResultListItemExtension], +}); diff --git a/plugins/adr/src/translations.ts b/plugins/adr/src/translations.ts index 5cef279e66..cc0995f597 100644 --- a/plugins/adr/src/translations.ts +++ b/plugins/adr/src/translations.ts @@ -22,5 +22,5 @@ export const adrTranslationRef = createTranslationRef({ content_header_title: 'Architecture Decision Records', failed_to_fetch: 'Failed to fetch ADRs', no_adrs: 'No ADRs found', - } as const, + }, }); diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index 15bfb467a3..ec047a0b83 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-airbrake-backend +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index c6a34f5b24..3b3b21fbcb 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.3.0-next.3", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index de613ff54e..9e80ddf32d 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-airbrake +## 0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/test-utils@1.4.4-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/dev-utils@1.0.22-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.3.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/dev-utils@1.0.21 + - @backstage/theme@0.4.2 + ## 0.3.24-next.3 ### Patch Changes diff --git a/plugins/airbrake/api-report.md b/plugins/airbrake/api-report.md index a04d57d7e9..66f9b19bc8 100644 --- a/plugins/airbrake/api-report.md +++ b/plugins/airbrake/api-report.md @@ -13,7 +13,6 @@ export const airbrakePlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 93d2684219..768c9c203e 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.24-next.3", + "version": "0.3.25-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index 9500903b34..04339609a4 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-allure +## 0.1.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.1.40 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.40-next.3 ### Patch Changes diff --git a/plugins/allure/api-report.md b/plugins/allure/api-report.md index a192851f26..69bb740271 100644 --- a/plugins/allure/api-report.md +++ b/plugins/allure/api-report.md @@ -18,7 +18,6 @@ export const allurePlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/allure/package.json b/plugins/allure/package.json index fd210c85b2..cf33ee8696 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.40-next.3", + "version": "0.1.41-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index 3e62f31e51..c84c40b236 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-analytics-module-ga +## 0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/theme@0.4.2 + +## 0.1.33 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.33-next.3 ### Patch Changes diff --git a/plugins/analytics-module-ga/api-report.md b/plugins/analytics-module-ga/api-report.md index f28c919f33..1846211e72 100644 --- a/plugins/analytics-module-ga/api-report.md +++ b/plugins/analytics-module-ga/api-report.md @@ -10,7 +10,7 @@ import { Config } from '@backstage/config'; import { IdentityApi } from '@backstage/core-plugin-api'; // @public @deprecated (undocumented) -export const analyticsModuleGA: BackstagePlugin<{}, {}, {}>; +export const analyticsModuleGA: BackstagePlugin<{}, {}>; // @public export class GoogleAnalytics implements AnalyticsApi { diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 05610f836a..006a36a490 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.33-next.3", + "version": "0.1.34-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga4/CHANGELOG.md b/plugins/analytics-module-ga4/CHANGELOG.md index 369c9c281b..8f339c47e1 100644 --- a/plugins/analytics-module-ga4/CHANGELOG.md +++ b/plugins/analytics-module-ga4/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-analytics-module-ga4 +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/theme@0.4.2 + +## 0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.4-next.3 ### Patch Changes diff --git a/plugins/analytics-module-ga4/package.json b/plugins/analytics-module-ga4/package.json index 107aa1f3b2..fd3f6de64f 100644 --- a/plugins/analytics-module-ga4/package.json +++ b/plugins/analytics-module-ga4/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga4", - "version": "0.1.4-next.3", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-newrelic-browser/CHANGELOG.md b/plugins/analytics-module-newrelic-browser/CHANGELOG.md index 2988aad119..9b62fe7596 100644 --- a/plugins/analytics-module-newrelic-browser/CHANGELOG.md +++ b/plugins/analytics-module-newrelic-browser/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-analytics-module-newrelic-browser +## 0.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + +## 0.0.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + ## 0.0.2-next.3 ### Patch Changes diff --git a/plugins/analytics-module-newrelic-browser/package.json b/plugins/analytics-module-newrelic-browser/package.json index c2e7a254ca..0f2f01705a 100644 --- a/plugins/analytics-module-newrelic-browser/package.json +++ b/plugins/analytics-module-newrelic-browser/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-newrelic-browser", - "version": "0.0.2-next.3", + "version": "0.0.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index e83103d5b5..76f6ea95ed 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-apache-airflow +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + +## 0.2.15 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + ## 0.2.15-next.3 ### Patch Changes diff --git a/plugins/apache-airflow/api-report.md b/plugins/apache-airflow/api-report.md index be2a208bd4..922ad4e868 100644 --- a/plugins/apache-airflow/api-report.md +++ b/plugins/apache-airflow/api-report.md @@ -22,7 +22,6 @@ export const apacheAirflowPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; ``` diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index aa29fe84c9..ec4bf91916 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.15-next.3", + "version": "0.2.16-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md index 84db7d0e7b..3786ca011a 100644 --- a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md +++ b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-api-docs-module-protoc-gen-doc +## 0.1.3 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index 2066f6a620..e0ad10f4f0 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs-module-protoc-gen-doc", "description": "Additional functionalities for the api-docs plugin that renders the output of the protoc-gen-doc", - "version": "0.1.3-next.1", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index e2b7274fe9..60f00d29d5 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-api-docs +## 0.9.12-next.0 + +### Patch Changes + +- 0117a6b47e: Adding `requestInterceptor` option to `api-docs` and pass it to SwaggerUI. This will enable to configure a proxy or headers to be sent to all the request made through the `Try it out` button on SwaggerUI. +- 18f1756908: added aria-label on api definition button for better a11y. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.9.11 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.9.11-next.3 ### Patch Changes diff --git a/plugins/api-docs/README.md b/plugins/api-docs/README.md index 27e19b218d..792a7fb0b7 100644 --- a/plugins/api-docs/README.md +++ b/plugins/api-docs/README.md @@ -222,3 +222,42 @@ security: ## Links - [The Backstage homepage](https://backstage.io) + +### Adding `requestInterceptor` to Swagger UI + +To configure a [`requestInterceptor` for Swagger UI](https://github.com/swagger-api/swagger-ui/tree/master/flavors/swagger-ui-react#requestinterceptor-proptypesfunc) you'll need to add the following to your `api.tsx`: + +```tsx +... +import { OpenApiDefinitionWidget, apiDocsConfigRef, defaultDefinitionWidgets } from '@backstage/plugin-api-docs'; +import { ApiEntity } from '@backstage/catalog-model'; + +export const apis: AnyApiFactory[] = [ +... +createApiFactory({ + api: apiDocsConfigRef, + deps: {}, + factory: () => { + // Overriding openapi definition widget to add header + const requestInterceptor = (req: any) => { + req.headers.append('myheader', 'wombats'); + return req; + }; + const definitionWidgets = defaultDefinitionWidgets().map(obj => { + if (obj.type === 'openapi') { + return { + ...obj, + component: (definition) => <OpenApiDefinitionWidget definition={definition} requestInterceptor={requestInterceptor} />, + } + } + return obj; + }); + + return { + getApiDefinitionWidget: (apiEntity: ApiEntity) => { + return definitionWidgets.find(d => d.type === apiEntity.spec.type); + }, + }; + }, + }) +``` diff --git a/plugins/api-docs/api-report.md b/plugins/api-docs/api-report.md index 59d490a1fe..a018dfcdb1 100644 --- a/plugins/api-docs/api-report.md +++ b/plugins/api-docs/api-report.md @@ -54,8 +54,7 @@ const apiDocsPlugin: BackstagePlugin< }, { registerApi: ExternalRouteRef<undefined, true>; - }, - {} + } >; export { apiDocsPlugin }; export { apiDocsPlugin as plugin }; @@ -166,6 +165,7 @@ export const OpenApiDefinitionWidget: ( // @public (undocumented) export type OpenApiDefinitionWidgetProps = { definition: string; + requestInterceptor?: (req: any) => any | Promise<any>; }; // @public (undocumented) diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 280b3bde07..b9d7a1b6f5 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.9.11-next.3", + "version": "0.9.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/src/components/ApisCards/presets.tsx b/plugins/api-docs/src/components/ApisCards/presets.tsx index b1ef39c113..050944b239 100644 --- a/plugins/api-docs/src/components/ApisCards/presets.tsx +++ b/plugins/api-docs/src/components/ApisCards/presets.tsx @@ -33,10 +33,12 @@ export function createSpecApiTypeColumn(): TableColumn<ApiEntity> { const ApiDefinitionButton = ({ apiEntity }: { apiEntity: ApiEntity }) => { const [dialogOpen, setDialogOpen] = useState(false); - return ( <> - <ToggleButton onClick={() => setDialogOpen(!dialogOpen)}> + <ToggleButton + aria-label="Toggle API Definition Dialog" + onClick={() => setDialogOpen(!dialogOpen)} + > <ExtensionIcon /> </ToggleButton> <ApiDefinitionDialog diff --git a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.test.tsx b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.test.tsx index 735fba86f7..adbd069908 100644 --- a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.test.tsx +++ b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.test.tsx @@ -38,8 +38,14 @@ paths: "200": description: Success `; + + const requestInterceptor = (req: any) => req; + const { getByText } = await renderInTestApp( - <OpenApiDefinition definition={definition} />, + <OpenApiDefinition + definition={definition} + requestInterceptor={requestInterceptor} + />, ); // swagger-ui loads the documentation asynchronously diff --git a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx index 5d5988399a..a2ebbbc7e3 100644 --- a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx +++ b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx @@ -136,9 +136,13 @@ const useStyles = makeStyles(theme => ({ export type OpenApiDefinitionProps = { definition: string; + requestInterceptor?: (req: any) => any | Promise<any>; }; -export const OpenApiDefinition = ({ definition }: OpenApiDefinitionProps) => { +export const OpenApiDefinition = ({ + definition, + requestInterceptor, +}: OpenApiDefinitionProps) => { const classes = useStyles(); // Due to a bug in the swagger-ui-react component, the component needs @@ -152,7 +156,12 @@ export const OpenApiDefinition = ({ definition }: OpenApiDefinitionProps) => { return ( <div className={classes.root}> - <SwaggerUI spec={def} url="" deepLinking /> + <SwaggerUI + spec={def} + url="" + requestInterceptor={requestInterceptor} + deepLinking + /> </div> ); }; diff --git a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinitionWidget.tsx b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinitionWidget.tsx index 424a52136b..152f1fd089 100644 --- a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinitionWidget.tsx +++ b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinitionWidget.tsx @@ -28,6 +28,7 @@ const LazyOpenApiDefinition = React.lazy(() => /** @public */ export type OpenApiDefinitionWidgetProps = { definition: string; + requestInterceptor?: (req: any) => any | Promise<any>; }; /** @public */ diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index b67c6c3aaf..3b5dd74b31 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-apollo-explorer +## 0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## 0.1.15 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.15-next.3 ### Patch Changes diff --git a/plugins/apollo-explorer/api-report.md b/plugins/apollo-explorer/api-report.md index 2dd6c14a90..7d06876e89 100644 --- a/plugins/apollo-explorer/api-report.md +++ b/plugins/apollo-explorer/api-report.md @@ -38,7 +38,6 @@ export const apolloExplorerPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; ``` diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index bd98d9b44f..cebc6f8637 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.15-next.3", + "version": "0.1.16-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index ecc0331afc..d3ea6acc47 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-app-backend +## 0.3.53-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.5.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-app-node@0.1.5-next.0 + +## 0.3.51 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/plugin-app-node@0.1.3 + ## 0.3.51-next.3 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 54e6449013..cdbb36d23c 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.51-next.3", + "version": "0.3.53-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -69,7 +69,7 @@ "@backstage/cli": "workspace:^", "@backstage/types": "workspace:^", "@types/supertest": "^2.0.8", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "node-fetch": "^2.6.7", "supertest": "^6.1.3" diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md index 33222b239a..48bdd793af 100644 --- a/plugins/app-node/CHANGELOG.md +++ b/plugins/app-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-app-node +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.3-next.3 ### Patch Changes diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 18edd3828e..9a722915c0 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-node", "description": "Node.js library for the app plugin", - "version": "0.1.3-next.3", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md index 126e6e8fe5..bc44a30fd2 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-auth-backend-module-gcp-iap-provider +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a GCP IAP auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.3 ### Patch Changes diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index 75d16cd6ed..a115450273 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-gcp-iap-provider", "description": "A GCP IAP auth provider module for the Backstage auth backend", - "version": "0.1.0-next.3", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index 09319b6cb0..3055ce643c 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.1.2-next.0 + +### Patch Changes + +- 5d32a58b5a: Fixed a bug where the GitHub authenticator did not properly persist granted OAuth scopes. +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.1.0 + +### Minor Changes + +- 23af27f5ce79: New module for `@backstage/plugin-auth-backend` that adds a GitHub auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.3 ### Patch Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index 40010cf0be..b06ee136fa 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", "description": "The github-provider backend module for the auth plugin.", - "version": "0.1.0-next.3", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-github-provider/src/authenticator.ts b/plugins/auth-backend-module-github-provider/src/authenticator.ts index f59ac3d727..4a9710d114 100644 --- a/plugins/auth-backend-module-github-provider/src/authenticator.ts +++ b/plugins/auth-backend-module-github-provider/src/authenticator.ts @@ -28,6 +28,7 @@ const ACCESS_TOKEN_PREFIX = 'access-token.'; export const githubAuthenticator = createOAuthAuthenticator({ defaultProfileTransform: PassportOAuthAuthenticatorHelper.defaultProfileTransform, + shouldPersistScopes: true, initialize({ callbackUrl, config }) { const clientId = config.getString('clientId'); const clientSecret = config.getString('clientSecret'); diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md index 67f96087ed..4a29c21c58 100644 --- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-auth-backend-module-gitlab-provider +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.1.0 + +### Minor Changes + +- 080cc7794700: New module for `@backstage/plugin-auth-backend` that adds a GitLab auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.2 ### Patch Changes diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index 52f61d5d9a..e626a02d3a 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-gitlab-provider", "description": "The gitlab-provider backend module for the auth plugin.", - "version": "0.1.0-next.2", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md index 4ca6bb78b9..bdb1d576a5 100644 --- a/plugins/auth-backend-module-google-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-auth-backend-module-google-provider +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a Google auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.3 ### Patch Changes diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json index a9829db7c0..e5dc87ca71 100644 --- a/plugins/auth-backend-module-google-provider/package.json +++ b/plugins/auth-backend-module-google-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-google-provider", "description": "A Google auth provider module for the Backstage auth backend", - "version": "0.1.0-next.3", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md index 583693a705..f15ef3bad8 100644 --- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-auth-backend-module-oauth2-provider +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.1.0 + +### Minor Changes + +- 101cf1d13b04: New module for `@backstage/plugin-auth-backend` that adds a `oauth2` auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json index 85ffd64130..e18e50f44d 100644 --- a/plugins/auth-backend-module-oauth2-provider/package.json +++ b/plugins/auth-backend-module-oauth2-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-provider", "description": "The oauth2-provider backend module for the auth plugin.", - "version": "0.1.0-next.0", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index df99eedf83..2460e7626c 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,68 @@ # @backstage/plugin-auth-backend +## 0.19.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend-module-github-provider@0.1.2-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.2-next.0 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.2-next.0 + - @backstage/plugin-auth-backend-module-google-provider@0.1.2-next.0 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.2-next.0 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.19.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 080cc7794700: Migrated the GitLab auth provider to be implemented using the new `@backstage/plugin-auth-backend-module-gitlab-provider` module. +- 7944d43f4790: Added `authPlugin` export for the new backend system. The plugin does not include any built-in auth providers, they must instead be added by installing additional modules, for example `authModuleGoogleProvider` from `@backstage/plugin-auth-backend-module-google-provider`. +- 8513cd7d00e3: Deprecated several exports that are now available from `@backstage/plugin-auth-node` instead. +- 7944d43f4790: Added the ability to disable the built-in auth providers by passing `disableDefaultProviderFactories` to `createRouter`. +- 7944d43f4790: The algorithm used when generating Backstage tokens can be configured via `auth.identityTokenAlgorithm`. +- Updated dependencies + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.1.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.0 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.0 + - @backstage/plugin-auth-backend-module-google-provider@0.1.0 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.0 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.19.0-next.3 ### Minor Changes @@ -299,7 +362,7 @@ ### Patch Changes - d8f774c30df: Enforce the secret visibility of certificates and client secrets in the auth backend. Also, document all known options for each auth plugin. -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. - 475abd1dc3f: The `microsoft` (i.e. Azure) auth provider now supports negotiating tokens for Azure resources besides Microsoft Graph (e.g. AKS, Virtual Machines, Machine Learning Services, etc.). When the `/frame/handler` endpoint is called with an @@ -385,7 +448,7 @@ ### Patch Changes - d8f774c30df: Enforce the secret visibility of certificates and client secrets in the auth backend. Also, document all known options for each auth plugin. -- 7908d72e033: Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. - Updated dependencies - @backstage/backend-common@0.18.4-next.0 - @backstage/config@1.0.7 diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 5007a5fbd6..e10568aaec 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.19.0-next.3", + "version": "0.19.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 4051844378..c3bdb44cb1 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,60 @@ # @backstage/plugin-auth-node +## 0.3.2-next.0 + +### Patch Changes + +- 6c2b0793bf: Fix for persisted scopes not being properly restored on sign-in. +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.3.0 + +### Minor Changes + +- 8513cd7d00e3: Introduced a new system for building auth providers for `@backstage/plugin-auth-backend`, which both increases the amount of code re-use across providers, and also works better with the new backend system. + + Many existing types have been moved from `@backstage/plugin-auth-backend` in order to avoid a direct dependency on the plugin from modules. + + Auth provider integrations are now primarily implemented through a pattern of creating "authenticators", which are in turn specific to each kind of integrations. Initially there are two types: `createOAuthAuthenticator` and `createProxyAuthenticator`. These come paired with functions that let you create the corresponding route handlers, `createOAuthRouteHandlers` and `createProxyAuthRouteHandlers`, as well as provider factories, `createOAuthProviderFactory` and `createProxyAuthProviderFactory`. This new authenticator pattern allows the sign-in logic to be separated from the auth integration logic, allowing it to be completely re-used across all providers of the same kind. + + The new provider factories also implement a new declarative way to configure sign-in resolvers, rather than configuration through code. Sign-in resolvers can now be configured through the `resolvers` configuration key, where the first resolver that provides an identity will be used, for example: + + ```yaml + auth: + providers: + google: + development: + clientId: ... + clientSecret: ... + signIn: + resolvers: + - resolver: emailMatchingUserEntityAnnotation + - resolver: emailLocalPartMatchingUserEntityName + ``` + + These configurable resolvers are created with a new `createSignInResolverFactory` function, which creates a sign-in resolver factory, optionally with an options schema that will be used both when configuring the sign-in resolver through configuration and code. + + The internal helpers from `@backstage/plugin-auth-backend` that were used to implement auth providers using passport strategies have now also been made available as public API, through `PassportHelpers` and `PassportOAuthAuthenticatorHelper`. + +### Patch Changes + +- 18619f793c94: The `BackstageIdentityResponse` interface now has an optional `expiresInSeconds` field that can be used to signal session expiration. The `prepareBackstageIdentityResponse` utility will now also read the expiration from the provided token, and include it in the response. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 42a3732bd1..64b2ab4558 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.3.0-next.3", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts index 2573d95ea1..7da5519655 100644 --- a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts +++ b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts @@ -297,7 +297,7 @@ describe('createOAuthRouteHandlers', () => { state: encodeOAuthState({ env: 'development', nonce: '123', - scope: 'my-scope', + scope: 'my-scope my-other-scope', } as OAuthState), }); @@ -310,7 +310,7 @@ describe('createOAuthRouteHandlers', () => { accessToken: 'access-token', expiresInSeconds: 3, idToken: 'id-token', - scope: 'my-scope', + scope: 'my-scope my-other-scope', }, backstageIdentity: { identity: { @@ -324,7 +324,9 @@ describe('createOAuthRouteHandlers', () => { }); expect(getRefreshTokenCookie(agent).value).toBe('refresh-token'); - expect(getGrantedScopesCookie(agent).value).toBe('my-scope'); + expect(getGrantedScopesCookie(agent).value).toBe( + 'my-scope%20my-other-scope', + ); }); it('should redirect with persisted scope', async () => { @@ -357,7 +359,7 @@ describe('createOAuthRouteHandlers', () => { state: encodeOAuthState({ env: 'development', nonce: '123', - scope: 'my-scope', + scope: 'my-scope my-other-scope', flow: 'redirect', redirectUrl: 'https://127.0.0.1:3000/redirect', } as OAuthState), @@ -367,7 +369,9 @@ describe('createOAuthRouteHandlers', () => { expect(res.get('Location')).toBe('https://127.0.0.1:3000/redirect'); expect(getRefreshTokenCookie(agent).value).toBe('refresh-token'); - expect(getGrantedScopesCookie(agent).value).toBe('my-scope'); + expect(getGrantedScopesCookie(agent).value).toBe( + 'my-scope%20my-other-scope', + ); }); it('should require a valid origin', async () => { diff --git a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.ts b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.ts index 011b3fc0f0..165d7ce6b3 100644 --- a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.ts +++ b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.ts @@ -136,7 +136,7 @@ export function createOAuthRouteHandlers<TProfile>( // If scopes are persisted then we pass them through the state so that we // can set the cookie on successful auth - if (authenticator.shouldPersistScopes) { + if (authenticator.shouldPersistScopes && scope) { state.scope = scope; } @@ -214,7 +214,7 @@ export function createOAuthRouteHandlers<TProfile>( // the provider does not return granted scopes on refresh or if they are normalized. if (authenticator.shouldPersistScopes && state.scope) { cookieManager.setGrantedScopes(res, state.scope, appOrigin); - result.session.scope = state.scope; + response.providerInfo.scope = state.scope; } if (result.session.refreshToken) { diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index a10b0bd688..629bcba049 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-azure-devops-backend +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-azure-devops-common@0.3.1 + +## 0.4.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-devops-common@0.3.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.4.0-next.3 ### Minor Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index be959406eb..bc8d07b040 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.4.0-next.3", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-common/CHANGELOG.md b/plugins/azure-devops-common/CHANGELOG.md index e117d80b34..e5637a9ff4 100644 --- a/plugins/azure-devops-common/CHANGELOG.md +++ b/plugins/azure-devops-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-azure-devops-common +## 0.3.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/azure-devops-common/package.json b/plugins/azure-devops-common/package.json index 6d3e8f5edb..7648e39539 100644 --- a/plugins/azure-devops-common/package.json +++ b/plugins/azure-devops-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-common", - "version": "0.3.1-next.0", + "version": "0.3.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index 1de0ee585d..cc4f6f1e26 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-azure-devops +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-azure-devops-common@0.3.1 + +## 0.3.6 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-azure-devops-common@0.3.1 + - @backstage/theme@0.4.2 + ## 0.3.6-next.3 ### Patch Changes diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index 2c916ec33b..6b33762639 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -162,7 +162,7 @@ export class AzureDevOpsClient implements AzureDevOpsApi { } // @public (undocumented) -export const azureDevOpsPlugin: BackstagePlugin<{}, {}, {}>; +export const azureDevOpsPlugin: BackstagePlugin<{}, {}>; // @public (undocumented) export const AzurePullRequestsIcon: ( diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 1676aafab7..f338307ba0 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.3.6-next.3", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 85d3c02c81..06c9538119 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-azure-sites-backend +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-sites-common@0.1.1 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-azure-sites-common@0.1.1 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 8cce936c7a..0aa06b3e4e 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.13-next.3", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-common/CHANGELOG.md b/plugins/azure-sites-common/CHANGELOG.md index a61756b3c2..99dfef3e5b 100644 --- a/plugins/azure-sites-common/CHANGELOG.md +++ b/plugins/azure-sites-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-azure-sites-common +## 0.1.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/azure-sites-common/package.json b/plugins/azure-sites-common/package.json index 4ee8be6dd1..05815edd02 100644 --- a/plugins/azure-sites-common/package.json +++ b/plugins/azure-sites-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-azure-sites-common", "description": "Common functionalities for the azure plugin", - "version": "0.1.1-next.0", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 3b477fb4ee..ef4d64fbba 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-azure-sites +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-azure-sites-common@0.1.1 + +## 0.1.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-azure-sites-common@0.1.1 + - @backstage/theme@0.4.2 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/azure-sites/api-report.md b/plugins/azure-sites/api-report.md index bec89e17bc..abc10ec723 100644 --- a/plugins/azure-sites/api-report.md +++ b/plugins/azure-sites/api-report.md @@ -49,7 +49,6 @@ export const azureSitesPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 544045573a..900fb54b08 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.13-next.3", + "version": "0.1.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 9f2191eea1..34c2760f7b 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-badges-backend +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## 0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index 8fa4211e0c..c4ffb180c1 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.3.0-next.3", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/src/plugin.ts b/plugins/badges-backend/src/plugin.ts index 3e462e88e9..e5a51d763f 100644 --- a/plugins/badges-backend/src/plugin.ts +++ b/plugins/badges-backend/src/plugin.ts @@ -20,6 +20,7 @@ import { createBackendPlugin, } from '@backstage/backend-plugin-api'; import { createRouter } from './service/router'; +import { createDefaultBadgeFactories } from './badges'; /** * Badges backend plugin @@ -50,6 +51,7 @@ export const badgesPlugin = createBackendPlugin({ await createRouter({ config, logger: loggerToWinstonLogger(logger), + badgeFactories: createDefaultBadgeFactories(), discovery, tokenManager, identity, diff --git a/plugins/badges-backend/src/service/router.ts b/plugins/badges-backend/src/service/router.ts index 308865b73a..47bb8fcbe8 100644 --- a/plugins/badges-backend/src/service/router.ts +++ b/plugins/badges-backend/src/service/router.ts @@ -32,6 +32,7 @@ import { Logger } from 'winston'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; import { BadgesStore, DatabaseBadgesStore } from '../database/badgesStore'; +import { createDefaultBadgeFactories } from '../badges'; /** @public */ export interface RouterOptions { @@ -54,7 +55,9 @@ export async function createRouter( options.catalog || new CatalogClient({ discoveryApi: options.discovery }); const badgeBuilder = options.badgeBuilder || - new DefaultBadgeBuilder(options.badgeFactories || {}); + new DefaultBadgeBuilder( + options.badgeFactories || createDefaultBadgeFactories(), + ); const router = Router(); const { config, logger, tokenManager, discovery, identity } = options; diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 59b0eb9458..6b880b99eb 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-badges +## 0.2.49-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.48 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.2.48-next.3 ### Patch Changes diff --git a/plugins/badges/api-report.md b/plugins/badges/api-report.md index e73a887316..c32b901058 100644 --- a/plugins/badges/api-report.md +++ b/plugins/badges/api-report.md @@ -9,7 +9,7 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { JSX as JSX_2 } from 'react'; // @public (undocumented) -export const badgesPlugin: BackstagePlugin<{}, {}, {}>; +export const badgesPlugin: BackstagePlugin<{}, {}>; // @public (undocumented) export const EntityBadgesDialog: (props: { diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 82361daef1..d4d591aa83 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.48-next.3", + "version": "0.2.49-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 37b3f7d46d..0606865996 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-bazaar-backend +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + +## 0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index 603c723fb8..1cab7c95d3 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.3.0-next.3", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index f140081951..55fdd98b98 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-bazaar +## 0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.16 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.2.16-next.3 ### Patch Changes diff --git a/plugins/bazaar/api-report.md b/plugins/bazaar/api-report.md index 282983b378..ba0396f81e 100644 --- a/plugins/bazaar/api-report.md +++ b/plugins/bazaar/api-report.md @@ -41,7 +41,6 @@ export const bazaarPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 4df78fe89f..06613d6aae 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.16-next.3", + "version": "0.2.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 53b0f90d25..439fda1b41 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + +## 0.2.12 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration@1.7.0 + ## 0.2.12-next.3 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 2dc63ff61c..5a109f3fb5 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", "description": "Common functionalities for bitbucket-cloud plugins", - "version": "0.2.12-next.3", + "version": "0.2.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index a19027d361..afc67834b3 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-bitrise +## 0.1.52-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.1.51 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.51-next.3 ### Patch Changes diff --git a/plugins/bitrise/api-report.md b/plugins/bitrise/api-report.md index 7f2e44f04f..cb68d79c51 100644 --- a/plugins/bitrise/api-report.md +++ b/plugins/bitrise/api-report.md @@ -13,7 +13,7 @@ import { JSX as JSX_2 } from 'react'; export const BITRISE_APP_ANNOTATION = 'bitrise.io/app'; // @public (undocumented) -export const bitrisePlugin: BackstagePlugin<{}, {}, {}>; +export const bitrisePlugin: BackstagePlugin<{}, {}>; // @public (undocumented) export const EntityBitriseContent: () => JSX_2.Element; diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index e18e4aca8c..c94be4551d 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.51-next.3", + "version": "0.1.52-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 045e86cf82..70f1e02899 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,58 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.2.8-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-kubernetes-common@0.6.6 + +## 0.2.6 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/integration-aws-node@0.1.6 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 848bf34d47..c05a7c0de7 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.2.6-next.3", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts index 4df92b58c2..25631b2f99 100644 --- a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts +++ b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts @@ -131,7 +131,10 @@ export class AwsS3EntityProvider implements EntityProvider { try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 92bdfd109b..9864f7ca09 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.24-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.1.22 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 94f96508491d: Improve consistency of results from the `AzureDevOpsEntityProvider`. +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. +- 044b4f2fb1e3: Remove duplications from Azure search before committing the new locations to the catalog. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.22-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 73b140d58a..ea3ae522ee 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.22-next.3", + "version": "0.1.24-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts index 92398779c7..f56369a0d1 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts @@ -123,7 +123,10 @@ export class AzureDevOpsEntityProvider implements EntityProvider { try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index e1eef3b2e2..96890c9c33 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,56 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.20-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.13-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.1.18 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.12 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.18-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index b76688ce82..eb371743c4 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.18-next.3", + "version": "0.1.20-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts index 96c6be5b80..14f561473b 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts @@ -152,7 +152,10 @@ export class BitbucketCloudEntityProvider try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 61ee4d7e09..245c481327 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.18-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.1.16 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.16-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 79891dee21..03547d7883 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.16-next.3", + "version": "0.1.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts index fd2b3e3959..95bda0e910 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts @@ -130,7 +130,10 @@ export class BitbucketServerEntityProvider implements EntityProvider { try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index 1fef938310..49756558a8 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.13-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.2.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.12 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.2.18-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index ff1d57603f..64497a2854 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.18-next.3", + "version": "0.2.20-next.0", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index d25891f15c..79bced28f5 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-kubernetes-common@0.6.6 + +## 0.1.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 201f07c27f1e: Fix GKE endpoint parsing + + Endpoint is an IP, not url. It is always https on default (443) port + ref: https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1/projects.locations.clusters#Cluster + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.3-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 7f9ec4fd90..66b195273c 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", "description": "A Backstage catalog backend module that helps integrate towards GCP", - "version": "0.1.3-next.3", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index ae454f70b3..486b566635 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.21-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.1.19 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.19-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index bb59f7ef14..a24644181f 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.19-next.3", + "version": "0.1.21-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts index 76cccaf37b..c773004532 100644 --- a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts +++ b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts @@ -129,7 +129,10 @@ export class GerritEntityProvider implements EntityProvider { try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 0021623e5a..1851ecd90b 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,67 @@ # @backstage/plugin-catalog-backend-module-github +## 0.4.3-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.4.0 + +### Minor Changes + +- fa7004d9722c: Added a `catalogModuleGithubOrgEntityProvider` for the new backend system + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 3d63e60f3c36: Internal restructure to avoid circular imports +- 96353bb7cb4a: Properly support custom `userTransformer` returning `undefined` in `GithubMultiOrgEntityProvider` +- 3c44761b9191: Allow github user and team transforms to return any Entity +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + ## 0.4.0-next.3 ### Minor Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 7600fe23ed..a909f1df44 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.4.0-next.3", + "version": "0.4.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts index e91cc328f7..0dd6259f1c 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts @@ -163,7 +163,10 @@ export class GithubEntityProvider implements EntityProvider, EventSubscriber { try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts index 7e15c4ce68..cabb9e21ce 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts @@ -831,7 +831,10 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { try { await this.read({ logger }); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts index 4e43b5d67e..0fe61aa229 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts @@ -584,7 +584,10 @@ export class GithubOrgEntityProvider try { await this.read({ logger }); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 121c32da16..c3457bbc09 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,68 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.3.2-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.3.0 + +### Minor Changes + +- 3d73bafd85c9: Fix Gitlab.com user ingestion by scoping GitlabOrgDiscoveryEntityProvider to a group. + + **BREAKING** The `group` parameter is now required Gitlab.com Org Data integrations and the backend will fail to start without this option configured. + + ```diff + catalog: + providers: + gitlab: + yourProviderId: + host: gitlab.com + orgEnabled: true + + group: org/teams + ``` + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index f5f97ed03b..5e81ed5ee6 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.3.0-next.3", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts index a56c229105..f836500c6e 100644 --- a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts @@ -237,14 +237,6 @@ describe('GitlabDiscoveryProcessor', () => { web_url: 'https://gitlab.fake/3', path_with_namespace: '3', }, - { - id: 4, - archived: true, // ARCHIVED - default_branch: 'master', - last_activity_at: '2021-08-05T11:03:05.774Z', - web_url: 'https://gitlab.fake/4', - path_with_namespace: '4', - }, { id: 5, archived: false, diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts index dda30fd86a..dad126e3e4 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts @@ -120,6 +120,14 @@ function setupFakeHasFileEndpoint(srv: SetupServer, apiBaseUrl: string) { ); } +function setupFakeURLReturnEndpoint(srv: SetupServer, url: string) { + srv.use( + rest.get(url, (req, res, ctx) => { + return res(ctx.json([{ endpoint: req.url.toString() }])); + }), + ); +} + describe('GitLabClient', () => { describe('isSelfManaged', () => { it('returns true if self managed instance', () => { @@ -933,3 +941,84 @@ describe('hasFile', () => { expect(hasFile).toBe(false); }); }); + +describe('pagedRequest search params', () => { + beforeEach(() => { + // setup fake paginated endpoint with 4 pages each returning one item + setupFakeURLReturnEndpoint(server, FAKE_PAGED_URL); + }); + + it('no search params provided', async () => { + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const { items } = await client.pagedRequest<{ endpoint: string }>( + FAKE_PAGED_ENDPOINT, + ); + // fake page contains exactly one item + expect(items).toHaveLength(1); + expect(items).toEqual([ + { endpoint: 'https://example.com/api/v4/some-endpoint' }, + ]); + }); + + it('defined numeric search params', async () => { + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const { items } = await client.pagedRequest<{ endpoint: string }>( + FAKE_PAGED_ENDPOINT, + { page: 1, per_page: 50 }, + ); + // fake page contains exactly one item + expect(items).toHaveLength(1); + expect(items).toEqual([ + { + endpoint: 'https://example.com/api/v4/some-endpoint?page=1&per_page=50', + }, + ]); + }); + + it('defined string search params', async () => { + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const { items } = await client.pagedRequest<{ endpoint: string }>( + FAKE_PAGED_ENDPOINT, + { test: 'value', empty: '' }, + ); + // fake page contains exactly one item + expect(items).toHaveLength(1); + expect(items).toEqual([ + { + endpoint: 'https://example.com/api/v4/some-endpoint?test=value', + }, + ]); + }); + + it('defined boolean search params', async () => { + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const { items } = await client.pagedRequest<{ endpoint: string }>( + FAKE_PAGED_ENDPOINT, + { active: true, archived: false }, + ); + // fake page contains exactly one item + expect(items).toHaveLength(1); + expect(items).toEqual([ + { + endpoint: + 'https://example.com/api/v4/some-endpoint?active=true&archived=false', + }, + ]); + }); +}); diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index 79ae328ce2..daf82245e8 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -309,7 +309,7 @@ export class GitLabClient { ): Promise<PagedResponse<T>> { const request = new URL(`${this.config.apiBaseUrl}${endpoint}`); for (const key in options) { - if (options[key]) { + if (options[key] !== undefined && options[key] !== '') { request.searchParams.append(key, options[key]!.toString()); } } diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index ce7a304746..32da64f819 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -133,7 +133,10 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index 0ef0e2b23c..fcf6a33a22 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -155,7 +155,10 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 59bfe73054..616890d17b 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-permission-common@0.7.8 + +## 0.4.6 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-events-node@0.2.12 + ## 0.4.6-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 9dc7133dd8..93e85e3db5 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.4.6-next.3", + "version": "0.4.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 58bda32fee..50c1ea8496 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.20-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.5.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.5.18-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 01fb70fbce..61eee3a731 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.18-next.3", + "version": "0.5.20-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts index 811f451b26..d4f19d0522 100644 --- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts @@ -225,7 +225,10 @@ export class LdapOrgEntityProvider implements EntityProvider { try { await this.read({ logger }); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index e0af84a0cb..44924c65f1 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.12-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.5.10 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.5.10-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index ba2a1687cc..1fe61cd6b2 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.5.10-next.3", + "version": "0.5.12-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts index 3ef02344eb..160696e2e7 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts @@ -352,7 +352,10 @@ export class MicrosoftGraphOrgEntityProvider implements EntityProvider { try { await this.read({ logger }); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 7e28fce0b3..3f7801bd3f 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.19-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 7105fab0b1..cbbf6c8492 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.19-next.3", + "version": "0.1.22-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index 79454f29e2..cd71bdec72 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.10-next.0 + +### Patch Changes + +- 890e3b5ad4: Make sure to include the error message when ingestion fails +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.1.8 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.8-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index ea33d2737d..f54129bbcc 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", - "version": "0.1.8-next.3", + "version": "0.1.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts index a5286a9d70..0055e95589 100644 --- a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts +++ b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts @@ -148,7 +148,10 @@ export class PuppetDbEntityProvider implements EntityProvider { try { await this.refresh(logger); } catch (error) { - logger.error(`${this.getProviderName()} refresh failed`, error); + logger.error( + `${this.getProviderName()} refresh failed, ${error}`, + error, + ); } }, }); diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index 2c90f3caa7..bb3bbb898d 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-scaffolder-common@1.4.1 + +## 0.1.0 + +### Minor Changes + +- d5313ede3529: Added a dedicated module to collect the `ScaffolderEntitiesProcessor` and `catalogModuleTemplateKind`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index 71dc6fd136..cb8cbc16b5 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", - "version": "0.1.0-next.0", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index ee8e415944..2e15a14bfc 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + +## 0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/catalog-model@1.4.2 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index e4945b55b2..43e49e793d 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", "description": "Backstage Catalog module to view unprocessed entities", - "version": "0.3.0-next.3", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 1bb1c6abac..305b7bd1d1 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,93 @@ # @backstage/plugin-catalog-backend +## 1.14.0-next.0 + +### Minor Changes + +- 78af9433c8: Instrumenting some missing metrics with `OpenTelemetry` + +### Patch Changes + +- 348e8c1cdb: Fixes a bug where eagerly deleted entities did not properly trigger re-stitching of entities that they had relations to. +- b97e9790f0: Internal refactors, laying the foundation for later introducing deferred stitching (see #18062). +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 1.13.0 + +### Minor Changes + +- 62f448edb0b5: Allow configuring the processing interval in your app-config, under the `catalog.processingInterval` key. +- 09cfc3cf467d: set azure annotation `dev.azure.com/project-repo` in `AnnotateScmSlugEntityProcessor` to find the project and repo information for the repos that contains `dev.azure.com` in the url + +### Patch Changes + +- 149361e81622: Fix to the `limit` parameter on entity queries. +- 1fd2109739c1: Changed the processing loop task pipeline implementation from recursive to iterative +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 0f8a97777489: Update OpenAPI schema to relax the encoding validation of all request parameters. +- 0198aa596fd9: Fixed a link to the frontend Backstage plugin that had pointed to itself. +- 2d32d8a611e3: Fixed validation of the `fullTextFilterFields` query parameter. +- acffa17027b6: Added some examples to the catalog OpenAPI definition +- 45947d3b2759: Fixes an issue where `order` was not a recognized parameter for the `/entities` endpoint. +- 41d1b2d628ea: Fix OpenAPI schema for the facets endpoint +- 618257f3e413: Fix issue with `catalogFileName` not being a required property for `/analyze-location` +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-events-node@0.2.12 + ## 1.13.0-next.3 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 76ccf49835..7ce5d40385 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.13.0-next.3", + "version": "1.14.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 01025f73dd..2daf8e6fc5 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -42,7 +42,6 @@ import { import { checkLocationKeyConflict } from './operations/refreshState/checkLocationKeyConflict'; import { insertUnprocessedEntity } from './operations/refreshState/insertUnprocessedEntity'; import { updateUnprocessedEntity } from './operations/refreshState/updateUnprocessedEntity'; -import { deleteOrphanedEntities } from './operations/util/deleteOrphanedEntities'; import { generateStableHash } from './util'; import { EventBroker, EventParams } from '@backstage/plugin-events-node'; import { DateTime } from 'luxon'; @@ -275,11 +274,6 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { return { entityRefs }; } - async deleteOrphanedEntities(txOpaque: Transaction): Promise<number> { - const tx = txOpaque as Knex.Transaction; - return await deleteOrphanedEntities({ tx }); - } - async transaction<T>(fn: (tx: Transaction) => Promise<T>): Promise<T> { try { let result: T | undefined = undefined; diff --git a/plugins/catalog-backend/src/database/metrics.ts b/plugins/catalog-backend/src/database/metrics.ts index b6c4e248dc..8eb307ea46 100644 --- a/plugins/catalog-backend/src/database/metrics.ts +++ b/plugins/catalog-backend/src/database/metrics.ts @@ -17,13 +17,17 @@ import { Knex } from 'knex'; import { createGaugeMetric } from '../util/metrics'; import { DbRefreshStateRow, DbRelationsRow, DbLocationsRow } from './tables'; +import { metrics } from '@opentelemetry/api'; +import { parseEntityRef } from '@backstage/catalog-model'; export function initDatabaseMetrics(knex: Knex) { + const seenProm = new Set<string>(); const seen = new Set<string>(); + const meter = metrics.getMeter('default'); return { - entities_count: createGaugeMetric({ + entities_count_prom: createGaugeMetric({ name: 'catalog_entities_count', - help: 'Total amount of entities in the catalog', + help: 'Total amount of entities in the catalog. DEPRECATED: Please use opentelemetry metrics instead.', labelNames: ['kind'], async collect() { const result = await knex<DbRefreshStateRow>('refresh_state').select( @@ -34,22 +38,22 @@ export function initDatabaseMetrics(knex: Knex) { .reduce((acc, e) => acc.set(e, (acc.get(e) || 0) + 1), new Map()); results.forEach((value, key) => { - seen.add(key); + seenProm.add(key); this.set({ kind: key }, value); }); - // Set all the entities that were not seen to 0 and delete them from the seen set. - seen.forEach(key => { + // Set all the entities that were not seenProm to 0 and delete them from the seenProm set. + seenProm.forEach(key => { if (!results.has(key)) { this.set({ kind: key }, 0); - seen.delete(key); + seenProm.delete(key); } }); }, }), - registered_locations: createGaugeMetric({ + registered_locations_prom: createGaugeMetric({ name: 'catalog_registered_locations_count', - help: 'Total amount of registered locations in the catalog', + help: 'Total amount of registered locations in the catalog. DEPRECATED: Please use opentelemetry metrics instead.', async collect() { const total = await knex<DbLocationsRow>('locations').count({ count: '*', @@ -57,9 +61,9 @@ export function initDatabaseMetrics(knex: Knex) { this.set(Number(total[0].count)); }, }), - relations: createGaugeMetric({ + relations_prom: createGaugeMetric({ name: 'catalog_relations_count', - help: 'Total amount of relations between entities', + help: 'Total amount of relations between entities. DEPRECATED: Please use opentelemetry metrics instead.', async collect() { const total = await knex<DbRelationsRow>('relations').count({ count: '*', @@ -67,5 +71,50 @@ export function initDatabaseMetrics(knex: Knex) { this.set(Number(total[0].count)); }, }), + entities_count: meter + .createObservableGauge('catalog_entities_count', { + description: 'Total amount of entities in the catalog', + }) + .addCallback(async gauge => { + const result = await knex<DbRefreshStateRow>('refresh_state').select( + 'entity_ref', + ); + const results = result + .map(row => parseEntityRef(row.entity_ref).kind) + .reduce((acc, e) => acc.set(e, (acc.get(e) || 0) + 1), new Map()); + + results.forEach((value, key) => { + seen.add(key); + gauge.observe(value, { kind: key }); + }); + + // Set all the entities that were not seen to 0 and delete them from the seen set. + seen.forEach(key => { + if (!results.has(key)) { + gauge.observe(0, { kind: key }); + seen.delete(key); + } + }); + }), + registered_locations: meter + .createObservableGauge('catalog_registered_locations_count', { + description: 'Total amount of registered locations in the catalog', + }) + .addCallback(async gauge => { + const total = await knex<DbLocationsRow>('locations').count({ + count: '*', + }); + gauge.observe(Number(total[0].count)); + }), + relations: meter + .createObservableGauge('catalog_relations_count', { + description: 'Total amount of relations between entities', + }) + .addCallback(async gauge => { + const total = await knex<DbRelationsRow>('relations').count({ + count: '*', + }); + gauge.observe(Number(total[0].count)); + }), }; } diff --git a/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts b/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts index dcd87613de..830cc20480 100644 --- a/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts +++ b/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts @@ -18,7 +18,11 @@ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { Knex } from 'knex'; import * as uuid from 'uuid'; import { applyDatabaseMigrations } from '../../migrations'; -import { DbRefreshStateReferencesRow, DbRefreshStateRow } from '../../tables'; +import { + DbRefreshStateReferencesRow, + DbRefreshStateRow, + DbRelationsRow, +} from '../../tables'; import { deleteWithEagerPruningOfChildren } from './deleteWithEagerPruningOfChildren'; jest.setTimeout(60_000); @@ -43,6 +47,22 @@ describe('deleteWithEagerPruningOfChildren', () => { ); } + async function insertRelation( + knex: Knex, + ...relations: { from: string; to: string }[] + ) { + for (const rel of relations) { + await knex<DbRelationsRow>('relations').insert({ + originating_entity_id: await knex<DbRefreshStateRow>('refresh_state') + .select('entity_id') + .then(rows => rows[0].entity_id), // doesn't matter which one, this is consumed pre-deletion + source_entity_ref: rel.from, + target_entity_ref: rel.to, + type: 'fake', + }); + } + } + async function insertEntity(knex: Knex, ...entityRefs: string[]) { for (const ref of entityRefs) { await knex<DbRefreshStateRow>('refresh_state').insert({ @@ -64,6 +84,14 @@ describe('deleteWithEagerPruningOfChildren', () => { return rows.map(r => r.entity_ref); } + async function entitiesMarkedForStitching(knex: Knex) { + const rows = await knex<DbRefreshStateRow>('refresh_state') + .orderBy('entity_ref') + .select('entity_ref') + .where('result_hash', '=', 'force-stitching'); + return rows.map(r => r.entity_ref); + } + it.each(databases.eachSupportedId())( 'works for the simple path, %p', async databaseId => { @@ -78,7 +106,7 @@ describe('deleteWithEagerPruningOfChildren', () => { Scenario: P1 issues delete for E1 and E3 - Result: E1, E2, and E3 deleted; E4 and E5 remain + Result: E1, E2, and E3 deleted; E4 and E5 remain; E4 marked for stitching because it had a relation to a deleted entity */ const knex = await createDatabase(databaseId); await insertEntity(knex, 'E1', 'E2', 'E3', 'E4', 'E5'); @@ -90,12 +118,14 @@ describe('deleteWithEagerPruningOfChildren', () => { { source_key: 'P1', target_entity_ref: 'E4' }, { source_key: 'P2', target_entity_ref: 'E5' }, ); + await insertRelation(knex, { from: 'E4', to: 'E2' }); await deleteWithEagerPruningOfChildren({ knex, sourceKey: 'P1', entityRefs: ['E1', 'E3'], }); await expect(remainingEntities(knex)).resolves.toEqual(['E4', 'E5']); + await expect(entitiesMarkedForStitching(knex)).resolves.toEqual(['E4']); }, ); @@ -113,7 +143,7 @@ describe('deleteWithEagerPruningOfChildren', () => { Scenario: P1 issues delete for E1 - Result: E1 deleted; E2 remains + Result: E1 deleted; E2 remains; E2 marked for stitching because it had a relation to a deleted entity */ const knex = await createDatabase(databaseId); await insertEntity(knex, 'E1', 'E2'); @@ -123,12 +153,14 @@ describe('deleteWithEagerPruningOfChildren', () => { { source_key: 'P1', target_entity_ref: 'E1' }, { source_key: 'P1', target_entity_ref: 'E2' }, ); + await insertRelation(knex, { from: 'E2', to: 'E1' }); await deleteWithEagerPruningOfChildren({ knex, sourceKey: 'P1', entityRefs: ['E1'], }); await expect(remainingEntities(knex)).resolves.toEqual(['E2']); + await expect(entitiesMarkedForStitching(knex)).resolves.toEqual(['E2']); }, ); @@ -144,7 +176,7 @@ describe('deleteWithEagerPruningOfChildren', () => { Scenario: P1 issues delete for E1 - Result: E1 deleted; E2 and E3 remain + Result: E1 deleted; E2 and E3 remain; E2 marked for stitching because it had a relation to a deleted entity */ const knex = await createDatabase(databaseId); await insertEntity(knex, 'E1', 'E2', 'E3'); @@ -155,12 +187,18 @@ describe('deleteWithEagerPruningOfChildren', () => { { source_key: 'P2', target_entity_ref: 'E3' }, { source_entity_ref: 'E3', target_entity_ref: 'E2' }, ); + await insertRelation( + knex, + { from: 'E2', to: 'E1' }, + { from: 'E3', to: 'E2' }, + ); await deleteWithEagerPruningOfChildren({ knex, sourceKey: 'P1', entityRefs: ['E1'], }); await expect(remainingEntities(knex)).resolves.toEqual(['E2', 'E3']); + await expect(entitiesMarkedForStitching(knex)).resolves.toEqual(['E2']); }, ); @@ -193,6 +231,7 @@ describe('deleteWithEagerPruningOfChildren', () => { entityRefs: ['E1'], }); await expect(remainingEntities(knex)).resolves.toEqual(['E2', 'E3']); + await expect(entitiesMarkedForStitching(knex)).resolves.toEqual([]); }, ); @@ -208,7 +247,7 @@ describe('deleteWithEagerPruningOfChildren', () => { Scenario: P1 issues delete for E1, then for E3 - Result: Everything deleted, but in two steps + Result: Everything deleted, but in two steps; E4 marked for stitching in the first step because it had a relation to a deleted entity */ const knex = await createDatabase(databaseId); await insertEntity(knex, 'E1', 'E2', 'E3', 'E4', 'E5', 'E6'); @@ -224,6 +263,7 @@ describe('deleteWithEagerPruningOfChildren', () => { { source_entity_ref: 'E3', target_entity_ref: 'E5' }, { source_entity_ref: 'E5', target_entity_ref: 'E6' }, ); + await insertRelation(knex, { from: 'E4', to: 'E2' }); await deleteWithEagerPruningOfChildren({ knex, sourceKey: 'P1', @@ -235,12 +275,14 @@ describe('deleteWithEagerPruningOfChildren', () => { 'E5', 'E6', ]); + await expect(entitiesMarkedForStitching(knex)).resolves.toEqual(['E4']); await deleteWithEagerPruningOfChildren({ knex, sourceKey: 'P1', entityRefs: ['E3'], }); await expect(remainingEntities(knex)).resolves.toEqual([]); + await expect(entitiesMarkedForStitching(knex)).resolves.toEqual([]); }, ); @@ -277,6 +319,7 @@ describe('deleteWithEagerPruningOfChildren', () => { 'E2', 'E4', ]); + await expect(entitiesMarkedForStitching(knex)).resolves.toEqual([]); }, ); }); diff --git a/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.ts b/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.ts index 027860fcc6..70f7d08ed1 100644 --- a/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.ts +++ b/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.ts @@ -16,7 +16,11 @@ import { Knex } from 'knex'; import lodash from 'lodash'; -import { DbRefreshStateReferencesRow } from '../../tables'; +import { + DbFinalEntitiesRow, + DbRefreshStateReferencesRow, + DbRefreshStateRow, +} from '../../tables'; /** * Given a number of entity refs originally created by a given entity provider @@ -36,152 +40,24 @@ export async function deleteWithEagerPruningOfChildren(options: { // limits for the number of permitted bindings on a precompiled statement let removedCount = 0; for (const refs of lodash.chunk(entityRefs, 1000)) { - removedCount += await knex - .delete() - .from('refresh_state') - .whereIn('entity_ref', orphans => - orphans - // First find all nodes that can be reached downwards from the roots - // (deletion targets), including the roots themselves, by traversing - // down the refresh_state_references table. Note that this query - // starts with a condition that source_key = our source key, and - // target_entity_ref is one of the deletion targets. This has two - // effects: it won't match attempts at deleting something that didn't - // originate from us in the first place, and also won't match non-root - // entities (source_key would be null for those). - // - // KeyA - R1 - R2 Legend: - // \ ----------------------------------------- - // R3 Key* Source key - // / R* Entity ref - // KeyA - R4 - R5 lines Individual references; sources to - // / the left and targets to the right - // KeyB --- R6 - // - // The scenario is that KeyA wants to delete R1. - // - // The query starts with the KeyA-R1 reference, and then traverses - // down to also find R2 and R3. It uses union instead of union all, - // because it wants to find the set of unique descendants even if - // the tree has unexpected loops etc. - .withRecursive('descendants', ['entity_ref'], initial => - initial - .select('target_entity_ref') - .from('refresh_state_references') - .where('source_key', '=', sourceKey) - .whereIn('target_entity_ref', refs) - .union(recursive => - recursive - .select('refresh_state_references.target_entity_ref') - .from('descendants') - .join( - 'refresh_state_references', - 'descendants.entity_ref', - 'refresh_state_references.source_entity_ref', - ), - ), - ) - // Then for each descendant, traverse all the way back upwards through - // the refresh_state_references table to get an exhaustive list of all - // references that are part of keeping that particular descendant - // alive. - // - // Continuing the scenario from above, starting from R3, it goes - // upwards to find every pair along every relation line. - // - // Top branch: R2-R3, R1-R2, KeyA-R1 - // Middle branch: R5-R3, R4-R5, KeyA-R4 - // Bottom branch: R6-R5, KeyB-R6 - // - // Note that this all applied to the subject R3. The exact same thing - // will be done starting from each other descendant (R2 and R1). They - // only have one and two references to find, respectively. - // - // This query also uses union instead of union all, to get the set of - // distinct relations even if the tree has unexpected loops etc. - .withRecursive( - 'ancestors', - ['source_key', 'source_entity_ref', 'target_entity_ref', 'subject'], - initial => - initial - .select( - 'refresh_state_references.source_key', - 'refresh_state_references.source_entity_ref', - 'refresh_state_references.target_entity_ref', - 'descendants.entity_ref', - ) - .from('descendants') - .join( - 'refresh_state_references', - 'refresh_state_references.target_entity_ref', - 'descendants.entity_ref', - ) - .union(recursive => - recursive - .select( - 'refresh_state_references.source_key', - 'refresh_state_references.source_entity_ref', - 'refresh_state_references.target_entity_ref', - 'ancestors.subject', - ) - .from('ancestors') - .join( - 'refresh_state_references', - 'refresh_state_references.target_entity_ref', - 'ancestors.source_entity_ref', - ), - ), - ) - // Finally, from that list of ancestor relations per descendant, pick - // out the ones that are roots (have a source_key). Specifically, find - // ones that seem to be be either (1) from another source, or (2) - // aren't part of the deletion targets. Those are markers that tell us - // that the corresponding descendant should be kept alive and NOT - // subject to eager deletion, because there's "something else" (not - // targeted for deletion) that has references down through the tree to - // it. - // - // Continuing the scenario from above, for R3 we have - // - // KeyA-R1, KeyA-R4, KeyB-R6 - // - // This tells us that R3 should be kept alive for two reasons: it's - // referenced by a node that isn't being deleted (R4), and also by - // another source (KeyB). What about R1 and R2? They both have - // - // KeyA-R1 - // - // So those should be deleted, since they are definitely only being - // kept alive by something that's about to be deleted. - // - // Final shape of the tree: - // - // R3 - // / - // KeyA - R4 - R5 - // / - // KeyB --- R6 - .with('retained', ['entity_ref'], notPartOfDeletion => - notPartOfDeletion - .select('subject') - .from('ancestors') - .whereNotNull('ancestors.source_key') - .where(foreignKeyOrRef => - foreignKeyOrRef - .where('ancestors.source_key', '!=', sourceKey) - .orWhereNotIn('ancestors.target_entity_ref', refs), - ), - ) - // Return all descendants minus the retained ones - .select('descendants.entity_ref') - .from('descendants') - .leftOuterJoin( - 'retained', - 'retained.entity_ref', - 'descendants.entity_ref', - ) - .whereNull('retained.entity_ref'), - ); + const { orphanEntityRefs } = + await findDescendantsThatWouldHaveBeenOrphanedByDeletion({ + knex: options.knex, + refs, + sourceKey, + }); + + // Chunk again - these can be many more than the outer chunk size + for (const refsToDelete of lodash.chunk(orphanEntityRefs, 1000)) { + await markEntitiesAffectedByDeletionForStitching({ + knex: options.knex, + entityRefs: refsToDelete, + }); + await knex + .delete() + .from('refresh_state') + .whereIn('entity_ref', refsToDelete); + } // Delete the references that originate only from this entity provider. Note // that there may be more than one entity provider making a "claim" for a @@ -190,7 +66,202 @@ export async function deleteWithEagerPruningOfChildren(options: { .where('source_key', '=', sourceKey) .whereIn('target_entity_ref', refs) .delete(); + + removedCount += orphanEntityRefs.length; } return removedCount; } + +async function findDescendantsThatWouldHaveBeenOrphanedByDeletion(options: { + knex: Knex | Knex.Transaction; + refs: string[]; + sourceKey: string; +}): Promise<{ orphanEntityRefs: string[] }> { + const { knex, refs, sourceKey } = options; + + const orphans: string[] = + // First find all nodes that can be reached downwards from the roots + // (deletion targets), including the roots themselves, by traversing + // down the refresh_state_references table. Note that this query + // starts with a condition that source_key = our source key, and + // target_entity_ref is one of the deletion targets. This has two + // effects: it won't match attempts at deleting something that didn't + // originate from us in the first place, and also won't match non-root + // entities (source_key would be null for those). + // + // KeyA - R1 - R2 Legend: + // \ ----------------------------------------- + // R3 Key* Source key + // / R* Entity ref + // KeyA - R4 - R5 lines Individual references; sources to + // / the left and targets to the right + // KeyB --- R6 + // + // The scenario is that KeyA wants to delete R1. + // + // The query starts with the KeyA-R1 reference, and then traverses + // down to also find R2 and R3. It uses union instead of union all, + // because it wants to find the set of unique descendants even if + // the tree has unexpected loops etc. + await knex + .withRecursive('descendants', ['entity_ref'], initial => + initial + .select('target_entity_ref') + .from('refresh_state_references') + .where('source_key', '=', sourceKey) + .whereIn('target_entity_ref', refs) + .union(recursive => + recursive + .select('refresh_state_references.target_entity_ref') + .from('descendants') + .join( + 'refresh_state_references', + 'descendants.entity_ref', + 'refresh_state_references.source_entity_ref', + ), + ), + ) + // Then for each descendant, traverse all the way back upwards through + // the refresh_state_references table to get an exhaustive list of all + // references that are part of keeping that particular descendant + // alive. + // + // Continuing the scenario from above, starting from R3, it goes + // upwards to find every pair along every relation line. + // + // Top branch: R2-R3, R1-R2, KeyA-R1 + // Middle branch: R5-R3, R4-R5, KeyA-R4 + // Bottom branch: R6-R5, KeyB-R6 + // + // Note that this all applied to the subject R3. The exact same thing + // will be done starting from each other descendant (R2 and R1). They + // only have one and two references to find, respectively. + // + // This query also uses union instead of union all, to get the set of + // distinct relations even if the tree has unexpected loops etc. + .withRecursive( + 'ancestors', + ['source_key', 'source_entity_ref', 'target_entity_ref', 'subject'], + initial => + initial + .select( + 'refresh_state_references.source_key', + 'refresh_state_references.source_entity_ref', + 'refresh_state_references.target_entity_ref', + 'descendants.entity_ref', + ) + .from('descendants') + .join( + 'refresh_state_references', + 'refresh_state_references.target_entity_ref', + 'descendants.entity_ref', + ) + .union(recursive => + recursive + .select( + 'refresh_state_references.source_key', + 'refresh_state_references.source_entity_ref', + 'refresh_state_references.target_entity_ref', + 'ancestors.subject', + ) + .from('ancestors') + .join( + 'refresh_state_references', + 'refresh_state_references.target_entity_ref', + 'ancestors.source_entity_ref', + ), + ), + ) + // Finally, from that list of ancestor relations per descendant, pick + // out the ones that are roots (have a source_key). Specifically, find + // ones that seem to be be either (1) from another source, or (2) + // aren't part of the deletion targets. Those are markers that tell us + // that the corresponding descendant should be kept alive and NOT + // subject to eager deletion, because there's "something else" (not + // targeted for deletion) that has references down through the tree to + // it. + // + // Continuing the scenario from above, for R3 we have + // + // KeyA-R1, KeyA-R4, KeyB-R6 + // + // This tells us that R3 should be kept alive for two reasons: it's + // referenced by a node that isn't being deleted (R4), and also by + // another source (KeyB). What about R1 and R2? They both have + // + // KeyA-R1 + // + // So those should be deleted, since they are definitely only being + // kept alive by something that's about to be deleted. + // + // Final shape of the tree: + // + // R3 + // / + // KeyA - R4 - R5 + // / + // KeyB --- R6 + .with('retained', ['entity_ref'], notPartOfDeletion => + notPartOfDeletion + .select('subject') + .from('ancestors') + .whereNotNull('ancestors.source_key') + .where(foreignKeyOrRef => + foreignKeyOrRef + .where('ancestors.source_key', '!=', sourceKey) + .orWhereNotIn('ancestors.target_entity_ref', refs), + ), + ) + // Return all descendants minus the retained ones + .select('descendants.entity_ref AS entity_ref') + .from('descendants') + .leftOuterJoin( + 'retained', + 'retained.entity_ref', + 'descendants.entity_ref', + ) + .whereNull('retained.entity_ref') + .then(rows => rows.map(row => row.entity_ref)); + + return { orphanEntityRefs: orphans }; +} + +async function markEntitiesAffectedByDeletionForStitching(options: { + knex: Knex | Knex.Transaction; + entityRefs: string[]; +}) { + const { knex, entityRefs } = options; + + // We want to re-stitch anything that has a relation pointing to the + // soon-to-be-deleted entity. In many circumstances we also re-stitch children + // in the refresh_state_references graph because their orphan state might + // change, but not here - this code by its very definition is meant to not + // leave any orphans behind, so we can simplify away that. + const affectedIds = await knex + .select('refresh_state.entity_id AS entity_id') + .from('relations') + .join( + 'refresh_state', + 'relations.source_entity_ref', + 'refresh_state.entity_ref', + ) + .whereIn('relations.target_entity_ref', entityRefs) + .then(rows => rows.map(row => row.entity_id)); + + for (const ids of lodash.chunk(affectedIds, 1000)) { + await knex + .table<DbFinalEntitiesRow>('final_entities') + .update({ + hash: 'force-stitching', + }) + .whereIn('entity_id', ids); + await knex + .table<DbRefreshStateRow>('refresh_state') + .update({ + result_hash: 'force-stitching', + next_update_at: knex.fn.now(), + }) + .whereIn('entity_id', ids); + } +} diff --git a/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts b/plugins/catalog-backend/src/database/operations/stitcher/buildEntitySearch.test.ts similarity index 99% rename from plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts rename to plugins/catalog-backend/src/database/operations/stitcher/buildEntitySearch.test.ts index 384794d230..8bc5ba57a9 100644 --- a/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts +++ b/plugins/catalog-backend/src/database/operations/stitcher/buildEntitySearch.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Entity, DEFAULT_NAMESPACE } from '@backstage/catalog-model'; +import { DEFAULT_NAMESPACE, Entity } from '@backstage/catalog-model'; import { buildEntitySearch, mapToRows, traverse } from './buildEntitySearch'; describe('buildEntitySearch', () => { diff --git a/plugins/catalog-backend/src/stitching/buildEntitySearch.ts b/plugins/catalog-backend/src/database/operations/stitcher/buildEntitySearch.ts similarity index 98% rename from plugins/catalog-backend/src/stitching/buildEntitySearch.ts rename to plugins/catalog-backend/src/database/operations/stitcher/buildEntitySearch.ts index b97083f207..30f2987cb5 100644 --- a/plugins/catalog-backend/src/stitching/buildEntitySearch.ts +++ b/plugins/catalog-backend/src/database/operations/stitcher/buildEntitySearch.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { Entity, DEFAULT_NAMESPACE } from '@backstage/catalog-model'; +import { DEFAULT_NAMESPACE, Entity } from '@backstage/catalog-model'; import { InputError } from '@backstage/errors'; -import { DbSearchRow } from '../database/tables'; +import { DbSearchRow } from '../../tables'; // These are excluded in the generic loop, either because they do not make sense // to index, or because they are special-case always inserted whether they are diff --git a/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.test.ts b/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.test.ts new file mode 100644 index 0000000000..ce44fe15d8 --- /dev/null +++ b/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.test.ts @@ -0,0 +1,260 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TestDatabases } from '@backstage/backend-test-utils'; +import { applyDatabaseMigrations } from '../../migrations'; +import { markForStitching } from './markForStitching'; +import { DbFinalEntitiesRow, DbRefreshStateRow } from '../../tables'; + +jest.setTimeout(60_000); + +describe('markForStitching', () => { + const databases = TestDatabases.create({ + ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + }); + + it.each(databases.eachSupportedId())( + 'marks the right rows in immediate mode %p', + async databaseId => { + const knex = await databases.init(databaseId); + await applyDatabaseMigrations(knex); + + await knex<DbRefreshStateRow>('refresh_state').insert([ + { + entity_id: '1', + entity_ref: 'k:ns/one', + unprocessed_entity: '{}', + processed_entity: '{}', + result_hash: 'old', + errors: '[]', + next_update_at: knex.fn.now(), + last_discovery_at: knex.fn.now(), + }, + { + entity_id: '2', + entity_ref: 'k:ns/two', + unprocessed_entity: '{}', + processed_entity: '{}', + result_hash: 'old', + errors: '[]', + next_update_at: knex.fn.now(), + last_discovery_at: knex.fn.now(), + }, + { + entity_id: '3', + entity_ref: 'k:ns/three', + unprocessed_entity: '{}', + processed_entity: '{}', + result_hash: 'old', + errors: '[]', + next_update_at: knex.fn.now(), + last_discovery_at: knex.fn.now(), + }, + { + entity_id: '4', + entity_ref: 'k:ns/four', + unprocessed_entity: '{}', + processed_entity: '{}', + result_hash: 'old', + errors: '[]', + next_update_at: knex.fn.now(), + last_discovery_at: knex.fn.now(), + }, + ]); + await knex<DbFinalEntitiesRow>('final_entities').insert([ + { + entity_id: '1', + final_entity: '{}', + hash: 'old', + stitch_ticket: 'old', + }, + { + entity_id: '2', + final_entity: '{}', + hash: 'old', + stitch_ticket: 'old', + }, + { + entity_id: '3', + final_entity: '{}', + hash: 'old', + stitch_ticket: 'old', + }, + { + entity_id: '4', + final_entity: '{}', + hash: 'old', + stitch_ticket: 'old', + }, + ]); + + async function result() { + return knex<DbRefreshStateRow>('refresh_state') + .leftJoin( + 'final_entities', + 'final_entities.entity_id', + 'refresh_state.entity_id', + ) + .select({ + entity_id: 'refresh_state.entity_id', + next_update_at: 'refresh_state.next_update_at', + refresh_state_hash: 'refresh_state.result_hash', + final_entities_hash: 'final_entities.hash', + }) + .orderBy('entity_id', 'asc'); + } + + // Ensure that now() isn't evaluating to the same thing + await new Promise(resolve => setTimeout(resolve, 1100)); + + const original = await result(); + + await markForStitching({ + knex, + strategy: { mode: 'immediate' }, + entityRefs: new Set(), + }); + await expect(result()).resolves.toEqual([ + { + entity_id: '1', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + { + entity_id: '2', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + { + entity_id: '3', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + { + entity_id: '4', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + ]); + + await markForStitching({ + knex, + strategy: { mode: 'immediate' }, + entityRefs: new Set(['k:ns/one']), + }); + await expect(result()).resolves.toEqual([ + { + entity_id: '1', + next_update_at: expect.anything(), + refresh_state_hash: 'force-stitching', + final_entities_hash: 'force-stitching', + }, + { + entity_id: '2', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + { + entity_id: '3', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + { + entity_id: '4', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + ]); + + await markForStitching({ + knex, + strategy: { mode: 'immediate' }, + entityRefs: ['k:ns/two'], + }); + await expect(result()).resolves.toEqual([ + { + entity_id: '1', + next_update_at: expect.anything(), + refresh_state_hash: 'force-stitching', + final_entities_hash: 'force-stitching', + }, + { + entity_id: '2', + next_update_at: expect.anything(), + refresh_state_hash: 'force-stitching', + final_entities_hash: 'force-stitching', + }, + { + entity_id: '3', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + { + entity_id: '4', + next_update_at: expect.anything(), + refresh_state_hash: 'old', + final_entities_hash: 'old', + }, + ]); + + await markForStitching({ + knex, + strategy: { mode: 'immediate' }, + entityIds: ['3', '4'], + }); + await expect(result()).resolves.toEqual([ + { + entity_id: '1', + next_update_at: expect.anything(), + refresh_state_hash: 'force-stitching', + final_entities_hash: 'force-stitching', + }, + { + entity_id: '2', + next_update_at: expect.anything(), + refresh_state_hash: 'force-stitching', + final_entities_hash: 'force-stitching', + }, + { + entity_id: '3', + next_update_at: expect.anything(), + refresh_state_hash: 'force-stitching', + final_entities_hash: 'force-stitching', + }, + { + entity_id: '4', + next_update_at: expect.anything(), + refresh_state_hash: 'force-stitching', + final_entities_hash: 'force-stitching', + }, + ]); + + // It overwrites timers + const final = await result(); + for (let i = 0; i < final.length; ++i) { + expect(original[i].next_update_at).not.toEqual(final[i].next_update_at); + } + }, + ); +}); diff --git a/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.ts b/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.ts new file mode 100644 index 0000000000..7ab9bda1c0 --- /dev/null +++ b/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.ts @@ -0,0 +1,82 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Knex } from 'knex'; +import splitToChunks from 'lodash/chunk'; +import { StitchingStrategy } from '../../../stitching/types'; +import { DbFinalEntitiesRow, DbRefreshStateRow } from '../../tables'; + +/** + * Marks a number of entities for deferred stitching some time in the near + * future. + * + * @remarks + */ +export async function markForStitching(options: { + knex: Knex | Knex.Transaction; + strategy: StitchingStrategy; + entityRefs?: Iterable<string>; + entityIds?: Iterable<string>; +}): Promise<void> { + // Splitting to chunks just to cover pathological cases that upset the db + const entityRefs = split(options.entityRefs); + const entityIds = split(options.entityIds); + const knex = options.knex; + + for (const chunk of entityRefs) { + await knex + .table<DbFinalEntitiesRow>('final_entities') + .update({ + hash: 'force-stitching', + }) + .whereIn( + 'entity_id', + knex<DbRefreshStateRow>('refresh_state') + .select('entity_id') + .whereIn('entity_ref', chunk), + ); + await knex + .table<DbRefreshStateRow>('refresh_state') + .update({ + result_hash: 'force-stitching', + next_update_at: knex.fn.now(), + }) + .whereIn('entity_ref', chunk); + } + + for (const chunk of entityIds) { + await knex + .table<DbFinalEntitiesRow>('final_entities') + .update({ + hash: 'force-stitching', + }) + .whereIn('entity_id', chunk); + await knex + .table<DbRefreshStateRow>('refresh_state') + .update({ + result_hash: 'force-stitching', + next_update_at: knex.fn.now(), + }) + .whereIn('entity_id', chunk); + } +} + +function split(input: Iterable<string> | undefined): string[][] { + if (!input) { + return []; + } + return splitToChunks(Array.isArray(input) ? input : [...input], 200); +} diff --git a/plugins/catalog-backend/src/database/operations/stitcher/performStitching.test.ts b/plugins/catalog-backend/src/database/operations/stitcher/performStitching.test.ts new file mode 100644 index 0000000000..a864cbdef4 --- /dev/null +++ b/plugins/catalog-backend/src/database/operations/stitcher/performStitching.test.ts @@ -0,0 +1,287 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import { TestDatabases } from '@backstage/backend-test-utils'; +import { Entity } from '@backstage/catalog-model'; +import { applyDatabaseMigrations } from '../../migrations'; +import { + DbFinalEntitiesRow, + DbRefreshStateReferencesRow, + DbRefreshStateRow, + DbRelationsRow, + DbSearchRow, +} from '../../tables'; +import { performStitching } from './performStitching'; + +jest.setTimeout(60_000); + +describe('performStitching', () => { + const databases = TestDatabases.create({ + ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + }); + const logger = getVoidLogger(); + + it.each(databases.eachSupportedId())( + 'runs the happy path in immediate mode for %p', + async databaseId => { + const knex = await databases.init(databaseId); + await applyDatabaseMigrations(knex); + + let entities: DbFinalEntitiesRow[]; + let entity: Entity; + + await knex<DbRefreshStateRow>('refresh_state').insert([ + { + entity_id: 'my-id', + entity_ref: 'k:ns/n', + unprocessed_entity: JSON.stringify({}), + processed_entity: JSON.stringify({ + apiVersion: 'a', + kind: 'k', + metadata: { + name: 'n', + namespace: 'ns', + }, + spec: { + k: 'v', + }, + }), + errors: '[]', + next_update_at: knex.fn.now(), + last_discovery_at: knex.fn.now(), + }, + ]); + await knex<DbRefreshStateReferencesRow>( + 'refresh_state_references', + ).insert([{ source_key: 'a', target_entity_ref: 'k:ns/n' }]); + await knex<DbRelationsRow>('relations').insert([ + { + originating_entity_id: 'my-id', + source_entity_ref: 'k:ns/n', + type: 'looksAt', + target_entity_ref: 'k:ns/other', + }, + // handles and ignores duplicates + { + originating_entity_id: 'my-id', + source_entity_ref: 'k:ns/n', + type: 'looksAt', + target_entity_ref: 'k:ns/other', + }, + ]); + + await performStitching({ + knex, + logger, + strategy: { mode: 'immediate' }, + entityRef: 'k:ns/n', + }); + + entities = await knex<DbFinalEntitiesRow>('final_entities'); + + expect(entities.length).toBe(1); + entity = JSON.parse(entities[0].final_entity!); + expect(entity).toEqual({ + relations: [ + { + type: 'looksAt', + targetRef: 'k:ns/other', + }, + ], + apiVersion: 'a', + kind: 'k', + metadata: { + name: 'n', + namespace: 'ns', + etag: expect.any(String), + uid: 'my-id', + }, + spec: { + k: 'v', + }, + }); + + expect(entity.metadata.etag).toEqual(entities[0].hash); + const last_updated_at = entities[0].last_updated_at; + expect(last_updated_at).not.toBeNull(); + const firstHash = entities[0].hash; + + const search = await knex<DbSearchRow>('search'); + expect(search).toEqual( + expect.arrayContaining([ + { + entity_id: 'my-id', + key: 'relations.looksat', + original_value: 'k:ns/other', + value: 'k:ns/other', + }, + { + entity_id: 'my-id', + key: 'apiversion', + original_value: 'a', + value: 'a', + }, + { + entity_id: 'my-id', + key: 'kind', + original_value: 'k', + value: 'k', + }, + { + entity_id: 'my-id', + key: 'metadata.name', + original_value: 'n', + value: 'n', + }, + { + entity_id: 'my-id', + key: 'metadata.namespace', + original_value: 'ns', + value: 'ns', + }, + { + entity_id: 'my-id', + key: 'metadata.uid', + original_value: 'my-id', + value: 'my-id', + }, + { + entity_id: 'my-id', + key: 'spec.k', + original_value: 'v', + value: 'v', + }, + ]), + ); + + // Re-stitch without any changes + await performStitching({ + knex, + logger, + strategy: { mode: 'immediate' }, + entityRef: 'k:ns/n', + }); + + entities = await knex<DbFinalEntitiesRow>('final_entities'); + expect(entities.length).toBe(1); + entity = JSON.parse(entities[0].final_entity!); + expect(entities[0].hash).toEqual(firstHash); + expect(entity.metadata.etag).toEqual(firstHash); + + // Now add one more relation and re-stitch + await knex<DbRelationsRow>('relations').insert([ + { + originating_entity_id: 'my-id', + source_entity_ref: 'k:ns/n', + type: 'looksAt', + target_entity_ref: 'k:ns/third', + }, + ]); + + await performStitching({ + knex, + logger, + strategy: { mode: 'immediate' }, + entityRef: 'k:ns/n', + }); + + entities = await knex<DbFinalEntitiesRow>('final_entities'); + + expect(entities.length).toBe(1); + entity = JSON.parse(entities[0].final_entity!); + expect(entity).toEqual({ + relations: expect.arrayContaining([ + { + type: 'looksAt', + targetRef: 'k:ns/other', + }, + { + type: 'looksAt', + targetRef: 'k:ns/third', + }, + ]), + apiVersion: 'a', + kind: 'k', + metadata: { + name: 'n', + namespace: 'ns', + etag: expect.any(String), + uid: 'my-id', + }, + spec: { + k: 'v', + }, + }); + + expect(entities[0].hash).not.toEqual(firstHash); + expect(entities[0].hash).toEqual(entity.metadata.etag); + + expect(await knex<DbSearchRow>('search')).toEqual( + expect.arrayContaining([ + { + entity_id: 'my-id', + key: 'relations.looksat', + original_value: 'k:ns/other', + value: 'k:ns/other', + }, + { + entity_id: 'my-id', + key: 'relations.looksat', + original_value: 'k:ns/third', + value: 'k:ns/third', + }, + { + entity_id: 'my-id', + key: 'apiversion', + original_value: 'a', + value: 'a', + }, + { + entity_id: 'my-id', + key: 'kind', + original_value: 'k', + value: 'k', + }, + { + entity_id: 'my-id', + key: 'metadata.name', + original_value: 'n', + value: 'n', + }, + { + entity_id: 'my-id', + key: 'metadata.namespace', + original_value: 'ns', + value: 'ns', + }, + { + entity_id: 'my-id', + key: 'metadata.uid', + original_value: 'my-id', + value: 'my-id', + }, + { + entity_id: 'my-id', + key: 'spec.k', + original_value: 'v', + value: 'v', + }, + ]), + ); + }, + ); +}); diff --git a/plugins/catalog-backend/src/database/operations/stitcher/performStitching.ts b/plugins/catalog-backend/src/database/operations/stitcher/performStitching.ts new file mode 100644 index 0000000000..bcb112690c --- /dev/null +++ b/plugins/catalog-backend/src/database/operations/stitcher/performStitching.ts @@ -0,0 +1,236 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ENTITY_STATUS_CATALOG_PROCESSING_TYPE } from '@backstage/catalog-client'; +import { + ANNOTATION_EDIT_URL, + ANNOTATION_VIEW_URL, + EntityRelation, +} from '@backstage/catalog-model'; +import { AlphaEntity, EntityStatusItem } from '@backstage/catalog-model/alpha'; +import { SerializedError } from '@backstage/errors'; +import { Knex } from 'knex'; +import { v4 as uuid } from 'uuid'; +import { Logger } from 'winston'; +import { StitchingStrategy } from '../../../stitching/types'; +import { + DbFinalEntitiesRow, + DbRefreshStateRow, + DbSearchRow, +} from '../../tables'; +import { buildEntitySearch } from './buildEntitySearch'; +import { BATCH_SIZE, generateStableHash } from './util'; + +// See https://github.com/facebook/react/blob/f0cf832e1d0c8544c36aa8b310960885a11a847c/packages/react-dom-bindings/src/shared/sanitizeURL.js +const scriptProtocolPattern = + // eslint-disable-next-line no-control-regex + /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; + +/** + * Performs the act of stitching - to take all of the various outputs from the + * ingestion process, and stitching them together into the final entity JSON + * shape. + */ +export async function performStitching(options: { + knex: Knex | Knex.Transaction; + logger: Logger; + strategy: StitchingStrategy; + entityRef: string; + stitchTicket?: string; +}): Promise<'changed' | 'unchanged' | 'abandoned'> { + const { knex, logger, entityRef } = options; + const stitchTicket = options.stitchTicket ?? uuid(); + + const entityResult = await knex<DbRefreshStateRow>('refresh_state') + .where({ entity_ref: entityRef }) + .limit(1) + .select('entity_id'); + if (!entityResult.length) { + // Entity does no exist in refresh state table, no stitching required. + return 'abandoned'; + } + + // Insert stitching ticket that will be compared before inserting the final entity. + await knex<DbFinalEntitiesRow>('final_entities') + .insert({ + entity_id: entityResult[0].entity_id, + hash: '', + stitch_ticket: stitchTicket, + }) + .onConflict('entity_id') + .merge(['stitch_ticket']); + + // Selecting from refresh_state and final_entities should yield exactly + // one row (except in abnormal cases where the stitch was invoked for + // something that didn't exist at all, in which case it's zero rows). + // The join with the temporary incoming_references still gives one row. + const [processedResult, relationsResult] = await Promise.all([ + knex + .with('incoming_references', function incomingReferences(builder) { + return builder + .from('refresh_state_references') + .where({ target_entity_ref: entityRef }) + .count({ count: '*' }); + }) + .select({ + entityId: 'refresh_state.entity_id', + processedEntity: 'refresh_state.processed_entity', + errors: 'refresh_state.errors', + incomingReferenceCount: 'incoming_references.count', + previousHash: 'final_entities.hash', + }) + .from('refresh_state') + .where({ 'refresh_state.entity_ref': entityRef }) + .crossJoin(knex.raw('incoming_references')) + .leftOuterJoin('final_entities', { + 'final_entities.entity_id': 'refresh_state.entity_id', + }), + knex + .distinct({ + relationType: 'type', + relationTarget: 'target_entity_ref', + }) + .from('relations') + .where({ source_entity_ref: entityRef }) + .orderBy('relationType', 'asc') + .orderBy('relationTarget', 'asc'), + ]); + + // If there were no rows returned, it would mean that there was no + // matching row even in the refresh_state. This can happen for example + // if we emit a relation to something that hasn't been ingested yet. + // It's safe to ignore this stitch attempt in that case. + if (!processedResult.length) { + logger.debug( + `Unable to stitch ${entityRef}, item does not exist in refresh state table`, + ); + return 'abandoned'; + } + + const { + entityId, + processedEntity, + errors, + incomingReferenceCount, + previousHash, + } = processedResult[0]; + + // If there was no processed entity in place, the target hasn't been + // through the processing steps yet. It's safe to ignore this stitch + // attempt in that case, since another stitch will be triggered when + // that processing has finished. + if (!processedEntity) { + logger.debug( + `Unable to stitch ${entityRef}, the entity has not yet been processed`, + ); + return 'abandoned'; + } + + // Grab the processed entity and stitch all of the relevant data into + // it + const entity = JSON.parse(processedEntity) as AlphaEntity; + const isOrphan = Number(incomingReferenceCount) === 0; + let statusItems: EntityStatusItem[] = []; + + if (isOrphan) { + logger.debug(`${entityRef} is an orphan`); + entity.metadata.annotations = { + ...entity.metadata.annotations, + ['backstage.io/orphan']: 'true', + }; + } + if (errors) { + const parsedErrors = JSON.parse(errors) as SerializedError[]; + if (Array.isArray(parsedErrors) && parsedErrors.length) { + statusItems = parsedErrors.map(e => ({ + type: ENTITY_STATUS_CATALOG_PROCESSING_TYPE, + level: 'error', + message: `${e.name}: ${e.message}`, + error: e, + })); + } + } + // We opt to do this check here as we otherwise can't guarantee that it will be run after all processors + for (const annotation of [ANNOTATION_VIEW_URL, ANNOTATION_EDIT_URL]) { + const value = entity.metadata.annotations?.[annotation]; + if (typeof value === 'string' && scriptProtocolPattern.test(value)) { + entity.metadata.annotations![annotation] = + 'https://backstage.io/annotation-rejected-for-security-reasons'; + } + } + + // TODO: entityRef is lower case and should be uppercase in the final + // result + entity.relations = relationsResult + .filter(row => row.relationType /* exclude null row, if relevant */) + .map<EntityRelation>(row => ({ + type: row.relationType!, + targetRef: row.relationTarget!, + })); + if (statusItems.length) { + entity.status = { + ...entity.status, + items: [...(entity.status?.items ?? []), ...statusItems], + }; + } + + // If the output entity was actually not changed, just abort + const hash = generateStableHash(entity); + if (hash === previousHash) { + logger.debug(`Skipped stitching of ${entityRef}, no changes`); + return 'unchanged'; + } + + entity.metadata.uid = entityId; + if (!entity.metadata.etag) { + // If the original data source did not have its own etag handling, + // use the hash as a good-quality etag + entity.metadata.etag = hash; + } + + // This may throw if the entity is invalid, so we call it before + // the final_entities write, even though we may end up not needing + // to write the search index. + const searchEntries = buildEntitySearch(entityId, entity); + + const amountOfRowsChanged = await knex<DbFinalEntitiesRow>('final_entities') + .update({ + final_entity: JSON.stringify(entity), + hash, + last_updated_at: knex.fn.now(), + }) + .where('entity_id', entityId) + .where('stitch_ticket', stitchTicket) + .onConflict('entity_id') + .merge(['final_entity', 'hash', 'last_updated_at']); + + if (amountOfRowsChanged === 0) { + logger.debug(`Entity ${entityRef} is already stitched, skipping write.`); + return 'abandoned'; + } + + // TODO(freben): Search will probably need a similar safeguard against + // race conditions like the final_entities ticket handling above. + // Otherwise, it can be the case that: + // A writes the entity -> + // B writes the entity -> + // B writes search -> + // A writes search + await knex<DbSearchRow>('search').where({ entity_id: entityId }).delete(); + await knex.batchInsert('search', searchEntries, BATCH_SIZE); + + return 'changed'; +} diff --git a/plugins/catalog-backend/src/stitching/util.ts b/plugins/catalog-backend/src/database/operations/stitcher/util.ts similarity index 100% rename from plugins/catalog-backend/src/stitching/util.ts rename to plugins/catalog-backend/src/database/operations/stitcher/util.ts diff --git a/plugins/catalog-backend/src/database/operations/util/deleteOrphanedEntities.test.ts b/plugins/catalog-backend/src/database/operations/util/deleteOrphanedEntities.test.ts index 243b5db1b9..07ade1c4af 100644 --- a/plugins/catalog-backend/src/database/operations/util/deleteOrphanedEntities.test.ts +++ b/plugins/catalog-backend/src/database/operations/util/deleteOrphanedEntities.test.ts @@ -16,7 +16,7 @@ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { Knex } from 'knex'; -import * as uuid from 'uuid'; +import { StitchingStrategy } from '../../../stitching/types'; import { applyDatabaseMigrations } from '../../migrations'; import { DbFinalEntitiesRow, @@ -39,14 +39,14 @@ describe('deleteOrphanedEntities', () => { return knex; } - async function run(knex: Knex): Promise<number> { + async function run(knex: Knex, strategy: StitchingStrategy): Promise<number> { let result: number; await knex.transaction( async tx => { // We can't return here, as knex swallows the return type in case the // transaction is rolled back: // https://github.com/knex/knex/blob/e37aeaa31c8ef9c1b07d2e4d3ec6607e557d800d/lib/transaction.js#L136 - result = await deleteOrphanedEntities({ tx }); + result = await deleteOrphanedEntities({ knex: tx, strategy }); }, { // If we explicitly trigger a rollback, don't fail. @@ -58,9 +58,8 @@ describe('deleteOrphanedEntities', () => { async function insertEntity(knex: Knex, ...entityRefs: string[]) { for (const ref of entityRefs) { - const entityId = uuid.v4(); await knex<DbRefreshStateRow>('refresh_state').insert({ - entity_id: entityId, + entity_id: `id-${ref}`, entity_ref: ref, unprocessed_entity: '{}', processed_entity: '{}', @@ -70,7 +69,7 @@ describe('deleteOrphanedEntities', () => { result_hash: 'original', }); await knex<DbFinalEntitiesRow>('final_entities').insert({ - entity_id: entityId, + entity_id: `id-${ref}`, hash: 'original', stitch_ticket: '', }); @@ -120,7 +119,7 @@ describe('deleteOrphanedEntities', () => { } it.each(databases.eachSupportedId())( - 'works for some mixed paths, %p', + 'works for some mixed paths in immediate mode, %p', async databaseId => { /* In this graph, edges represent refresh state references, not entity relations: @@ -176,18 +175,31 @@ describe('deleteOrphanedEntities', () => { await insertRelation(knex, 'E1', 'E2'); await insertRelation(knex, 'E2', 'E3'); await insertRelation(knex, 'E10', 'E6'); - await expect(run(knex)).resolves.toEqual(5); + await insertRelation(knex, 'E7', 'E6'); + await expect(run(knex, { mode: 'immediate' })).resolves.toEqual(5); await expect(refreshState(knex)).resolves.toEqual([ { entity_ref: 'E1', result_hash: 'original' }, - { entity_ref: 'E2', result_hash: 'orphan-relation-deleted' }, - { entity_ref: 'E7', result_hash: 'original' }, + { + entity_ref: 'E2', + result_hash: 'force-stitching', + }, + { + entity_ref: 'E7', + result_hash: 'force-stitching', + }, { entity_ref: 'E8', result_hash: 'original' }, { entity_ref: 'E9', result_hash: 'original' }, ]); await expect(finalEntities(knex)).resolves.toEqual([ { entity_ref: 'E1', hash: 'original' }, - { entity_ref: 'E2', hash: 'orphan-relation-deleted' }, - { entity_ref: 'E7', hash: 'original' }, + { + entity_ref: 'E2', + hash: 'force-stitching', + }, + { + entity_ref: 'E7', + hash: 'force-stitching', + }, { entity_ref: 'E8', hash: 'original' }, { entity_ref: 'E9', hash: 'original' }, ]); diff --git a/plugins/catalog-backend/src/database/operations/util/deleteOrphanedEntities.ts b/plugins/catalog-backend/src/database/operations/util/deleteOrphanedEntities.ts index eeab85f59e..5e2e46cf89 100644 --- a/plugins/catalog-backend/src/database/operations/util/deleteOrphanedEntities.ts +++ b/plugins/catalog-backend/src/database/operations/util/deleteOrphanedEntities.ts @@ -16,7 +16,9 @@ import { Knex } from 'knex'; import uniq from 'lodash/uniq'; -import { DbFinalEntitiesRow, DbRefreshStateRow } from '../../tables'; +import { StitchingStrategy } from '../../../stitching/types'; +import { DbRefreshStateRow } from '../../tables'; +import { markForStitching } from '../stitcher/markForStitching'; /** * Finds and deletes all orphaned entities, i.e. entities that do not have any @@ -24,15 +26,16 @@ import { DbFinalEntitiesRow, DbRefreshStateRow } from '../../tables'; * that would otherwise become orphaned. */ export async function deleteOrphanedEntities(options: { - tx: Knex.Transaction | Knex; + knex: Knex.Transaction | Knex; + strategy: StitchingStrategy; }): Promise<number> { - const { tx } = options; + const { knex, strategy } = options; let total = 0; // Limit iterations for sanity for (let i = 0; i < 100; ++i) { - const candidates = await tx + const candidates = await knex .with('orphans', ['entity_id', 'entity_ref'], orphans => orphans .from('refresh_state') @@ -72,26 +75,17 @@ export async function deleteOrphanedEntities(options: { total += orphanIds.length; // Delete the orphans themselves - await tx + await knex .table<DbRefreshStateRow>('refresh_state') .delete() .whereIn('entity_id', orphanIds); - // Mark all of things that the orphans had relations to for processing and - // stitching - await tx - .table<DbFinalEntitiesRow>('final_entities') - .update({ - hash: 'orphan-relation-deleted', - }) - .whereIn('entity_id', orphanRelationIds); - await tx - .table<DbRefreshStateRow>('refresh_state') - .update({ - result_hash: 'orphan-relation-deleted', - next_update_at: tx.fn.now(), - }) - .whereIn('entity_id', orphanRelationIds); + // Mark all of the things that the orphans had relations to for stitching + await markForStitching({ + knex, + strategy, + entityIds: orphanRelationIds, + }); } return total; diff --git a/plugins/catalog-backend/src/database/tables.ts b/plugins/catalog-backend/src/database/tables.ts index e3f3efd1bb..a429dcde8d 100644 --- a/plugins/catalog-backend/src/database/tables.ts +++ b/plugins/catalog-backend/src/database/tables.ts @@ -29,17 +29,88 @@ export type DbLocationsRow = { target: string; }; +/** + * Represents the refresh_state table. + * + * @remarks + * + * Every unique entity ref emitted by a provider or a parent entity becomes a + * row in this table, even before processing has started on it. The actual final + * data, after processing and stitching completes, is instead in the + * final_entities table. + * + * Datetime columns are both string and Date, because different database engines + * return them in different forms on the client side. + */ export type DbRefreshStateRow = { + /** + * The unique ID of the entity. This is different to the entity ref, in that + * it gets regenerated randomly each time a row is added to the table, no + * matter what the original entity data was. + */ entity_id: string; + /** + * The entity string ref (on lowercase kind:namespace/name form) + */ entity_ref: string; + /** + * The JSON of the raw entity, as it was received from the entity provider. + */ unprocessed_entity: string; + /** + * A stable hash of the unprocessed entity, used to detect changed/unchanged + * data for a given entity over time. + */ unprocessed_hash?: string; + /** + * The JSON of the processed entity (if processing has run yet on it). + */ processed_entity?: string; + /** + * A stable hash of the processed entity AND all other emitted things during + * processing, such as relations. + */ result_hash?: string; + /** + * Per-entity cached data on JSON form. This is read and written by processors + * who wish to leverage this feature. + */ cache?: string; + /** + * The next point in time that this entity is due for processing. This + * continuously gets moved forward as items are picked up for processing. + */ next_update_at: string | Date; - last_discovery_at: string | Date; // remove? + /** + * The last time that this entity was emitted by somebody (the entity provider + * or a parent entity). + * + * @remarks + * + * Don't rely on this column more than at most as being loosely informative. + * Its semantics aren't fully settled yet. + */ + last_discovery_at: string | Date; + /** + * A JSON serialized array of errors (if any) encountered during processing. + */ errors?: string; + /** + * A conflict detection/resolution key for the entity. + * + * @remarks + * + * The exact value semantics differs, but may for example be a URL pointing to + * where the entity was sourced from. If a "competing" provider or parent + * entity tries to emit an entity that has the same entity ref but a different + * location key, a conflict is detected (you aren't allowed to "trample" over + * a previously existing entity). + * + * Some providers may choose to emit entities with no location key set at all. + * This is a signal that it's only loosely claimed, and that any other + * competing provider/parent is allowed to overwrite and claim it as theirs + * instead. + */ location_key?: string; }; diff --git a/plugins/catalog-backend/src/database/types.ts b/plugins/catalog-backend/src/database/types.ts index 592d5fe063..56e5f48f14 100644 --- a/plugins/catalog-backend/src/database/types.ts +++ b/plugins/catalog-backend/src/database/types.ts @@ -151,8 +151,6 @@ export interface ProcessingDatabase { txOpaque: Transaction, options: ListParentsOptions, ): Promise<ListParentsResult>; - - deleteOrphanedEntities(txOpaque: Transaction): Promise<number>; } /** diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts index 00235ef601..fba5e387a9 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts @@ -21,7 +21,7 @@ import waitForExpect from 'wait-for-expect'; import { DefaultProcessingDatabase } from '../database/DefaultProcessingDatabase'; import { DefaultCatalogProcessingEngine } from './DefaultCatalogProcessingEngine'; import { CatalogProcessingOrchestrator } from './types'; -import { Stitcher } from '../stitching/Stitcher'; +import { Stitcher } from '../stitching/types'; import { ConfigReader } from '@backstage/config'; describe('DefaultCatalogProcessingEngine', () => { @@ -66,6 +66,7 @@ describe('DefaultCatalogProcessingEngine', () => { config: new ConfigReader({}), logger: getVoidLogger(), processingDatabase: db, + knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, @@ -133,6 +134,7 @@ describe('DefaultCatalogProcessingEngine', () => { config: new ConfigReader({}), logger: getVoidLogger(), processingDatabase: db, + knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, @@ -216,6 +218,7 @@ describe('DefaultCatalogProcessingEngine', () => { config: new ConfigReader({}), logger: getVoidLogger(), processingDatabase: db, + knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, @@ -292,6 +295,7 @@ describe('DefaultCatalogProcessingEngine', () => { config: new ConfigReader({}), logger: getVoidLogger(), processingDatabase: db, + knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, @@ -350,6 +354,7 @@ describe('DefaultCatalogProcessingEngine', () => { config: new ConfigReader({}), logger: getVoidLogger(), processingDatabase: db, + knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, @@ -450,10 +455,10 @@ describe('DefaultCatalogProcessingEngine', () => { await waitForExpect(() => { expect(stitcher.stitch).toHaveBeenCalledTimes(2); }); - expect([...stitcher.stitch.mock.calls[0][0]]).toEqual( + expect([...stitcher.stitch.mock.calls[0][0].entityRefs!]).toEqual( expect.arrayContaining(['k:ns/me', 'k:ns/other1', 'k:ns/other2']), ); - expect([...stitcher.stitch.mock.calls[1][0]]).toEqual( + expect([...stitcher.stitch.mock.calls[1][0].entityRefs!]).toEqual( expect.arrayContaining(['k:ns/me', 'k:ns/other1', 'k:ns/other3']), ); await engine.stop(); @@ -464,6 +469,7 @@ describe('DefaultCatalogProcessingEngine', () => { config: new ConfigReader({}), logger: getVoidLogger(), processingDatabase: db, + knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, @@ -535,7 +541,7 @@ describe('DefaultCatalogProcessingEngine', () => { await waitForExpect(() => { expect(stitcher.stitch).toHaveBeenCalledTimes(1); }); - expect([...stitcher.stitch.mock.calls[0][0]]).toEqual( + expect([...stitcher.stitch.mock.calls[0][0].entityRefs!]).toEqual( expect.arrayContaining(['k:ns/me']), ); await engine.stop(); @@ -546,6 +552,7 @@ describe('DefaultCatalogProcessingEngine', () => { config: new ConfigReader({}), logger: getVoidLogger(), processingDatabase: db, + knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, @@ -622,7 +629,7 @@ describe('DefaultCatalogProcessingEngine', () => { await waitForExpect(() => { expect(stitcher.stitch).toHaveBeenCalledTimes(1); }); - expect([...stitcher.stitch.mock.calls[0][0]]).toEqual( + expect([...stitcher.stitch.mock.calls[0][0].entityRefs!]).toEqual( expect.arrayContaining(['k:ns/me', 'k:ns/other2']), ); await engine.stop(); @@ -633,6 +640,7 @@ describe('DefaultCatalogProcessingEngine', () => { config: new ConfigReader({}), logger: getVoidLogger(), processingDatabase: db, + knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, @@ -699,7 +707,7 @@ describe('DefaultCatalogProcessingEngine', () => { await waitForExpect(() => { expect(stitcher.stitch).toHaveBeenCalledTimes(1); }); - expect([...stitcher.stitch.mock.calls[0][0]]).toEqual( + expect([...stitcher.stitch.mock.calls[0][0].entityRefs!]).toEqual( expect.arrayContaining(['k:ns/me', 'k:ns/other2']), ); await engine.stop(); diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index bed1fe6f50..72f92b9b40 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -22,16 +22,13 @@ import { import { assertError, serializeError, stringifyError } from '@backstage/errors'; import { Hash } from 'crypto'; import stableStringify from 'fast-json-stable-stringify'; +import { Knex } from 'knex'; import { Logger } from 'winston'; import { metrics, trace } from '@opentelemetry/api'; import { ProcessingDatabase, RefreshStateItem } from '../database/types'; import { createCounterMetric, createSummaryMetric } from '../util/metrics'; -import { - CatalogProcessingEngine, - CatalogProcessingOrchestrator, - EntityProcessingResult, -} from './types'; -import { Stitcher } from '../stitching/Stitcher'; +import { CatalogProcessingOrchestrator, EntityProcessingResult } from './types'; +import { Stitcher } from '../stitching/types'; import { startTaskPipeline } from './TaskPipeline'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; @@ -40,6 +37,7 @@ import { TRACER_ID, withActiveSpan, } from '../util/opentelemetry'; +import { deleteOrphanedEntities } from '../database/operations/util/deleteOrphanedEntities'; const CACHE_TTL = 5; @@ -47,10 +45,17 @@ const tracer = trace.getTracer(TRACER_ID); export type ProgressTracker = ReturnType<typeof progressTracker>; -export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { +// NOTE(freben): Perhaps surprisingly, this class does not implement the +// CatalogProcessingEngine type. That type is externally visible and its name is +// the way it is for historic reasons. This class has no particular reason to +// implement that precise interface; nowadays there are several different +// engines "hiding" behind the CatalogProcessingEngine interface, of which this +// is just one. +export class DefaultCatalogProcessingEngine { private readonly config: Config; private readonly scheduler?: PluginTaskScheduler; private readonly logger: Logger; + private readonly knex: Knex; private readonly processingDatabase: ProcessingDatabase; private readonly orchestrator: CatalogProcessingOrchestrator; private readonly stitcher: Stitcher; @@ -69,6 +74,7 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { config: Config; scheduler?: PluginTaskScheduler; logger: Logger; + knex: Knex; processingDatabase: ProcessingDatabase; orchestrator: CatalogProcessingOrchestrator; stitcher: Stitcher; @@ -84,6 +90,7 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { this.config = options.config; this.scheduler = options.scheduler; this.logger = options.logger; + this.knex = options.knex; this.processingDatabase = options.processingDatabase; this.orchestrator = options.orchestrator; this.stitcher = options.stitcher; @@ -255,9 +262,11 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { resultHash, }); }); - await this.stitcher.stitch( - new Set([stringifyEntityRef(unprocessedEntity)]), - ); + + await this.stitcher.stitch({ + entityRefs: [stringifyEntityRef(unprocessedEntity)], + }); + track.markSuccessfulWithErrors(); return; } @@ -305,9 +314,11 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { } }); - await this.stitcher.stitch(setOfThingsToStitch); + await this.stitcher.stitch({ + entityRefs: setOfThingsToStitch, + }); - track.markSuccessfulWithChanges(setOfThingsToStitch.size); + track.markSuccessfulWithChanges(); } catch (error) { assertError(error); track.markFailed(error); @@ -318,20 +329,21 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { } private startOrphanCleanup(): () => void { - const strategy = + const orphanStrategy = this.config.getOptionalString('catalog.orphanStrategy') ?? 'keep'; - if (strategy !== 'delete') { + if (orphanStrategy !== 'delete') { return () => {}; } const runOnce = async () => { try { - await this.processingDatabase.transaction(async tx => { - const n = await this.processingDatabase.deleteOrphanedEntities(tx); - if (n > 0) { - this.logger.info(`Deleted ${n} orphaned entities`); - } + const n = await deleteOrphanedEntities({ + knex: this.knex, + strategy: { mode: 'immediate' }, }); + if (n > 0) { + this.logger.info(`Deleted ${n} orphaned entities`); + } } catch (error) { this.logger.warn(`Failed to delete orphaned entities`, error); } @@ -363,10 +375,6 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { // Helps wrap the timing and logging behaviors function progressTracker() { // prom-client metrics are deprecated in favour of OpenTelemetry metrics. - const promStitchedEntities = createCounterMetric({ - name: 'catalog_stitched_entities_count', - help: 'Amount of entities stitched. DEPRECATED, use OpenTelemetry metrics instead', - }); const promProcessedEntities = createCounterMetric({ name: 'catalog_processed_entities_count', help: 'Amount of entities processed, DEPRECATED, use OpenTelemetry metrics instead', @@ -388,11 +396,6 @@ function progressTracker() { }); const meter = metrics.getMeter('default'); - const stitchedEntities = meter.createCounter( - 'catalog.stitched.entities.count', - { description: 'Amount of entities stitched' }, - ); - const processedEntities = meter.createCounter( 'catalog.processed.entities.count', { description: 'Amount of entities processed' }, @@ -464,13 +467,11 @@ function progressTracker() { processedEntities.add(1, { result: 'errors' }); } - function markSuccessfulWithChanges(stitchedCount: number) { + function markSuccessfulWithChanges() { endOverallTimer({ result: 'changed' }); - promStitchedEntities.inc(stitchedCount); promProcessedEntities.inc({ result: 'changed' }, 1); processingDuration.record(endTime(), { result: 'changed' }); - stitchedEntities.add(stitchedCount); processedEntities.add(1, { result: 'changed' }); } diff --git a/plugins/catalog-backend/src/processing/types.ts b/plugins/catalog-backend/src/processing/types.ts index c0d0e5db0d..002747d4c4 100644 --- a/plugins/catalog-backend/src/processing/types.ts +++ b/plugins/catalog-backend/src/processing/types.ts @@ -64,8 +64,8 @@ export interface CatalogProcessingOrchestrator { } /** - * Represents the engine that drives the processing loops. Some backend - * instances may choose to not call start, if they focus only on API + * Represents the engine that drives the processing and stitching loops. Some + * backend instances may choose to not call start, if they focus only on API * interactions. * * @public diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 531bb91dd2..c12178e888 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -65,7 +65,7 @@ import { DefaultCatalogProcessingEngine } from '../processing/DefaultCatalogProc import { DefaultLocationService } from './DefaultLocationService'; import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog'; import { DefaultCatalogProcessingOrchestrator } from '../processing/DefaultCatalogProcessingOrchestrator'; -import { Stitcher } from '../stitching/Stitcher'; +import { DefaultStitcher } from '../stitching/DefaultStitcher'; import { createRandomProcessingInterval, ProcessingIntervalFunction, @@ -449,6 +449,11 @@ export class CatalogBuilder { await applyDatabaseMigrations(dbClient); } + const stitcher = DefaultStitcher.fromConfig(config, { + knex: dbClient, + logger, + }); + const processingDatabase = new DefaultProcessingDatabase({ database: dbClient, logger, @@ -474,7 +479,6 @@ export class CatalogBuilder { policy, legacySingleProcessorValidation: this.legacySingleProcessorValidation, }); - const stitcher = new Stitcher(dbClient, logger); const unauthorizedEntitiesCatalog = new DefaultEntitiesCatalog({ database: dbClient, logger, @@ -535,6 +539,7 @@ export class CatalogBuilder { config, scheduler, logger, + knex: dbClient, processingDatabase, orchestrator, stitcher, @@ -572,7 +577,16 @@ export class CatalogBuilder { await connectEntityProviders(providerDatabase, entityProviders); return { - processingEngine, + processingEngine: { + async start() { + await processingEngine.start(); + await stitcher.start(); + }, + async stop() { + await processingEngine.stop(); + await stitcher.stop(); + }, + }, router, }; } diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 4f011813e6..fde3408c4b 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -30,10 +30,10 @@ import { DbRefreshStateRow, DbSearchRow, } from '../database/tables'; -import { Stitcher } from '../stitching/Stitcher'; -import { buildEntitySearch } from '../stitching/buildEntitySearch'; +import { Stitcher } from '../stitching/types'; import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog'; import { EntitiesRequest } from '../catalog/types'; +import { buildEntitySearch } from '../database/operations/stitcher/buildEntitySearch'; jest.setTimeout(60_000); @@ -1684,9 +1684,9 @@ describe('DefaultEntitiesCatalog', () => { { entity_ref: 'k:default/unrelated1', result_hash: 'not-changed' }, { entity_ref: 'k:default/unrelated2', result_hash: 'not-changed' }, ]); - expect(stitch).toHaveBeenCalledWith( - new Set(['k:default/unrelated1', 'k:default/unrelated2']), - ); + expect(stitch).toHaveBeenCalledWith({ + entityRefs: new Set(['k:default/unrelated1', 'k:default/unrelated2']), + }); }, ); }); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index c328c83823..24f0432419 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -49,8 +49,7 @@ import { DbRelationsRow, DbSearchRow, } from '../database/tables'; - -import { Stitcher } from '../stitching/Stitcher'; +import { Stitcher } from '../stitching/types'; import { isQueryEntitiesCursorRequest, @@ -606,7 +605,9 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { .where('entity_id', uid) .delete(); - await this.stitcher.stitch(new Set(relationPeers.map(p => p.ref))); + await this.stitcher.stitch({ + entityRefs: new Set(relationPeers.map(p => p.ref)), + }); } async entityAncestry(rootRef: string): Promise<EntityAncestryResponse> { diff --git a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts index 76284ebbfd..5b29bb34d5 100644 --- a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts +++ b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts @@ -31,9 +31,9 @@ import { import { ProcessingDatabase } from '../database/types'; import { DefaultCatalogProcessingEngine } from '../processing/DefaultCatalogProcessingEngine'; import { EntityProcessingRequest } from '../processing/types'; -import { Stitcher } from '../stitching/Stitcher'; import { DefaultRefreshService } from './DefaultRefreshService'; import { ConfigReader } from '@backstage/config'; +import { DefaultStitcher } from '../stitching/DefaultStitcher'; jest.setTimeout(60_000); @@ -109,10 +109,16 @@ describe('DefaultRefreshService', () => { } } + const stitcher = DefaultStitcher.fromConfig(new ConfigReader({}), { + knex, + logger: defaultLogger, + }); const engine = new DefaultCatalogProcessingEngine({ config: new ConfigReader({}), logger: defaultLogger, processingDatabase: db, + knex: knex, + stitcher: stitcher, orchestrator: { async process(request: EntityProcessingRequest) { const entityRef = stringifyEntityRef(request.entity); @@ -151,7 +157,6 @@ describe('DefaultRefreshService', () => { }; }, }, - stitcher: new Stitcher(knex, defaultLogger), createHash: () => createHash('sha1'), pollingIntervalMs: 50, }); diff --git a/plugins/catalog-backend/src/stitching/Stitcher.test.ts b/plugins/catalog-backend/src/stitching/DefaultStitcher.test.ts similarity index 95% rename from plugins/catalog-backend/src/stitching/Stitcher.test.ts rename to plugins/catalog-backend/src/stitching/DefaultStitcher.test.ts index 1efcb01a3c..5b33fc424c 100644 --- a/plugins/catalog-backend/src/stitching/Stitcher.test.ts +++ b/plugins/catalog-backend/src/stitching/DefaultStitcher.test.ts @@ -25,7 +25,7 @@ import { DbRelationsRow, DbSearchRow, } from '../database/tables'; -import { Stitcher } from './Stitcher'; +import { DefaultStitcher } from './DefaultStitcher'; jest.setTimeout(60_000); @@ -41,7 +41,11 @@ describe('Stitcher', () => { const db = await databases.init(databaseId); await applyDatabaseMigrations(db); - const stitcher = new Stitcher(db, logger); + const stitcher = new DefaultStitcher({ + knex: db, + logger, + strategy: { mode: 'immediate' }, + }); let entities: DbFinalEntitiesRow[]; let entity: Entity; @@ -85,7 +89,7 @@ describe('Stitcher', () => { }, ]); - await stitcher.stitch(new Set(['k:ns/n'])); + await stitcher.stitch({ entityRefs: ['k:ns/n'] }); entities = await db<DbFinalEntitiesRow>('final_entities'); @@ -165,7 +169,7 @@ describe('Stitcher', () => { ); // Re-stitch without any changes - await stitcher.stitch(new Set(['k:ns/n'])); + await stitcher.stitch({ entityRefs: ['k:ns/n'] }); entities = await db<DbFinalEntitiesRow>('final_entities'); expect(entities.length).toBe(1); @@ -183,7 +187,7 @@ describe('Stitcher', () => { }, ]); - await stitcher.stitch(new Set(['k:ns/n'])); + await stitcher.stitch({ entityRefs: ['k:ns/n'] }); entities = await db<DbFinalEntitiesRow>('final_entities'); diff --git a/plugins/catalog-backend/src/stitching/DefaultStitcher.ts b/plugins/catalog-backend/src/stitching/DefaultStitcher.ts new file mode 100644 index 0000000000..095d80ad83 --- /dev/null +++ b/plugins/catalog-backend/src/stitching/DefaultStitcher.ts @@ -0,0 +1,124 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Config } from '@backstage/config'; +import { Knex } from 'knex'; +import splitToChunks from 'lodash/chunk'; +import { DateTime } from 'luxon'; +import { Logger } from 'winston'; +import { performStitching } from '../database/operations/stitcher/performStitching'; +import { DbRefreshStateRow } from '../database/tables'; +import { progressTracker } from './progressTracker'; +import { Stitcher, StitchingStrategy } from './types'; + +type StitchProgressTracker = ReturnType<typeof progressTracker>; + +/** + * Performs the act of stitching - to take all of the various outputs from the + * ingestion process, and stitching them together into the final entity JSON + * shape. + */ +export class DefaultStitcher implements Stitcher { + private readonly knex: Knex; + private readonly logger: Logger; + private readonly strategy: StitchingStrategy; + private readonly tracker: StitchProgressTracker; + + static fromConfig( + _config: Config, + options: { + knex: Knex; + logger: Logger; + }, + ): DefaultStitcher { + return new DefaultStitcher({ + knex: options.knex, + logger: options.logger, + strategy: { mode: 'immediate' }, + }); + } + + constructor(options: { + knex: Knex; + logger: Logger; + strategy: StitchingStrategy; + }) { + this.knex = options.knex; + this.logger = options.logger; + this.strategy = options.strategy; + this.tracker = progressTracker(options.knex, options.logger); + } + + async stitch(options: { + entityRefs?: Iterable<string>; + entityIds?: Iterable<string>; + }) { + const { entityRefs, entityIds } = options; + + if (entityRefs) { + for (const entityRef of entityRefs) { + await this.#stitchOne({ entityRef }); + } + } + + if (entityIds) { + const chunks = splitToChunks( + Array.isArray(entityIds) ? entityIds : [...entityIds], + 100, + ); + for (const chunk of chunks) { + const rows = await this.knex<DbRefreshStateRow>('refresh_state') + .select('entity_ref') + .whereIn('entity_id', chunk); + for (const row of rows) { + await this.#stitchOne({ entityRef: row.entity_ref }); + } + } + } + } + + async start() { + // Only called immediately for now + } + + async stop() { + // Only called immediately for now + } + + async #stitchOne(options: { + entityRef: string; + stitchTicket?: string; + stitchRequestedAt?: DateTime; + }) { + const track = this.tracker.stitchStart({ + entityRef: options.entityRef, + stitchRequestedAt: options.stitchRequestedAt, + }); + + try { + const result = await performStitching({ + knex: this.knex, + logger: this.logger, + strategy: this.strategy, + entityRef: options.entityRef, + stitchTicket: options.stitchTicket, + }); + track.markComplete(result); + } catch (error) { + track.markFailed(error); + } + } +} diff --git a/plugins/catalog-backend/src/stitching/Stitcher.ts b/plugins/catalog-backend/src/stitching/Stitcher.ts deleted file mode 100644 index 38d0fd263f..0000000000 --- a/plugins/catalog-backend/src/stitching/Stitcher.ts +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ENTITY_STATUS_CATALOG_PROCESSING_TYPE } from '@backstage/catalog-client'; -import { AlphaEntity, EntityStatusItem } from '@backstage/catalog-model/alpha'; -import { - ANNOTATION_EDIT_URL, - ANNOTATION_VIEW_URL, - EntityRelation, -} from '@backstage/catalog-model'; -import { SerializedError, stringifyError } from '@backstage/errors'; -import { Knex } from 'knex'; -import { v4 as uuid } from 'uuid'; -import { Logger } from 'winston'; -import { - DbFinalEntitiesRow, - DbRefreshStateRow, - DbSearchRow, -} from '../database/tables'; -import { buildEntitySearch } from './buildEntitySearch'; -import { BATCH_SIZE, generateStableHash } from './util'; - -// See https://github.com/facebook/react/blob/f0cf832e1d0c8544c36aa8b310960885a11a847c/packages/react-dom-bindings/src/shared/sanitizeURL.js -const scriptProtocolPattern = - // eslint-disable-next-line no-control-regex - /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; - -/** - * Performs the act of stitching - to take all of the various outputs from the - * ingestion process, and stitching them together into the final entity JSON - * shape. - */ -export class Stitcher { - constructor( - private readonly database: Knex, - private readonly logger: Logger, - ) {} - - async stitch(entityRefs: Set<string>) { - for (const entityRef of entityRefs) { - try { - await this.stitchOne(entityRef); - } catch (error) { - this.logger.error( - `Failed to stitch ${entityRef}, ${stringifyError(error)}`, - ); - } - } - } - - private async stitchOne(entityRef: string): Promise<void> { - const entityResult = await this.database<DbRefreshStateRow>('refresh_state') - .where({ entity_ref: entityRef }) - .limit(1) - .select('entity_id'); - if (!entityResult.length) { - // Entity does no exist in refresh state table, no stitching required. - return; - } - - // Insert stitching ticket that will be compared before inserting the final entity. - const ticket = uuid(); - await this.database<DbFinalEntitiesRow>('final_entities') - .insert({ - entity_id: entityResult[0].entity_id, - hash: '', - stitch_ticket: ticket, - }) - .onConflict('entity_id') - .merge(['stitch_ticket']); - - // Selecting from refresh_state and final_entities should yield exactly - // one row (except in abnormal cases where the stitch was invoked for - // something that didn't exist at all, in which case it's zero rows). - // The join with the temporary incoming_references still gives one row. - const [processedResult, relationsResult] = await Promise.all([ - this.database - .with('incoming_references', function incomingReferences(builder) { - return builder - .from('refresh_state_references') - .where({ target_entity_ref: entityRef }) - .count({ count: '*' }); - }) - .select({ - entityId: 'refresh_state.entity_id', - processedEntity: 'refresh_state.processed_entity', - errors: 'refresh_state.errors', - incomingReferenceCount: 'incoming_references.count', - previousHash: 'final_entities.hash', - }) - .from('refresh_state') - .where({ 'refresh_state.entity_ref': entityRef }) - .crossJoin(this.database.raw('incoming_references')) - .leftOuterJoin('final_entities', { - 'final_entities.entity_id': 'refresh_state.entity_id', - }), - this.database - .distinct({ - relationType: 'type', - relationTarget: 'target_entity_ref', - }) - .from('relations') - .where({ source_entity_ref: entityRef }) - .orderBy('relationType', 'asc') - .orderBy('relationTarget', 'asc'), - ]); - - // If there were no rows returned, it would mean that there was no - // matching row even in the refresh_state. This can happen for example - // if we emit a relation to something that hasn't been ingested yet. - // It's safe to ignore this stitch attempt in that case. - if (!processedResult.length) { - this.logger.error( - `Unable to stitch ${entityRef}, item does not exist in refresh state table`, - ); - return; - } - - const { - entityId, - processedEntity, - errors, - incomingReferenceCount, - previousHash, - } = processedResult[0]; - - // If there was no processed entity in place, the target hasn't been - // through the processing steps yet. It's safe to ignore this stitch - // attempt in that case, since another stitch will be triggered when - // that processing has finished. - if (!processedEntity) { - this.logger.debug( - `Unable to stitch ${entityRef}, the entity has not yet been processed`, - ); - return; - } - - // Grab the processed entity and stitch all of the relevant data into - // it - const entity = JSON.parse(processedEntity) as AlphaEntity; - const isOrphan = Number(incomingReferenceCount) === 0; - let statusItems: EntityStatusItem[] = []; - - if (isOrphan) { - this.logger.debug(`${entityRef} is an orphan`); - entity.metadata.annotations = { - ...entity.metadata.annotations, - ['backstage.io/orphan']: 'true', - }; - } - if (errors) { - const parsedErrors = JSON.parse(errors) as SerializedError[]; - if (Array.isArray(parsedErrors) && parsedErrors.length) { - statusItems = parsedErrors.map(e => ({ - type: ENTITY_STATUS_CATALOG_PROCESSING_TYPE, - level: 'error', - message: `${e.name}: ${e.message}`, - error: e, - })); - } - } - // We opt to do this check here as we otherwise can't guarantee that it will be run after all processors - for (const annotation of [ANNOTATION_VIEW_URL, ANNOTATION_EDIT_URL]) { - const value = entity.metadata.annotations?.[annotation]; - if (typeof value === 'string' && scriptProtocolPattern.test(value)) { - entity.metadata.annotations![annotation] = - 'https://backstage.io/annotation-rejected-for-security-reasons'; - } - } - - // TODO: entityRef is lower case and should be uppercase in the final - // result - entity.relations = relationsResult - .filter(row => row.relationType /* exclude null row, if relevant */) - .map<EntityRelation>(row => ({ - type: row.relationType!, - targetRef: row.relationTarget!, - })); - if (statusItems.length) { - entity.status = { - ...entity.status, - items: [...(entity.status?.items ?? []), ...statusItems], - }; - } - - // If the output entity was actually not changed, just abort - const hash = generateStableHash(entity); - if (hash === previousHash) { - this.logger.debug(`Skipped stitching of ${entityRef}, no changes`); - return; - } - - entity.metadata.uid = entityId; - if (!entity.metadata.etag) { - // If the original data source did not have its own etag handling, - // use the hash as a good-quality etag - entity.metadata.etag = hash; - } - - // This may throw if the entity is invalid, so we call it before - // the final_entities write, even though we may end up not needing - // to write the search index. - const searchEntries = buildEntitySearch(entityId, entity); - - const amountOfRowsChanged = await this.database<DbFinalEntitiesRow>( - 'final_entities', - ) - .update({ - final_entity: JSON.stringify(entity), - hash, - last_updated_at: this.database.fn.now(), - }) - .where('entity_id', entityId) - .where('stitch_ticket', ticket) - .onConflict('entity_id') - .merge(['final_entity', 'hash', 'last_updated_at']); - - if (amountOfRowsChanged === 0) { - this.logger.debug( - `Entity ${entityRef} is already processed, skipping write.`, - ); - return; - } - - // TODO(freben): Search will probably need a similar safeguard against - // race conditions like the final_entities ticket handling above. - // Otherwise, it can be the case that: - // A writes the entity -> - // B writes the entity -> - // B writes search -> - // A writes search - await this.database<DbSearchRow>('search') - .where({ entity_id: entityId }) - .delete(); - await this.database.batchInsert('search', searchEntries, BATCH_SIZE); - } -} diff --git a/plugins/catalog-backend/src/stitching/progressTracker.ts b/plugins/catalog-backend/src/stitching/progressTracker.ts new file mode 100644 index 0000000000..e8e08dbc54 --- /dev/null +++ b/plugins/catalog-backend/src/stitching/progressTracker.ts @@ -0,0 +1,84 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { stringifyError } from '@backstage/errors'; +import { metrics } from '@opentelemetry/api'; +import { Knex } from 'knex'; +import { DateTime } from 'luxon'; +import { Logger } from 'winston'; +import { createCounterMetric } from '../util/metrics'; + +// Helps wrap the timing and logging behaviors +export function progressTracker(_knex: Knex, logger: Logger) { + // prom-client metrics are deprecated in favour of OpenTelemetry metrics. + const promStitchedEntities = createCounterMetric({ + name: 'catalog_stitched_entities_count', + help: 'Amount of entities stitched. DEPRECATED, use OpenTelemetry metrics instead', + }); + + const meter = metrics.getMeter('default'); + + const stitchedEntities = meter.createCounter( + 'catalog.stitched.entities.count', + { + description: 'Amount of entities stitched', + }, + ); + + const stitchingDuration = meter.createHistogram( + 'catalog.stitching.duration', + { + description: 'Time spent executing the full stitching flow', + unit: 'seconds', + }, + ); + + function stitchStart(item: { + entityRef: string; + stitchRequestedAt?: DateTime; + }) { + logger.debug(`Stitching ${item.entityRef}`); + + const startTime = process.hrtime(); + + function endTime() { + const delta = process.hrtime(startTime); + return delta[0] + delta[1] / 1e9; + } + + function markComplete(result: string) { + promStitchedEntities.inc(1); + stitchedEntities.add(1, { result }); + stitchingDuration.record(endTime(), { result }); + } + + function markFailed(error: Error) { + promStitchedEntities.inc(1); + stitchedEntities.add(1, { result: 'error' }); + stitchingDuration.record(endTime(), { result: 'error' }); + logger.error( + `Failed to stitch ${item.entityRef}, ${stringifyError(error)}`, + ); + } + + return { + markComplete, + markFailed, + }; + } + + return { stitchStart }; +} diff --git a/plugins/catalog-backend/src/stitching/types.ts b/plugins/catalog-backend/src/stitching/types.ts new file mode 100644 index 0000000000..5f32a85b1f --- /dev/null +++ b/plugins/catalog-backend/src/stitching/types.ts @@ -0,0 +1,40 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Performs the act of stitching - to take all of the various outputs from the + * ingestion process, and stitching them together into the final entity JSON + * shape. + */ +export interface Stitcher { + stitch(options: { + entityRefs?: Iterable<string>; + entityIds?: Iterable<string>; + }): Promise<void>; +} + +/** + * The strategies supported by the stitching process, in terms of when to + * perform stitching. + * + * @remarks + * + * In immediate mode, stitching happens "in-band" (blocking) immediately when + * each processing task finishes. + */ +export type StitchingStrategy = { + mode: 'immediate'; +}; diff --git a/plugins/catalog-backend/src/tests/integration.test.ts b/plugins/catalog-backend/src/tests/integration.test.ts index e7f983f51f..8aeb95f49b 100644 --- a/plugins/catalog-backend/src/tests/integration.test.ts +++ b/plugins/catalog-backend/src/tests/integration.test.ts @@ -53,7 +53,7 @@ import { CatalogProcessingEngine } from '../processing/types'; import { DefaultEntitiesCatalog } from '../service/DefaultEntitiesCatalog'; import { DefaultRefreshService } from '../service/DefaultRefreshService'; import { RefreshOptions, RefreshService } from '../service/types'; -import { Stitcher } from '../stitching/Stitcher'; +import { DefaultStitcher } from '../stitching/DefaultStitcher'; const voidLogger = getVoidLogger(); @@ -268,7 +268,7 @@ class TestHarness { policy: EntityPolicies.allOf([]), legacySingleProcessorValidation: false, }); - const stitcher = new Stitcher(db, logger); + const stitcher = DefaultStitcher.fromConfig(config, { knex: db, logger }); const catalog = new DefaultEntitiesCatalog({ database: db, logger, @@ -282,6 +282,7 @@ class TestHarness { config: new ConfigReader({}), logger, processingDatabase, + knex: db, orchestrator, stitcher, createHash: () => createHash('sha1'), @@ -300,7 +301,16 @@ class TestHarness { return new TestHarness( catalog, - engine, + { + async start() { + await engine.start(); + await stitcher.start(); + }, + async stop() { + await engine.stop(); + await stitcher.stop(); + }, + }, refresh, provider, proxyProgressTracker, diff --git a/plugins/catalog-backend/src/tests/performance/stitchingPerformance.test.ts b/plugins/catalog-backend/src/tests/performance/stitchingPerformance.test.ts index e60c0a33d6..c1a869f9ad 100644 --- a/plugins/catalog-backend/src/tests/performance/stitchingPerformance.test.ts +++ b/plugins/catalog-backend/src/tests/performance/stitchingPerformance.test.ts @@ -181,6 +181,7 @@ describePerformanceTest('stitchingPerformance', () => { const backend = await startTestBackend({ features: [ import('@backstage/plugin-catalog-backend/alpha'), + staticDatabase(knex), createBackendModule({ moduleId: 'syntheticLoadEntities', pluginId: 'catalog', @@ -200,7 +201,6 @@ describePerformanceTest('stitchingPerformance', () => { }); }, }), - staticDatabase(knex), ], }); diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index ea765169bb..b33835b2b6 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-common +## 1.0.16 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + ## 1.0.16-next.2 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index 3d17f6266e..ce78ffd5f0 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-common", "description": "Common functionalities for the catalog plugin", - "version": "1.0.16-next.2", + "version": "1.0.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md deleted file mode 100644 index ebdf4da400..0000000000 --- a/plugins/catalog-customized/CHANGELOG.md +++ /dev/null @@ -1,449 +0,0 @@ -# @internal/plugin-catalog-customized - -## 0.0.14-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.13.0-next.3 - - @backstage/plugin-catalog-react@1.8.4-next.3 - -## 0.0.14-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.13.0-next.2 - - @backstage/plugin-catalog-react@1.8.4-next.2 - -## 0.0.14-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.4-next.1 - - @backstage/plugin-catalog@1.12.5-next.1 - -## 0.0.14-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.12.4-next.0 - - @backstage/plugin-catalog-react@1.8.3-next.0 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.12.1 - - @backstage/plugin-catalog-react@1.8.1 - -## 0.0.13-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.1-next.1 - - @backstage/plugin-catalog@1.12.1-next.2 - -## 0.0.13-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.12.1-next.1 - - @backstage/plugin-catalog-react@1.8.1-next.0 - -## 0.0.13-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.12.1-next.0 - - @backstage/plugin-catalog-react@1.8.1-next.0 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.0 - - @backstage/plugin-catalog@1.12.0 - -## 0.0.12-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.8.0-next.2 - - @backstage/plugin-catalog@1.12.0-next.2 - -## 0.0.12-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.11.3-next.1 - - @backstage/plugin-catalog-react@1.7.1-next.1 - -## 0.0.12-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.11.3-next.0 - - @backstage/plugin-catalog-react@1.7.1-next.0 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.11.2 - - @backstage/plugin-catalog-react@1.7.0 - -## 0.0.11-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.11.2-next.3 - - @backstage/plugin-catalog-react@1.7.0-next.3 - -## 0.0.11-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.7.0-next.2 - - @backstage/plugin-catalog@1.11.1-next.2 - -## 0.0.11-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.11.1-next.1 - - @backstage/plugin-catalog-react@1.7.0-next.1 - -## 0.0.11-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.7.0-next.0 - - @backstage/plugin-catalog@1.11.1-next.0 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.6.0 - - @backstage/plugin-catalog@1.11.0 - -## 0.0.10-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.11.0-next.2 - - @backstage/plugin-catalog-react@1.6.0-next.2 - -## 0.0.10-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.11.0-next.1 - - @backstage/plugin-catalog-react@1.6.0-next.1 - -## 0.0.10-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.6.0-next.0 - - @backstage/plugin-catalog@1.11.0-next.0 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.5.0 - - @backstage/plugin-catalog@1.10.0 - -## 0.0.9-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.5.0-next.3 - - @backstage/plugin-catalog@1.10.0-next.3 - -## 0.0.9-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.4.1-next.2 - - @backstage/plugin-catalog@1.10.0-next.2 - -## 0.0.9-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.4.1-next.1 - - @backstage/plugin-catalog@1.10.0-next.1 - -## 0.0.9-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.10.0-next.0 - - @backstage/plugin-catalog-react@1.4.1-next.0 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.9.0 - - @backstage/plugin-catalog-react@1.4.0 - -## 0.0.8-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.4.0-next.2 - - @backstage/plugin-catalog@1.9.0-next.2 - -## 0.0.8-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.9.0-next.1 - - @backstage/plugin-catalog-react@1.4.0-next.1 - -## 0.0.8-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.4.0-next.0 - - @backstage/plugin-catalog@1.9.0-next.0 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.8.0 - - @backstage/plugin-catalog-react@1.3.0 - -## 0.0.7-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.8.0-next.2 - - @backstage/plugin-catalog-react@1.3.0-next.2 - -## 0.0.7-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.8.0-next.1 - - @backstage/plugin-catalog-react@1.3.0-next.1 - -## 0.0.7-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.3.0-next.0 - - @backstage/plugin-catalog@1.7.3-next.0 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.4 - - @backstage/plugin-catalog@1.7.2 - -## 0.0.6-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.4-next.2 - - @backstage/plugin-catalog@1.7.2-next.2 - -## 0.0.6-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.7.2-next.1 - - @backstage/plugin-catalog-react@1.2.4-next.1 - -## 0.0.6-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.4-next.0 - - @backstage/plugin-catalog@1.7.2-next.0 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.7.1 - - @backstage/plugin-catalog-react@1.2.3 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.7.0 - - @backstage/plugin-catalog-react@1.2.2 - -## 0.0.5-next.4 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.7.0-next.4 - - @backstage/plugin-catalog-react@1.2.2-next.4 - -## 0.0.5-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.7.0-next.3 - - @backstage/plugin-catalog-react@1.2.2-next.3 - -## 0.0.5-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.7.0-next.2 - - @backstage/plugin-catalog-react@1.2.2-next.2 - -## 0.0.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.6.2-next.1 - - @backstage/plugin-catalog-react@1.2.2-next.1 - -## 0.0.5-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.2-next.0 - - @backstage/plugin-catalog@1.6.2-next.0 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.1 - - @backstage/plugin-catalog@1.6.1 - -## 0.0.4-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.6.1-next.1 - - @backstage/plugin-catalog-react@1.2.1-next.1 - -## 0.0.4-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.1-next.0 - - @backstage/plugin-catalog@1.6.1-next.0 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.0 - - @backstage/plugin-catalog@1.6.0 - -## 0.0.3-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.6.0-next.2 - - @backstage/plugin-catalog-react@1.2.0-next.2 - -## 0.0.3-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.2.0-next.1 - - @backstage/plugin-catalog@1.6.0-next.1 - -## 0.0.3-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.5.2-next.0 - - @backstage/plugin-catalog-react@1.1.5-next.0 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.1.4 - - @backstage/plugin-catalog@1.5.1 - -## 0.0.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-react@1.1.4-next.0 - - @backstage/plugin-catalog@1.5.1-next.0 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.5.0 - - @backstage/plugin-catalog-react@1.1.3 - -## 0.0.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog@1.5.0-next.0 - - @backstage/plugin-catalog-react@1.1.3-next.0 diff --git a/plugins/catalog-customized/README.md b/plugins/catalog-customized/README.md deleted file mode 100644 index b7323d7430..0000000000 --- a/plugins/catalog-customized/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# Backstage Catalog Frontend - -This is the React frontend to customize Backstage [software -catalog](http://backstage.io/docs/features/software-catalog/). -This package supplies the example how it can be achieved. - -## Installation - -This `@internal/plugin-catalog-customized` package comes installed by default in example application of -Backstage application. - -To check if you already have the package, look under -`packages/app/package.json`, in the `dependencies` block, for -`@internal/plugin-catalog-customized`. The instructions below walk through restoring the -plugin, if you previously removed it. - -### Install the package - -```bash -# From your Backstage root directory -yarn add --cwd packages/app @internal/plugin-catalog-customized -``` - -### Add the plugin to your `packages/app` - -Add the import to a file where is your plugin catalog is defined: - -```diff -// packages/app/src/App.tsx - -import from '@internal/plugin-catalog-customized'; - -... - -import { - CatalogIndexPage, - CatalogEntityPage, -} from '@backstage/plugin-catalog'; - -... -``` - -## Development - -This frontend plugin can be started in a standalone mode from directly in this -package with `yarn start`. However, it will have limited functionality and that -process is most convenient when developing the catalog frontend plugin itself. - -To evaluate the catalog and have a greater amount of functionality available, -run the entire Backstage example application from the root folder: - -```bash -yarn dev -``` - -This will launch both frontend and backend in the same window, populated with -some example entities. diff --git a/plugins/catalog-customized/api-report.md b/plugins/catalog-customized/api-report.md deleted file mode 100644 index 5cf6eefde1..0000000000 --- a/plugins/catalog-customized/api-report.md +++ /dev/null @@ -1,9 +0,0 @@ -## API Report File for "@internal/plugin-catalog-customized" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -export * from '@backstage/plugin-catalog'; - -// (No @packageDocumentation comment for this package) -``` diff --git a/plugins/catalog-customized/catalog-info.yaml b/plugins/catalog-customized/catalog-info.yaml deleted file mode 100644 index 1a6d0e0a00..0000000000 --- a/plugins/catalog-customized/catalog-info.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: internal-plugin-catalog-customized - title: '@internal/plugin-catalog-customized' - description: >- - The internal Backstage Customizable plugin for browsing the Backstage - catalog -spec: - lifecycle: experimental - type: backstage-frontend-plugin - owner: catalog-maintainers diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json deleted file mode 100644 index 253a56c649..0000000000 --- a/plugins/catalog-customized/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "@internal/plugin-catalog-customized", - "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.14-next.3", - "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" - }, - "homepage": "https://backstage.io", - "repository": { - "type": "git", - "url": "https://github.com/backstage/backstage", - "directory": "plugins/catalog-customized" - }, - "keywords": [ - "backstage" - ], - "sideEffects": false, - "scripts": { - "build": "backstage-cli package build", - "start": "backstage-cli package start", - "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/plugin-catalog": "workspace:^", - "@backstage/plugin-catalog-react": "workspace:^" - }, - "devDependencies": { - "@types/react": "^16.13.1 || ^17.0.0" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0", - "react-dom": "^16.13.1 || ^17.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" - }, - "files": [ - "dist" - ] -} diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index aa92c9277f..456c1b13c9 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-catalog-graph +## 0.2.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## 0.2.36 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.2.36-next.3 ### Patch Changes diff --git a/plugins/catalog-graph/api-report.md b/plugins/catalog-graph/api-report.md index ce56245c49..98a68d8aa2 100644 --- a/plugins/catalog-graph/api-report.md +++ b/plugins/catalog-graph/api-report.md @@ -53,8 +53,7 @@ export const catalogGraphPlugin: BackstagePlugin< }, true >; - }, - {} + } >; // @public diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 41546c98be..6de95b8ec6 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.36-next.3", + "version": "0.2.37-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index 8077a3eab7..e34136f8eb 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-graphql +## 0.3.23 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/types@1.1.1 + ## 0.3.23-next.2 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 391c3c00d7..e853f308f3 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-graphql", "description": "An experimental Backstage catalog GraphQL module", - "version": "0.3.23-next.2", + "version": "0.3.23", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 86fa570e66..1c8cf69ead 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-catalog-import +## 0.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + +## 0.10.0 + +### Minor Changes + +- c3c1fd3a1765: Slight change to the `PreparePullRequestFormProps`, because of an update to `react-hook-form`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + ## 0.9.14-next.3 ### Patch Changes diff --git a/plugins/catalog-import/api-report.md b/plugins/catalog-import/api-report.md index 7397bfad1d..a513cfe87a 100644 --- a/plugins/catalog-import/api-report.md +++ b/plugins/catalog-import/api-report.md @@ -134,7 +134,6 @@ const catalogImportPlugin: BackstagePlugin< { importPage: RouteRef<undefined>; }, - {}, {} >; export { catalogImportPlugin }; diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 3bb896f8e7..b2661288bd 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.14-next.3", + "version": "0.10.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 06f9333cab..4ab1791209 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-node +## 1.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + +## 1.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 1.4.4-next.3 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index c85acb1c15..6e11ee0820 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.4.4-next.3", + "version": "1.4.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index f70079310f..8b1c4bf90e 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-catalog-react +## 1.8.5-next.0 + +### Patch Changes + +- a402e1dfb9: Fixed an issue causing `EntityPage` to show an error for entities containing special characters +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + +## 1.8.4 + +### Patch Changes + +- bd817209ddd7: Export the `EntityAutocompletePicker` component. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 7029ba1ce0af: Added delete alert popup when user delete the entity +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.8.4-next.3 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 319ff31eee..c65be47791 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.8.4-next.3", + "version": "1.8.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx index b0a6b46bf5..cecf27be24 100644 --- a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.test.tsx @@ -174,4 +174,26 @@ describe('<EntityRefLink />', () => { '/catalog/test/component/software', ); }); + + it('renders link by encoding name as URI component', async () => { + const entityName = { + kind: 'Compone&nt', + namespace: 'tes[t', + name: 'softw#are', + }; + await renderInTestApp( + <EntityRefLink entityRef={entityName} defaultKind="component"> + Custom Children + </EntityRefLink>, + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name/*': entityRouteRef, + }, + }, + ); + expect(screen.getByText('Custom Children')).toHaveAttribute( + 'href', + '/catalog/tes%5Bt/compone%26nt/softw%23are', + ); + }); }); diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx index 06a632232e..d682abdc2b 100644 --- a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.tsx @@ -71,7 +71,11 @@ export const EntityRefLink = forwardRef<any, EntityRefLinkProps>( kind = kind.toLocaleLowerCase('en-US'); namespace = namespace?.toLocaleLowerCase('en-US') ?? DEFAULT_NAMESPACE; - const routeParams = { kind, namespace, name }; + const routeParams = { + kind: encodeURIComponent(kind), + namespace: encodeURIComponent(namespace), + name: encodeURIComponent(name), + }; const formattedEntityRefTitle = humanizeEntityRef( { kind, namespace, name }, { defaultKind }, diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index 84fdac0bdc..8e384e95cd 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.3 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.3-next.3 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/api-report.md b/plugins/catalog-unprocessed-entities/api-report.md index 3ded42785a..cc4d6bba88 100644 --- a/plugins/catalog-unprocessed-entities/api-report.md +++ b/plugins/catalog-unprocessed-entities/api-report.md @@ -34,7 +34,6 @@ export const catalogUnprocessedEntitiesPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 350988b3ac..0ae64d4feb 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.1.3-next.3", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index c47c7df2a4..a8fd34773f 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,71 @@ # @backstage/plugin-catalog +## 1.14.0-next.0 + +### Minor Changes + +- 28f1ab2e1a: The catalog plugin no longer implements the experimental reconfiguration API. The create button title can now instead be configured using the new experimental internationalization API, via the `catalogTranslationRef` exported at `/alpha`. For example: + + ```ts + import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha'; + + const app = createApp({ + __experimentalTranslations: { + resources: [ + createTranslationMessages({ + ref: catalogTranslationRef, + catalog_page_create_button_title: 'Create Software', + }), + ], + }, + }); + ``` + +- f3561a2935: include owner chip in catalog search result item + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + +## 1.13.0 + +### Minor Changes + +- e44f45ac4515: This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. + +### Patch Changes + +- 832eef72485b: Added title to props for `Has<kind>Cards`. +- 163a41035e42: Fixed an issue where `EntitySwitch` was preventing the display of entity errors. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 1.13.0-next.3 ### Patch Changes diff --git a/plugins/catalog/alpha-api-report.md b/plugins/catalog/alpha-api-report.md new file mode 100644 index 0000000000..631c43e73c --- /dev/null +++ b/plugins/catalog/alpha-api-report.md @@ -0,0 +1,27 @@ +## API Report File for "@backstage/plugin-catalog" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { Extension } from '@backstage/frontend-plugin-api'; +import { TranslationRef } from '@backstage/core-plugin-api/alpha'; + +// @alpha (undocumented) +export const CatalogApi: Extension<{}>; + +// @alpha (undocumented) +export const catalogTranslationRef: TranslationRef< + 'catalog', + { + readonly catalog_page_title: '{{orgName}} Catalog'; + readonly catalog_page_create_button_title: 'Create'; + } +>; + +// @alpha (undocumented) +const _default: BackstagePlugin; +export default _default; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index c8956dcbe8..8173c395ba 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -117,8 +117,7 @@ export const catalogPlugin: BackstagePlugin< }, true >; - }, - CatalogInputPluginOptions + } >; // @public (undocumented) diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index e3b7975f84..4ef0db4910 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,14 +1,27 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.13.0-next.3", + "version": "1.14.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" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "frontend-plugin" @@ -38,6 +51,7 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/integration-react": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", diff --git a/plugins/catalog/src/alpha.ts b/plugins/catalog/src/alpha.ts new file mode 100644 index 0000000000..d9c2af338d --- /dev/null +++ b/plugins/catalog/src/alpha.ts @@ -0,0 +1,54 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './translation'; + +import { + DiscoveryApi, + FetchApi, + discoveryApiRef, + fetchApiRef, +} from '@backstage/core-plugin-api'; +import { CatalogClient } from '@backstage/catalog-client'; +import { + createApiExtension, + createPlugin, +} from '@backstage/frontend-plugin-api'; +import { catalogApiRef } from '@backstage/plugin-catalog-react'; + +/** @alpha */ +export const CatalogApi = createApiExtension({ + factory: { + api: catalogApiRef, + deps: { + discoveryApi: discoveryApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ + discoveryApi, + fetchApi, + }: { + discoveryApi: DiscoveryApi; + fetchApi: FetchApi; + }) => new CatalogClient({ discoveryApi, fetchApi }), + }, +}); + +/** @alpha */ +export default createPlugin({ + id: 'catalog', + extensions: [CatalogApi], +}); diff --git a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx index f31d3baf39..b7d3ca3ed8 100644 --- a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx +++ b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx @@ -29,7 +29,6 @@ import { MockStarredEntitiesApi, starredEntitiesApiRef, } from '@backstage/plugin-catalog-react'; -import { MockPluginProvider } from '@backstage/test-utils/alpha'; import { mockBreakpoint, MockStorageApi, @@ -133,7 +132,7 @@ describe('DefaultCatalogPage', () => { [starredEntitiesApiRef, new MockStarredEntitiesApi()], ]} > - <MockPluginProvider>{children}</MockPluginProvider> + {children} </TestApiProvider>, { mountedRoutes: { diff --git a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.tsx index 04f39ee66c..fb9b282d57 100644 --- a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.tsx @@ -41,7 +41,8 @@ import { import React, { ReactNode } from 'react'; import { createComponentRouteRef } from '../../routes'; import { CatalogTable, CatalogTableRow } from '../CatalogTable'; -import { useCatalogPluginOptions } from '../../options'; +import { catalogTranslationRef } from '../../translation'; +import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; /** * Props for root catalog pages. @@ -71,15 +72,14 @@ export function DefaultCatalogPage(props: DefaultCatalogPageProps) { const orgName = useApi(configApiRef).getOptionalString('organization.name') ?? 'Backstage'; const createComponentLink = useRouteRef(createComponentRouteRef); - - const { createButtonTitle } = useCatalogPluginOptions(); + const { t } = useTranslationRef(catalogTranslationRef); return ( - <PageWithHeader title={`${orgName} Catalog`} themeId="home"> + <PageWithHeader title={t('catalog_page_title', { orgName })} themeId="home"> <Content> <ContentHeader title=""> <CreateButton - title={createButtonTitle} + title={t('catalog_page_create_button_title')} to={createComponentLink && createComponentLink()} /> <SupportButton>All your software catalog entities</SupportButton> diff --git a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx index 50caf4ff8a..06906aecc1 100644 --- a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx +++ b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx @@ -110,6 +110,9 @@ export function CatalogSearchResultListItem( {result.lifecycle && ( <Chip label={`Lifecycle: ${result.lifecycle}`} size="small" /> )} + {result.owner && ( + <Chip label={`Owner: ${result.owner}`} size="small" /> + )} </Box> </div> </div> diff --git a/plugins/catalog/src/plugin.ts b/plugins/catalog/src/plugin.ts index 711f52767a..3410984ec3 100644 --- a/plugins/catalog/src/plugin.ts +++ b/plugins/catalog/src/plugin.ts @@ -52,7 +52,6 @@ import { HasSystemsCardProps } from './components/HasSystemsCard'; import { RelatedEntitiesCardProps } from './components/RelatedEntitiesCard'; import { CatalogSearchResultListItemProps } from './components/CatalogSearchResultListItem'; import { rootRouteRef } from './routes'; -import { CatalogInputPluginOptions, CatalogPluginOptions } from './options'; /** @public */ export const catalogPlugin = createPlugin({ @@ -83,14 +82,6 @@ export const catalogPlugin = createPlugin({ viewTechDoc: viewTechDocRouteRef, createFromTemplate: createFromTemplateRouteRef, }, - __experimentalConfigure( - options?: CatalogInputPluginOptions, - ): CatalogPluginOptions { - const defaultOptions = { - createButtonTitle: 'Create', - }; - return { ...defaultOptions, ...options }; - }, }); /** @public */ diff --git a/plugins/catalog/src/translation.ts b/plugins/catalog/src/translation.ts new file mode 100644 index 0000000000..2d1e3f2c8a --- /dev/null +++ b/plugins/catalog/src/translation.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createTranslationRef } from '@backstage/core-plugin-api/alpha'; + +/** @alpha */ +export const catalogTranslationRef = createTranslationRef({ + id: 'catalog', + messages: { + catalog_page_title: `{{orgName}} Catalog`, + catalog_page_create_button_title: 'Create', + }, +}); diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 437aea1243..e252bbe784 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-cicd-statistics@0.1.27-next.0 + - @backstage/catalog-model@1.4.2 + +## 0.1.20 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-cicd-statistics@0.1.26 + ## 0.1.20-next.3 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 2ad82799ab..2d2062914b 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.20-next.3", + "version": "0.1.21-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 5bf0006ff7..b195c4bab4 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-cicd-statistics +## 0.1.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.4.2 + +## 0.1.26 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + ## 0.1.26-next.3 ### Patch Changes diff --git a/plugins/cicd-statistics/api-report.md b/plugins/cicd-statistics/api-report.md index b0966aa281..70895d6a63 100644 --- a/plugins/cicd-statistics/api-report.md +++ b/plugins/cicd-statistics/api-report.md @@ -85,7 +85,6 @@ export const cicdStatisticsPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 28b99ddc13..a4a6552cd2 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.26-next.3", + "version": "0.1.27-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index 4f4b391646..c29eda8985 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-circleci +## 0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.3.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.24-next.3 ### Patch Changes diff --git a/plugins/circleci/api-report.md b/plugins/circleci/api-report.md index d706115610..3bb8d4b6f9 100644 --- a/plugins/circleci/api-report.md +++ b/plugins/circleci/api-report.md @@ -63,7 +63,7 @@ export const circleCIApiRef: ApiRef<CircleCIApi>; export const circleCIBuildRouteRef: SubRouteRef<PathParams<'/:buildId'>>; // @public (undocumented) -const circleCIPlugin: BackstagePlugin<{}, {}, {}>; +const circleCIPlugin: BackstagePlugin<{}, {}>; export { circleCIPlugin }; export { circleCIPlugin as plugin }; diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index f00381086b..aca3879232 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.24-next.3", + "version": "0.3.25-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index 334dc576d6..ced1a5b5aa 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-cloudbuild +## 0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.3.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.24-next.3 ### Patch Changes diff --git a/plugins/cloudbuild/api-report.md b/plugins/cloudbuild/api-report.md index dc2aacbc18..3fbb15000d 100644 --- a/plugins/cloudbuild/api-report.md +++ b/plugins/cloudbuild/api-report.md @@ -104,7 +104,6 @@ const cloudbuildPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; export { cloudbuildPlugin }; diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 3134b996e0..42b706ea2d 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.24-next.3", + "version": "0.3.25-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index 1534f24849..2728a0b8b4 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-code-climate +## 0.1.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.1.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.24-next.3 ### Patch Changes diff --git a/plugins/code-climate/api-report.md b/plugins/code-climate/api-report.md index 32359f663f..8243cada75 100644 --- a/plugins/code-climate/api-report.md +++ b/plugins/code-climate/api-report.md @@ -42,7 +42,6 @@ export const codeClimatePlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 86ea49464f..5f6e89942f 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.24-next.3", + "version": "0.1.25-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index 7a5f17d5a3..3f34c973ce 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/plugin-code-coverage-backend +## 0.2.19-next.0 + +### Patch Changes + +- 4aa27aa200: Added option to set body size limit +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## 0.2.17 + +### Patch Changes + +- 3f1367b956c6: Added support for LCOV coverage reports +- df005d9932fb: Add text body parser for LCOV reports +- 91ccb56fb418: Replace `express-xml-bodyparser` with `body-parser-xml`. + + `express-xml-bodyparser` was last updated 8 years ago + and currently depends on a version of `xml2js` which + contains a vulnerability. + + This change will swap it out in favor of `body-parser-xml` + which is more maintained and depends on a more recent `xml2js` + version without the vulnerability. + +- 33e606a797ef: Include auth token when fetching entity +- d409ed988aed: Correct the line hits calculation for Cobertura reports +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + ## 0.2.17-next.3 ### Patch Changes diff --git a/plugins/code-coverage-backend/README.md b/plugins/code-coverage-backend/README.md index a60b95ff25..54cf201015 100644 --- a/plugins/code-coverage-backend/README.md +++ b/plugins/code-coverage-backend/README.md @@ -235,3 +235,12 @@ Example ] } ``` + +### Configuration + +Configure the plugin in your `app-config.yaml`: + +```yaml +codeCoverage: + bodySizeLimit: 100kb # Defaults to 100kb, see https://www.npmjs.com/package/body-parser#limit +``` diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index f81d8b6e3c..fb956403b1 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.17-next.3", + "version": "0.2.19-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/src/service/router.test.ts b/plugins/code-coverage-backend/src/service/router.test.ts index 4f1a9ee2e5..2032a5470d 100644 --- a/plugins/code-coverage-backend/src/service/router.test.ts +++ b/plugins/code-coverage-backend/src/service/router.test.ts @@ -41,6 +41,7 @@ CodeCoverageDatabase.create = jest.fn( }, }), getHistory: async () => ({}), + insertCodeCoverage: async () => undefined, } as any), ); @@ -50,7 +51,13 @@ jest.mock('@backstage/catalog-client', () => ({ CatalogClient: jest.fn().mockImplementation(() => ({ getEntityByRef: async (_: string, options: CatalogRequestOptions) => { catalogRequestOptions = options; - return {}; + return { + metadata: { + annotations: { + 'backstage.io/code-coverage': 'enabled', + }, + }, + }; }, })), })); @@ -129,4 +136,41 @@ describe('createRouter', () => { }); }); }); + + describe('POST /report', () => { + it('returns created when body does not exceed limit', async () => { + const response = await request(app) + .post('/report?entity=component:default/mycomponent&coverageType=lcov') + .set('Content-Type', 'text/plain') + .send( + 'TN:\nSF:/src/index.js\nFNF:0\nFNH:0\nLF:1\nLH:1\nBRF:0\nBRH:0\nend_of_record', + ); + + expect(response.status).toBe(201); + }); + + it('returns content too large when body exceeds limit', async () => { + const router = await createRouter({ + config: new ConfigReader({ + codeCoverage: { + bodySizeLimit: '1b', + }, + }), + database: createDatabase(), + discovery: testDiscovery, + urlReader: mockUrlReader, + logger: getVoidLogger(), + }); + app = express().use(router); + + const response = await request(app) + .post('/report?entity=component:default/mycomponent&coverageType=lcov') + .set('Content-Type', 'text/plain') + .send( + 'TN:\nSF:/src/index.js\nFNF:0\nFNH:0\nLF:1\nLH:1\nBRF:0\nBRH:0\nend_of_record', + ); + + expect(response.status).toBe(413); + }); + }); }); diff --git a/plugins/code-coverage-backend/src/service/router.ts b/plugins/code-coverage-backend/src/service/router.ts index 3b97f2d233..47bc285d62 100644 --- a/plugins/code-coverage-backend/src/service/router.ts +++ b/plugins/code-coverage-backend/src/service/router.ts @@ -64,10 +64,21 @@ export const makeRouter = async ( options.catalogApi ?? new CatalogClient({ discoveryApi: discovery }); const scm = ScmIntegrations.fromConfig(config); + const bodySizeLimit = + config.getOptionalString('codeCoverage.bodySizeLimit') ?? '100kb'; + bodyParserXml(BodyParser); const router = Router(); - router.use(BodyParser.xml()); - router.use(BodyParser.text()); + router.use( + BodyParser.xml({ + limit: bodySizeLimit, + }), + ); + router.use( + BodyParser.text({ + limit: bodySizeLimit, + }), + ); router.use(express.json()); const utils = new CoverageUtils(scm, urlReader); diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 747807034f..099fcbd4df 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-code-coverage +## 0.2.18-next.0 + +### Patch Changes + +- a468544fa9: Updated layout to improve contrasts and consistency with other plugins +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.17 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 1d8f4f0a7486: Use fetchApi to ensure authorization is used when fetching code-coverage data +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.2.17-next.3 ### Patch Changes diff --git a/plugins/code-coverage/api-report.md b/plugins/code-coverage/api-report.md index 5dcb5fcfd1..152cc93103 100644 --- a/plugins/code-coverage/api-report.md +++ b/plugins/code-coverage/api-report.md @@ -14,7 +14,6 @@ export const codeCoveragePlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/code-coverage/dev/__fixtures__/coverage-for-entity.json b/plugins/code-coverage/dev/__fixtures__/coverage-for-entity.json new file mode 100644 index 0000000000..c2f4725818 --- /dev/null +++ b/plugins/code-coverage/dev/__fixtures__/coverage-for-entity.json @@ -0,0 +1,174 @@ +{ + "metadata": { + "vcs": { + "type": "github", + "location": "https://github.com/backstage/backstage/tree/main/" + }, + "generationTime": 1694413579498 + }, + "entity": { + "name": "backstage", + "namespace": "default", + "kind": "Component" + }, + "files": [ + { + "filename": "src/index.js", + "lineHits": { + "1": 1, + "2": 1, + "3": 1, + "4": 13, + "5": 13, + "6": 3, + "7": 13, + "8": 3, + "9": 13, + "10": 3, + "11": 13, + "12": 3, + "13": 13, + "14": 1, + "15": 13, + "16": 13 + }, + "branchHits": { + "3": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "5": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "7": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "9": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "11": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "13": { + "covered": 1, + "available": 1, + "missed": 0 + } + } + }, + { + "filename": "src/math.js", + "lineHits": { + "1": 1, + "2": 3, + "3": 2, + "4": 2, + "5": 1, + "6": 1, + "7": 1, + "8": 1, + "9": 3, + "10": 2, + "11": 2, + "12": 1, + "13": 1, + "14": 1, + "15": 1, + "16": 3, + "17": 2, + "18": 2, + "19": 1, + "20": 1, + "21": 1, + "22": 1, + "23": 3, + "24": 2, + "25": 3, + "26": 0, + "27": 0, + "28": 1, + "29": 1 + }, + "branchHits": { + "2": { + "covered": 3, + "available": 3, + "missed": 0 + }, + "5": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "8": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "9": { + "covered": 2, + "available": 2, + "missed": 0 + }, + "12": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "15": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "16": { + "covered": 2, + "available": 2, + "missed": 0 + }, + "19": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "22": { + "covered": 1, + "available": 1, + "missed": 0 + }, + "23": { + "covered": 2, + "available": 2, + "missed": 0 + }, + "25": { + "covered": 1, + "available": 2, + "missed": 1 + } + } + } + ], + "aggregate": { + "line": { + "available": 45, + "covered": 43, + "missed": 2, + "percentage": 95.56 + }, + "branch": { + "available": 23, + "covered": 22, + "missed": 1, + "percentage": 95.65 + } + } +} diff --git a/plugins/code-coverage/dev/__fixtures__/coverage-history-for-entity.json b/plugins/code-coverage/dev/__fixtures__/coverage-history-for-entity.json new file mode 100644 index 0000000000..26b96875e5 --- /dev/null +++ b/plugins/code-coverage/dev/__fixtures__/coverage-history-for-entity.json @@ -0,0 +1,84 @@ +{ + "entity": { + "name": "backstage", + "kind": "component", + "namespace": "default" + }, + "history": [ + { + "timestamp": 1694413579498, + "branch": { + "available": 23, + "covered": 22, + "missed": 1, + "percentage": 95.65 + }, + "line": { + "available": 45, + "covered": 43, + "missed": 2, + "percentage": 95.56 + } + }, + { + "timestamp": 1694178927072, + "branch": { + "available": 23, + "covered": 22, + "missed": 1, + "percentage": 95.65 + }, + "line": { + "available": 45, + "covered": 43, + "missed": 2, + "percentage": 95.56 + } + }, + { + "timestamp": 1694178830777, + "branch": { + "available": 19, + "covered": 18, + "missed": 1, + "percentage": 94.74 + }, + "line": { + "available": 45, + "covered": 43, + "missed": 2, + "percentage": 95.56 + } + }, + { + "timestamp": 1694178708402, + "branch": { + "available": 15, + "covered": 10, + "missed": 5, + "percentage": 66.67 + }, + "line": { + "available": 45, + "covered": 36, + "missed": 9, + "percentage": 80 + } + }, + { + "timestamp": 1694178270486, + "branch": { + "available": 10, + "covered": 5, + "missed": 5, + "percentage": 50 + }, + "line": { + "available": 45, + "covered": 26, + "missed": 19, + "percentage": 57.78 + } + } + ] +} diff --git a/plugins/code-coverage/dev/__fixtures__/file-content-index-js.txt b/plugins/code-coverage/dev/__fixtures__/file-content-index-js.txt new file mode 100644 index 0000000000..34df5226d5 --- /dev/null +++ b/plugins/code-coverage/dev/__fixtures__/file-content-index-js.txt @@ -0,0 +1,16 @@ +import { add, multiply, subtract, divide } from "./math"; + +export default (a, b, operator) => { + switch(operator) { + case '+': + return add(a, b); + case '-': + return subtract(a, b); + case '*': + return multiply(a, b); + case '/': + return divide(a, b); + default: + throw new Error('Invalid operator'); + } +}; diff --git a/plugins/code-coverage/dev/__fixtures__/file-content-math-js.txt b/plugins/code-coverage/dev/__fixtures__/file-content-math-js.txt new file mode 100644 index 0000000000..05f43438f5 --- /dev/null +++ b/plugins/code-coverage/dev/__fixtures__/file-content-math-js.txt @@ -0,0 +1,29 @@ +export function add(a, b) { + if (isNaN(a) || isNaN(b)) { + throw new Error('Invalid input'); + } + return a + b; +} + +export function subtract(a, b) { + if (isNaN(a) || isNaN(b)) { + throw new Error('Invalid input'); + } + return a - b; +} + +export function multiply(a, b) { + if (isNaN(a) || isNaN(b)) { + throw new Error('Invalid input'); + } + return a * b; +} + +export function divide(a, b) { + if (isNaN(a) || isNaN(b)) { + throw new Error('Invalid input'); + } else if (b === 0) { + throw new Error('Division by zero'); + } + return a / b; +} diff --git a/plugins/code-coverage/dev/__fixtures__/get-file-content-from-entity.ts b/plugins/code-coverage/dev/__fixtures__/get-file-content-from-entity.ts new file mode 100644 index 0000000000..9fea0997f7 --- /dev/null +++ b/plugins/code-coverage/dev/__fixtures__/get-file-content-from-entity.ts @@ -0,0 +1,64 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'src/index.js': `import { add, multiply, subtract, divide } from \"./math\"; + +export default (a, b, operator) => { + switch(operator) { + case '+': + return add(a, b); + case '-': + return subtract(a, b); + case '*': + return multiply(a, b); + case '/': + return divide(a, b); + default: + throw new Error('Invalid operator'); + } +}; + `, + 'src/math.js': `export function add(a, b) { + if (isNaN(a) || isNaN(b)) { + throw new Error('Invalid input'); + } + return a + b; +} + +export function subtract(a, b) { + if (isNaN(a) || isNaN(b)) { + throw new Error('Invalid input'); + } + return a - b; +} + +export function multiply(a, b) { + if (isNaN(a) || isNaN(b)) { + throw new Error('Invalid input'); + } + return a * b; +} + +export function divide(a, b) { + if (isNaN(a) || isNaN(b)) { + throw new Error('Invalid input'); + } else if (b === 0) { + throw new Error('Division by zero'); + } + return a / b; +} + `, +}; diff --git a/plugins/code-coverage/dev/index.tsx b/plugins/code-coverage/dev/index.tsx index f364c2a0d1..e0c1ef7616 100644 --- a/plugins/code-coverage/dev/index.tsx +++ b/plugins/code-coverage/dev/index.tsx @@ -16,11 +16,65 @@ import React from 'react'; import { createDevApp } from '@backstage/dev-utils'; import { codeCoveragePlugin, EntityCodeCoverageContent } from '../src/plugin'; +import { CompoundEntityRef, Entity } from '@backstage/catalog-model'; +import { EntityProvider } from '@backstage/plugin-catalog-react'; +import { codeCoverageApiRef, CodeCoverageApi } from '../src/api'; +import coverageForEntity from './__fixtures__/coverage-for-entity.json'; +import coverageHistoryForEntity from './__fixtures__/coverage-history-for-entity.json'; +import fileContentFromEntity from './__fixtures__/get-file-content-from-entity'; + +const mockEntity: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'backstage', + description: 'backstage.io', + annotations: { + 'backstage.io/code-coverage': 'enabled', + }, + }, + spec: { + lifecycle: 'production', + type: 'website', + owner: 'user:guest', + }, +}; + +const mockCodeCoverageApi: CodeCoverageApi = { + async getCoverageForEntity(_entity: CompoundEntityRef) { + return coverageForEntity as any; + }, + async getFileContentFromEntity(_entity: CompoundEntityRef, filePath: string) { + switch (filePath) { + case 'src/index.js': + return fileContentFromEntity['src/index.js']; + case 'src/math.js': + return fileContentFromEntity['src/math.js']; + default: + return ''; + } + }, + async getCoverageHistoryForEntity( + _entity: CompoundEntityRef, + _limit?: number, + ) { + return coverageHistoryForEntity; + }, +}; createDevApp() + .registerApi({ + api: codeCoverageApiRef, + deps: {}, + factory: () => mockCodeCoverageApi, + }) .registerPlugin(codeCoveragePlugin) .addPage({ - element: <EntityCodeCoverageContent />, + element: ( + <EntityProvider entity={mockEntity}> + <EntityCodeCoverageContent /> + </EntityProvider> + ), title: 'Root Page', }) .render(); diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index 9dda17c56f..05d035c45a 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.17-next.3", + "version": "0.2.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx b/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx index 1e5341eb50..09f499fafd 100644 --- a/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx +++ b/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx @@ -113,8 +113,8 @@ export const CoverageHistoryChart = () => { ); } - const oldestCoverage = valueHistory.history[0]; - const [latestCoverage] = valueHistory.history.slice(-1); + const [oldestCoverage] = valueHistory.history.slice(-1); + const latestCoverage = valueHistory.history[0]; const getTrendForCoverage = (type: Coverage) => { if (!oldestCoverage[type].percentage) { diff --git a/plugins/code-coverage/src/components/FileExplorer/CodeRow.tsx b/plugins/code-coverage/src/components/FileExplorer/CodeRow.tsx index c7dee55f2b..20f0548f16 100644 --- a/plugins/code-coverage/src/components/FileExplorer/CodeRow.tsx +++ b/plugins/code-coverage/src/components/FileExplorer/CodeRow.tsx @@ -41,9 +41,11 @@ const useStyles = makeStyles(theme => ({ }, hitCountRoundedRectangle: { backgroundColor: `${theme.palette.success.main}`, + color: `${theme.palette.success.contrastText}`, }, notHitCountRoundedRectangle: { backgroundColor: `${theme.palette.error.main}`, + color: `${theme.palette.error.contrastText}`, }, codeLine: { paddingLeft: `${theme.spacing(1)}`, @@ -52,9 +54,11 @@ const useStyles = makeStyles(theme => ({ }, hitCodeLine: { backgroundColor: `${theme.palette.success.main}`, + color: `${theme.palette.success.contrastText}`, }, notHitCodeLine: { backgroundColor: `${theme.palette.error.main}`, + color: `${theme.palette.error.contrastText}`, }, })); diff --git a/plugins/code-coverage/src/components/FileExplorer/FileExplorer.tsx b/plugins/code-coverage/src/components/FileExplorer/FileExplorer.tsx index 3d41a1ff64..4017ba8264 100644 --- a/plugins/code-coverage/src/components/FileExplorer/FileExplorer.tsx +++ b/plugins/code-coverage/src/components/FileExplorer/FileExplorer.tsx @@ -15,15 +15,9 @@ */ import { useEntity } from '@backstage/plugin-catalog-react'; -import { - Box, - Card, - CardContent, - CardHeader, - Modal, - Tooltip, -} from '@material-ui/core'; -import DescriptionIcon from '@material-ui/icons/Description'; +import { Box, Modal, makeStyles } from '@material-ui/core'; +import FolderIcon from '@material-ui/icons/Folder'; +import FileOutlinedIcon from '@material-ui/icons/InsertDriveFileOutlined'; import { Alert } from '@material-ui/lab'; import React, { Fragment, useEffect, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; @@ -38,6 +32,19 @@ import { } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; +const useStyles = makeStyles(theme => ({ + container: { + marginTop: theme.spacing(2), + }, + icon: { + marginRight: theme.spacing(1), + }, + link: { + color: theme.palette.primary.main, + cursor: 'pointer', + }, +})); + type FileStructureObject = Record<string, any>; type CoverageTableRow = { @@ -143,6 +150,7 @@ export const getObjectsAtPath = ( }; export const FileExplorer = () => { + const styles = useStyles(); const { entity } = useEntity(); const [curData, setCurData] = useState<CoverageTableRow | undefined>(); const [tableData, setTableData] = useState<CoverageTableRow[] | undefined>(); @@ -188,6 +196,7 @@ export const FileExplorer = () => { const moveUpIntoPath = (idx: number) => { const path = curPath.split('/').slice(0, idx + 1); + setCurFile(''); setCurPath(path.join('/')); setTableData(getObjectsAtPath(curData, path.slice(1))); }; @@ -197,43 +206,32 @@ export const FileExplorer = () => { title: 'Path', type: 'string', field: 'path', - render: (row: CoverageTableRow) => { - if (row.files?.length) { - return ( - <div - role="button" - tabIndex={row.tableData!.id} - style={{ color: 'lightblue', cursor: 'pointer' }} - onKeyDown={() => { - setCurPath(`${curPath}/${row.path}`); - moveDownIntoPath(row.path); - }} - onClick={() => { - setCurPath(`${curPath}/${row.path}`); - moveDownIntoPath(row.path); - }} - > - {row.path} - </div> - ); - } - - return ( - <Box display="flex" alignItems="center"> - {row.path} - <Tooltip title="View file content"> - <DescriptionIcon - fontSize="small" - style={{ color: 'lightblue', cursor: 'pointer' }} - onClick={() => { - setCurFile(`${curPath.slice(1)}/${row.path}`); - setModalOpen(true); - }} - /> - </Tooltip> - </Box> - ); - }, + render: (row: CoverageTableRow) => ( + <Box + display="flex" + alignItems="center" + role="button" + tabIndex={row.tableData!.id} + className={styles.link} + onClick={() => { + if (row.files?.length) { + setCurPath(`${curPath}/${row.path}`); + moveDownIntoPath(row.path); + } else { + setCurFile(`${curPath.slice(1)}/${row.path}`); + setModalOpen(true); + } + }} + > + {row.files?.length > 0 && ( + <FolderIcon fontSize="small" className={styles.icon} /> + )} + {row.files?.length === 0 && ( + <FileOutlinedIcon fontSize="small" className={styles.icon} /> + )} + {row.path} + </Box> + ), }, { title: 'Coverage', @@ -264,42 +262,50 @@ export const FileExplorer = () => { } return ( - <Card> - <CardHeader title="Explore Files" /> - <CardContent> - <Box mb={2} display="flex"> - {pathArray.map((pathElement, idx) => ( - <Fragment key={pathElement || 'root'}> - <div - role="button" - tabIndex={idx} - style={{ - color: `${idx !== lastPathElementIndex && 'lightblue'}`, - cursor: `${idx !== lastPathElementIndex && 'pointer'}`, - }} - onKeyDown={() => moveUpIntoPath(idx)} - onClick={() => moveUpIntoPath(idx)} - > - {pathElement || 'root'} - </div> - <div>{'\u00A0/\u00A0'}</div> - </Fragment> - ))} - </Box> - <Table - emptyContent={<>No files found</>} - data={tableData || []} - columns={columns} - /> - <Modal - open={modalOpen} - onClick={event => event.stopPropagation()} - onClose={() => setModalOpen(false)} - style={{ overflow: 'scroll' }} - > - <FileContent filename={curFile} coverage={fileCoverage} /> - </Modal> - </CardContent> - </Card> + <Box className={styles.container}> + <Table + emptyContent={<>No files found</>} + data={tableData || []} + columns={columns} + title={ + <> + <Box>Explore Files</Box> + <Box + mt={1} + style={{ + fontSize: '0.875rem', + fontWeight: 'normal', + display: 'flex', + }} + > + {pathArray.map((pathElement, idx) => ( + <Fragment key={pathElement || 'root'}> + <div + role="button" + tabIndex={idx} + className={ + idx !== lastPathElementIndex ? styles.link : undefined + } + onKeyDown={() => moveUpIntoPath(idx)} + onClick={() => moveUpIntoPath(idx)} + > + {pathElement || 'root'} + </div> + {idx !== lastPathElementIndex && <div>{'\u00A0/\u00A0'}</div>} + </Fragment> + ))} + </Box> + </> + } + /> + <Modal + open={modalOpen} + onClick={event => event.stopPropagation()} + onClose={() => setModalOpen(false)} + style={{ overflow: 'scroll' }} + > + <FileContent filename={curFile} coverage={fileCoverage} /> + </Modal> + </Box> ); }; diff --git a/plugins/code-coverage/src/components/FileExplorer/Highlighter.ts b/plugins/code-coverage/src/components/FileExplorer/Highlighter.ts index d97d147da3..465e43f6e4 100644 --- a/plugins/code-coverage/src/components/FileExplorer/Highlighter.ts +++ b/plugins/code-coverage/src/components/FileExplorer/Highlighter.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import 'highlight.js/styles/atom-one-dark.css'; -import highlight from 'highlight.js'; +import 'highlight.js/styles/mono-blue.css'; +import { highlight } from 'highlight.js'; /* * Given a file extension, repo name, and array of code lines, return a Promise resolving @@ -30,7 +30,6 @@ import highlight from 'highlight.js'; */ export const highlightLines = (fileExtension: string, lines: Array<string>) => { const formattedLines: Array<string> = []; - let state: CompiledMode | Language | undefined; let fileformat = fileExtension; if (fileExtension === 'm') { fileformat = 'objectivec'; @@ -46,8 +45,10 @@ export const highlightLines = (fileExtension: string, lines: Array<string>) => { } lines.forEach(line => { - const result = highlight.highlight(fileformat, line, true, state); - state = result.top; + const result = highlight(line, { + language: fileformat, + ignoreIllegals: true, + }); formattedLines.push(result.value); }); return formattedLines; diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index 7a73c288e9..45e23b905a 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-codescene +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.17 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.17-next.3 ### Patch Changes diff --git a/plugins/codescene/api-report.md b/plugins/codescene/api-report.md index 662968d3c9..99eb2b6256 100644 --- a/plugins/codescene/api-report.md +++ b/plugins/codescene/api-report.md @@ -24,7 +24,6 @@ export const codescenePlugin: BackstagePlugin< projectId: string; }>; }, - {}, {} >; diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 1572102f6a..aa105dffd6 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.17-next.3", + "version": "0.1.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 237ad63dbe..877bbe23c2 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-config-schema +## 0.1.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## 0.1.45 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.1.45-next.3 ### Patch Changes diff --git a/plugins/config-schema/api-report.md b/plugins/config-schema/api-report.md index 95d352d1b7..16630ae8d0 100644 --- a/plugins/config-schema/api-report.md +++ b/plugins/config-schema/api-report.md @@ -29,7 +29,6 @@ export const configSchemaPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 368be1ee65..1428340190 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.45-next.3", + "version": "0.1.46-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights-common/CHANGELOG.md b/plugins/cost-insights-common/CHANGELOG.md index 40adfc123a..2bd7d1dc76 100644 --- a/plugins/cost-insights-common/CHANGELOG.md +++ b/plugins/cost-insights-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-cost-insights-common +## 0.1.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/cost-insights-common/package.json b/plugins/cost-insights-common/package.json index 5f951cef95..629d743ee9 100644 --- a/plugins/cost-insights-common/package.json +++ b/plugins/cost-insights-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights-common", "description": "Common functionalities for the cost-insights plugin", - "version": "0.1.2-next.0", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 5cf01ef04b..5a29cfe729 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-cost-insights +## 0.12.14-next.0 + +### Patch Changes + +- 959aa2a09f: The experimental plugin configuration has been removed. The trend line can now instead be hidden by setting `costInsights.hideTrendLine` to `true` in the configuration. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-cost-insights-common@0.1.2 + +## 0.12.13 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- a54cd411639e: Updated dependency `@types/pluralize` to `^0.0.30`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-cost-insights-common@0.1.2 + - @backstage/theme@0.4.2 + ## 0.12.13-next.3 ### Patch Changes diff --git a/plugins/cost-insights/api-report.md b/plugins/cost-insights/api-report.md index b37804c93d..11cdbd8141 100644 --- a/plugins/cost-insights/api-report.md +++ b/plugins/cost-insights/api-report.md @@ -242,6 +242,7 @@ export type ConfigContextProps = { icons: Icon[]; engineerCost: number; engineerThreshold: number; + hideTrendLine: boolean; currencies: Currency[]; }; @@ -326,8 +327,7 @@ const costInsightsPlugin: BackstagePlugin< growthAlerts: RouteRef<undefined>; unlabeledDataflowAlerts: RouteRef<undefined>; }, - {}, - CostInsightsInputPluginOptions + {} >; export { costInsightsPlugin }; export { costInsightsPlugin as plugin }; diff --git a/plugins/cost-insights/config.d.ts b/plugins/cost-insights/config.d.ts index 61a54f76e2..786d6f5a59 100644 --- a/plugins/cost-insights/config.d.ts +++ b/plugins/cost-insights/config.d.ts @@ -26,6 +26,11 @@ export interface Config { */ engineerThreshold?: number; + /** + * @visibility frontend + */ + hideTrendLine?: boolean; + /** * @visibility frontend */ diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index b37d366b06..0f3843ddb3 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.13-next.3", + "version": "0.12.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -70,7 +70,7 @@ "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", - "@types/pluralize": "^0.0.30", + "@types/pluralize": "^0.0.31", "@types/recharts": "^1.8.14", "@types/regression": "^2.0.0", "@types/yup": "^0.29.13", diff --git a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewCard.test.tsx b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewCard.test.tsx index d4fdc66bdb..2250392355 100644 --- a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewCard.test.tsx +++ b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewCard.test.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; import { fireEvent } from '@testing-library/react'; -import { MockPluginProvider } from '@backstage/test-utils/alpha'; import { renderInTestApp } from '@backstage/test-utils'; import { CostOverviewCard } from './CostOverviewCard'; import { Cost } from '@backstage/plugin-cost-insights-common'; @@ -45,9 +44,7 @@ function renderInContext(children: JSX.Element) { <MockConfigProvider> <MockFilterProvider> <MockBillingDateProvider> - <MockScrollProvider> - <MockPluginProvider>{children}</MockPluginProvider> - </MockScrollProvider> + <MockScrollProvider>{children}</MockScrollProvider> </MockBillingDateProvider> </MockFilterProvider> </MockConfigProvider> diff --git a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewChart.tsx b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewChart.tsx index ce0623cc7e..2201dcc650 100644 --- a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewChart.tsx +++ b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewChart.tsx @@ -47,7 +47,6 @@ import { groupByDate, trendFrom } from '../../utils/charts'; import { aggregationSort } from '../../utils/sort'; import { CostOverviewLegend } from './CostOverviewLegend'; import { TooltipRenderer } from '../../types'; -import { useCostInsightsOptions } from '../../options'; import { useConfig } from '../../hooks'; type CostOverviewChartProps = { @@ -65,7 +64,7 @@ export const CostOverviewChart = ({ }: CostOverviewChartProps) => { const theme = useTheme<CostInsightsTheme>(); const styles = useStyles(theme); - const { baseCurrency } = useConfig(); + const { baseCurrency, hideTrendLine } = useConfig(); const data = { dailyCost: { @@ -134,7 +133,6 @@ export const CostOverviewChart = ({ ); }; - const { hideTrendLine } = useCostInsightsOptions(); const localizedTickFormatter = formatGraphValue(baseCurrency); return ( diff --git a/plugins/cost-insights/src/components/EntityCosts/EntityCost.test.tsx b/plugins/cost-insights/src/components/EntityCosts/EntityCost.test.tsx index 6eb3369b40..6ad7285ab9 100644 --- a/plugins/cost-insights/src/components/EntityCosts/EntityCost.test.tsx +++ b/plugins/cost-insights/src/components/EntityCosts/EntityCost.test.tsx @@ -14,7 +14,6 @@ * limitations under the License. */ import React from 'react'; -import { MockPluginProvider } from '@backstage/test-utils/alpha'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { changeOf, @@ -65,9 +64,7 @@ function renderInContext(children: JSX.Element) { <MockFilterProvider> <MockBillingDateProvider> <MockScrollProvider> - <MockScrollProvider> - <MockPluginProvider>{children}</MockPluginProvider> - </MockScrollProvider> + <MockScrollProvider>{children}</MockScrollProvider> </MockScrollProvider> </MockBillingDateProvider> </MockFilterProvider> diff --git a/plugins/cost-insights/src/hooks/useConfig.tsx b/plugins/cost-insights/src/hooks/useConfig.tsx index f42cea38c3..82c0ce26f5 100644 --- a/plugins/cost-insights/src/hooks/useConfig.tsx +++ b/plugins/cost-insights/src/hooks/useConfig.tsx @@ -72,6 +72,7 @@ export type ConfigContextProps = { icons: Icon[]; engineerCost: number; engineerThreshold: number; + hideTrendLine: boolean; currencies: Currency[]; }; @@ -86,6 +87,7 @@ const defaultState: ConfigContextProps = { icons: [], engineerCost: 0, engineerThreshold: EngineerThreshold, + hideTrendLine: false, currencies: defaultCurrencies, }; @@ -193,12 +195,20 @@ export const ConfigProvider = ({ children }: PropsWithChildren<{}>) => { ); } + function getHideTrendLine(): boolean { + return ( + c.getOptionalBoolean('costInsights.hideTrendLine') ?? + defaultState.hideTrendLine + ); + } + function getConfig() { const baseCurrency = getBaseCurrency(); const products = getProducts(); const metrics = getMetrics(); const engineerCost = getEngineerCost(); const engineerThreshold = getEngineerThreshold(); + const hideTrendLine = getHideTrendLine(); const icons = getIcons(); const currencies = getCurrencies(); @@ -212,6 +222,7 @@ export const ConfigProvider = ({ children }: PropsWithChildren<{}>) => { products, engineerCost, engineerThreshold, + hideTrendLine, icons, currencies, })); diff --git a/plugins/cost-insights/src/plugin.ts b/plugins/cost-insights/src/plugin.ts index c863c9e03a..04d58d1877 100644 --- a/plugins/cost-insights/src/plugin.ts +++ b/plugins/cost-insights/src/plugin.ts @@ -19,10 +19,6 @@ import { createRouteRef, createRoutableExtension, } from '@backstage/core-plugin-api'; -import { - CostInsightsInputPluginOptions, - CostInsightsPluginOptions, -} from './options'; export const rootRouteRef = createRouteRef({ id: 'cost-insights', @@ -45,14 +41,6 @@ export const costInsightsPlugin = createPlugin({ growthAlerts: projectGrowthAlertRef, unlabeledDataflowAlerts: unlabeledDataflowAlertRef, }, - __experimentalConfigure( - options?: CostInsightsInputPluginOptions, - ): CostInsightsPluginOptions { - const defaultOptions = { - hideTrendLine: false, - }; - return { ...defaultOptions, ...options }; - }, }); /** @public */ diff --git a/plugins/cost-insights/src/testUtils/providers.tsx b/plugins/cost-insights/src/testUtils/providers.tsx index 9522dfb702..5df1b2512f 100644 --- a/plugins/cost-insights/src/testUtils/providers.tsx +++ b/plugins/cost-insights/src/testUtils/providers.tsx @@ -96,6 +96,7 @@ export const MockConfigProvider = (props: MockConfigProviderProps) => { icons: [], engineerCost: 0, engineerThreshold: EngineerThreshold, + hideTrendLine: false, currencies: [], }; diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index ebb942473b..4b07850d2d 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,58 @@ # @backstage/plugin-devtools-backend +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## 0.2.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + ## 0.2.0-next.3 ### Minor Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index a5db6d2fd4..085b0bf37c 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.2.0-next.3", + "version": "0.2.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-common/CHANGELOG.md b/plugins/devtools-common/CHANGELOG.md index 4e5603ebd9..4e1f15afcf 100644 --- a/plugins/devtools-common/CHANGELOG.md +++ b/plugins/devtools-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-devtools-common +## 0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + ## 0.1.4-next.2 ### Patch Changes diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index 921a658930..bde9934ffa 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-devtools-common", "description": "Common functionalities for the devtools plugin", - "version": "0.1.4-next.2", + "version": "0.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index 13c452e26f..6d8cdb219d 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-devtools +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-devtools-common@0.1.4 + +## 0.1.4 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 12e644aa4eef: Show resource utilization in `DevTools` plugin +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-devtools-common@0.1.4 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.1.4-next.3 ### Patch Changes diff --git a/plugins/devtools/api-report.md b/plugins/devtools/api-report.md index f0a9280162..21754d7c1e 100644 --- a/plugins/devtools/api-report.md +++ b/plugins/devtools/api-report.md @@ -36,7 +36,6 @@ export const devToolsPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 7311975ae9..c1b4fb2f79 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.4-next.3", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index 5abbd83b7e..a4dc207110 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-dynatrace +## 7.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 7.0.4 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 7.0.4-next.3 ### Patch Changes diff --git a/plugins/dynatrace/api-report.md b/plugins/dynatrace/api-report.md index 0f25fc3108..f78b4060fd 100644 --- a/plugins/dynatrace/api-report.md +++ b/plugins/dynatrace/api-report.md @@ -10,7 +10,7 @@ import { Entity } from '@backstage/catalog-model'; import { JSX as JSX_2 } from 'react'; // @public -export const dynatracePlugin: BackstagePlugin<{}, {}, {}>; +export const dynatracePlugin: BackstagePlugin<{}, {}>; // @public export const DynatraceTab: () => JSX_2.Element; diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 749e2e730f..c31e336e5c 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "7.0.4-next.3", + "version": "7.0.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md index dd9f9288e3..6c2224bfcf 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/plugin-entity-feedback-backend +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-entity-feedback-common@0.1.3 + +## 0.2.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 740155e8e976: Improve backend logging if method calls fail +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-entity-feedback-common@0.1.3 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.0-next.3 ### Minor Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index 60521fe3c6..6cf4117995 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback-backend", - "version": "0.2.0-next.3", + "version": "0.2.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-common/CHANGELOG.md b/plugins/entity-feedback-common/CHANGELOG.md index b1993659d2..8981c80952 100644 --- a/plugins/entity-feedback-common/CHANGELOG.md +++ b/plugins/entity-feedback-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-entity-feedback-common +## 0.1.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/entity-feedback-common/package.json b/plugins/entity-feedback-common/package.json index 0ec33e3848..7688ded0d7 100644 --- a/plugins/entity-feedback-common/package.json +++ b/plugins/entity-feedback-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-entity-feedback-common", "description": "Common functionalities for the entity-feedback plugin", - "version": "0.1.3-next.0", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback/CHANGELOG.md b/plugins/entity-feedback/CHANGELOG.md index f14d4ec939..c5b67f10cf 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-entity-feedback +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-entity-feedback-common@0.1.3 + +## 0.2.7 + +### Patch Changes + +- 5e2e06db747a: Improve README to note that Backstage identity is required to be configured +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-entity-feedback-common@0.1.3 + - @backstage/theme@0.4.2 + ## 0.2.7-next.3 ### Patch Changes diff --git a/plugins/entity-feedback/api-report.md b/plugins/entity-feedback/api-report.md index d61394ab9a..27e56e5282 100644 --- a/plugins/entity-feedback/api-report.md +++ b/plugins/entity-feedback/api-report.md @@ -70,7 +70,6 @@ export const entityFeedbackPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index dbfb824eac..032e6732bc 100644 --- a/plugins/entity-feedback/package.json +++ b/plugins/entity-feedback/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback", - "version": "0.2.7-next.3", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md index da0167951f..985cc6656e 100644 --- a/plugins/entity-validation/CHANGELOG.md +++ b/plugins/entity-validation/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-entity-validation +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + +## 0.1.9 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/theme@0.4.2 + ## 0.1.9-next.3 ### Patch Changes diff --git a/plugins/entity-validation/api-report.md b/plugins/entity-validation/api-report.md index 48b309cfaa..9d69458ed0 100644 --- a/plugins/entity-validation/api-report.md +++ b/plugins/entity-validation/api-report.md @@ -20,7 +20,6 @@ export const entityValidationPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index fbcdaf8407..fe9ab02d0f 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-validation", - "version": "0.1.9-next.3", + "version": "0.1.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index a883523293..f893794fdb 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.2.6 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 6e04fe80df..c4fad0d1e0 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.2.6-next.3", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 5070283861..f4d1657b0f 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 13e3b262f3..07b62130a2 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.13-next.3", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 591a5f52b3..4dbb0932e5 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 2cb6036dda..4011a3f496 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.13-next.3", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 00b1458b9c..96918cd580 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index db3c63aa67..89afd8a47c 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.13-next.3", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 65ca36d696..bcc3afa0ca 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-github +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 4dea3ab25c..a85ce50dee 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.13-next.3", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 0cdd6f8d52..140b3302ac 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index de4fed7289..0d8c036303 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.13-next.3", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index 63a2e594d3..f98f330f5b 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.12 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 4ea6403b8c..945cbc2bf2 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.13-next.3", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index e98a5069fe..6fb1b224d2 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-events-backend +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + +## 0.2.12 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-events-node@0.2.12 + ## 0.2.12-next.3 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index b680727451..808ee2b0ec 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.12-next.3", + "version": "0.2.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index d9d8a6a719..327c63a925 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-events-node +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.12-next.3 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index d2f3f4c1c7..eae224aa62 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.12-next.3", + "version": "0.2.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 30ebaa8f1c..5dfb9268a6 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @internal/plugin-todo-list-backend +## 1.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + +## 1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + ## 1.0.17-next.3 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 24b3647a26..2659de88bd 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.17-next.3", + "version": "1.0.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-common/CHANGELOG.md b/plugins/example-todo-list-common/CHANGELOG.md index 1a141b8dbf..af2dba54e0 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list-common +## 1.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + ## 1.0.13-next.2 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 31e4f8b37e..257f19e1c7 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-common", - "version": "1.0.13-next.2", + "version": "1.0.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index d265584ef0..9d686f4ffc 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,23 @@ # @internal/plugin-todo-list +## 1.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## 1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 1.0.17-next.3 ### Patch Changes diff --git a/plugins/example-todo-list/api-report.md b/plugins/example-todo-list/api-report.md index 1b7aa49a19..2feeeb903d 100644 --- a/plugins/example-todo-list/api-report.md +++ b/plugins/example-todo-list/api-report.md @@ -17,7 +17,6 @@ export const todoListPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index cc0e510918..7af06dc823 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.17-next.3", + "version": "1.0.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index 6b1cf1b626..ec8dcd45cf 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-explore-backend +## 0.0.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 0.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + ## 0.0.13-next.3 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index 4c37fbd71f..ba5995651a 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.13-next.3", + "version": "0.0.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-common/CHANGELOG.md b/plugins/explore-common/CHANGELOG.md index ce3e7ca020..a17d233c03 100644 --- a/plugins/explore-common/CHANGELOG.md +++ b/plugins/explore-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-explore-common +## 0.0.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.0.2-next.0 ### Patch Changes diff --git a/plugins/explore-common/package.json b/plugins/explore-common/package.json index d2b23ec0ad..c71f888ad9 100644 --- a/plugins/explore-common/package.json +++ b/plugins/explore-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-common", "description": "Common functionalities for the explore plugin", - "version": "0.0.2-next.0", + "version": "0.0.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md index b2bcc61d0f..6d45e9a689 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-explore-react +## 0.0.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-explore-common@0.0.2 + +## 0.0.31 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-explore-common@0.0.2 + ## 0.0.31-next.3 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index acdcd0bb2f..9282573a38 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.31-next.3", + "version": "0.0.32-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index 8b319fb338..81041c46df 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-explore +## 0.4.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-explore-react@0.0.32-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.4.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-explore-react@0.0.31 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + ## 0.4.10-next.3 ### Patch Changes diff --git a/plugins/explore/alpha-api-report.md b/plugins/explore/alpha-api-report.md new file mode 100644 index 0000000000..3d6e527629 --- /dev/null +++ b/plugins/explore/alpha-api-report.md @@ -0,0 +1,19 @@ +## API Report File for "@backstage/plugin-explore" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { Extension } from '@backstage/frontend-plugin-api'; + +// @alpha (undocumented) +const _default: BackstagePlugin; +export default _default; + +// @alpha (undocumented) +export const ExploreSearchResultListItemExtension: Extension<{ + noTrack?: boolean | undefined; +}>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/explore/api-report.md b/plugins/explore/api-report.md index 193efb044d..d32a133685 100644 --- a/plugins/explore/api-report.md +++ b/plugins/explore/api-report.md @@ -99,8 +99,7 @@ const explorePlugin: BackstagePlugin< }, true >; - }, - {} + } >; export { explorePlugin }; export { explorePlugin as plugin }; diff --git a/plugins/explore/package.json b/plugins/explore/package.json index e2ba7b5d58..dcf0b75577 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,14 +1,27 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.4.10-next.3", + "version": "0.4.11-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" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.tsx", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.tsx" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "frontend-plugin" @@ -37,6 +50,7 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-explore-common": "workspace:^", "@backstage/plugin-explore-react": "workspace:^", diff --git a/plugins/explore/src/alpha.tsx b/plugins/explore/src/alpha.tsx new file mode 100644 index 0000000000..1825af5ddb --- /dev/null +++ b/plugins/explore/src/alpha.tsx @@ -0,0 +1,35 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createPlugin } from '@backstage/frontend-plugin-api'; +import { createSearchResultListItemExtension } from '@backstage/plugin-search-react/alpha'; + +/** @alpha */ +export const ExploreSearchResultListItemExtension = + createSearchResultListItemExtension({ + id: 'explore', + predicate: result => result.type === 'tools', + component: () => + import('./components/ToolSearchResultListItem').then( + m => m.ToolSearchResultListItem, + ), + }); + +/** @alpha */ +export default createPlugin({ + id: 'explore', + extensions: [ExploreSearchResultListItemExtension], +}); diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index c57d3e257f..0eab08760c 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-firehydrant +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.2.8 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.2.8-next.3 ### Patch Changes diff --git a/plugins/firehydrant/api-report.md b/plugins/firehydrant/api-report.md index 76ccd8f019..9eeac41576 100644 --- a/plugins/firehydrant/api-report.md +++ b/plugins/firehydrant/api-report.md @@ -18,7 +18,6 @@ export const firehydrantPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 1e702ed189..d6b02d8323 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.2.8-next.3", + "version": "0.2.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index 3c9833a372..35aa7423aa 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-fossa +## 0.2.57-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.56 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.2.56-next.3 ### Patch Changes diff --git a/plugins/fossa/api-report.md b/plugins/fossa/api-report.md index ac76ff6af6..6be878d434 100644 --- a/plugins/fossa/api-report.md +++ b/plugins/fossa/api-report.md @@ -31,7 +31,6 @@ export const fossaPlugin: BackstagePlugin< { fossaOverview: RouteRef<undefined>; }, - {}, {} >; ``` diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index 90886af535..78c39595b4 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.56-next.3", + "version": "0.2.57-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index e0d08218cc..f8adef32ea 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-gcalendar +## 0.3.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.3.18 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.3.18-next.3 ### Patch Changes diff --git a/plugins/gcalendar/api-report.md b/plugins/gcalendar/api-report.md index 3f1d42d239..f1f505fc9a 100644 --- a/plugins/gcalendar/api-report.md +++ b/plugins/gcalendar/api-report.md @@ -51,7 +51,6 @@ export const gcalendarPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 48f192f97a..6e0166402e 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.18-next.3", + "version": "0.3.19-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index ddcc3fb1e9..4f7d8546cd 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-gcp-projects +## 0.3.42-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## 0.3.41 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.41-next.3 ### Patch Changes diff --git a/plugins/gcp-projects/api-report.md b/plugins/gcp-projects/api-report.md index fd156687c0..e6938485fc 100644 --- a/plugins/gcp-projects/api-report.md +++ b/plugins/gcp-projects/api-report.md @@ -48,7 +48,6 @@ const gcpProjectsPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; export { gcpProjectsPlugin }; diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index 037629d6a3..7c0a6f9240 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.41-next.3", + "version": "0.3.42-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 9b66828756..58ee33695d 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-git-release-manager +## 0.3.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## 0.3.37 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.3.37-next.3 ### Patch Changes diff --git a/plugins/git-release-manager/api-report.md b/plugins/git-release-manager/api-report.md index a3215041f0..3e4c0847a7 100644 --- a/plugins/git-release-manager/api-report.md +++ b/plugins/git-release-manager/api-report.md @@ -263,7 +263,6 @@ export const gitReleaseManagerPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index 04fc26ae9a..64b0a65d87 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.37-next.3", + "version": "0.3.38-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 6b50884135..1278f32354 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-github-actions +## 0.6.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.6.5 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.6.5-next.3 ### Patch Changes diff --git a/plugins/github-actions/api-report.md b/plugins/github-actions/api-report.md index e7c6114c93..887556f431 100644 --- a/plugins/github-actions/api-report.md +++ b/plugins/github-actions/api-report.md @@ -177,7 +177,6 @@ const githubActionsPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; export { githubActionsPlugin }; diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index e2dafae029..2d48f24492 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.6.5-next.3", + "version": "0.6.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index 28cfc5a7b0..ba62f6bdc4 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-github-deployments +## 0.1.56-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.55 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.1.55-next.3 ### Patch Changes diff --git a/plugins/github-deployments/api-report.md b/plugins/github-deployments/api-report.md index 669bcd74ba..26bb108d86 100644 --- a/plugins/github-deployments/api-report.md +++ b/plugins/github-deployments/api-report.md @@ -43,7 +43,7 @@ export type GithubDeployment = { }; // @public (undocumented) -export const githubDeploymentsPlugin: BackstagePlugin<{}, {}, {}>; +export const githubDeploymentsPlugin: BackstagePlugin<{}, {}>; // @public (undocumented) export const GithubDeploymentsTable: { diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 6ee68a87c7..71fa3a7459 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.55-next.3", + "version": "0.1.56-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 72a7c86175..a20c93cdeb 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-github-issues +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.2.13-next.3 ### Patch Changes diff --git a/plugins/github-issues/api-report.md b/plugins/github-issues/api-report.md index 3c7b616f82..0efa863a01 100644 --- a/plugins/github-issues/api-report.md +++ b/plugins/github-issues/api-report.md @@ -52,7 +52,6 @@ export const githubIssuesPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index ffd2b361dc..5b0d34effe 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.13-next.3", + "version": "0.2.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index 8a50ab7e9c..89957b1232 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.1.18 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/theme@0.4.2 + ## 0.1.18-next.3 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index a7a398abf5..c81a7c76d7 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.18-next.3", + "version": "0.1.19-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index 357cf5e6d7..81f51796c4 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-gitops-profiles +## 0.3.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/theme@0.4.2 + +## 0.3.40 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.40-next.3 ### Patch Changes diff --git a/plugins/gitops-profiles/api-report.md b/plugins/gitops-profiles/api-report.md index 3dc3c9add2..97f3a9864b 100644 --- a/plugins/gitops-profiles/api-report.md +++ b/plugins/gitops-profiles/api-report.md @@ -124,7 +124,6 @@ const gitopsProfilesPlugin: BackstagePlugin< }>; createPage: RouteRef<undefined>; }, - {}, {} >; export { gitopsProfilesPlugin }; diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index 032e6d1fcf..56364215c5 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.40-next.3", + "version": "0.3.41-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 4d605314fc..705ff97e0a 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-gocd +## 0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.30 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.30-next.3 ### Patch Changes diff --git a/plugins/gocd/api-report.md b/plugins/gocd/api-report.md index df93b5f2eb..de2c76e06b 100644 --- a/plugins/gocd/api-report.md +++ b/plugins/gocd/api-report.md @@ -15,7 +15,7 @@ export const EntityGoCdContent: () => JSX.Element; export const GOCD_PIPELINES_ANNOTATION = 'gocd.org/pipelines'; // @public -export const gocdPlugin: BackstagePlugin<{}, {}, {}>; +export const gocdPlugin: BackstagePlugin<{}, {}>; // @public export const isGoCdAvailable: (entity: Entity) => boolean; diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index 1bb5c1dc81..4d6f41ec62 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.30-next.3", + "version": "0.1.31-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index 078a291d24..429ca2496b 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-graphiql +## 0.2.55-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + - @backstage/theme@0.4.2 + +## 0.2.54 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- b2fbeed5403b: Add support for using the FetchApi +- cf950c3b6eab: Added experimental exports for the new frontend system under `/alpha`. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/frontend-plugin-api@0.1.0 + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.2.54-next.3 ### Patch Changes diff --git a/plugins/graphiql/api-report.md b/plugins/graphiql/api-report.md index cbecc37006..984b90ae88 100644 --- a/plugins/graphiql/api-report.md +++ b/plugins/graphiql/api-report.md @@ -44,7 +44,7 @@ export const GraphiQLIcon: IconComponent; export const GraphiQLPage: () => JSX_2.Element; // @public (undocumented) -const graphiqlPlugin: BackstagePlugin<{}, {}, {}>; +const graphiqlPlugin: BackstagePlugin<{}, {}>; export { graphiqlPlugin }; export { graphiqlPlugin as plugin }; diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index 29b8163c7b..15fc394ba0 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.54-next.3", + "version": "0.2.55-next.0", "publishConfig": { "access": "public" }, diff --git a/plugins/graphiql/src/alpha.tsx b/plugins/graphiql/src/alpha.tsx index 3d1bf839af..9cd956fc1a 100644 --- a/plugins/graphiql/src/alpha.tsx +++ b/plugins/graphiql/src/alpha.tsx @@ -19,6 +19,7 @@ import { createApiExtension, createExtension, createExtensionDataRef, + createExtensionInput, createNavItemExtension, createPageExtension, createPlugin, @@ -64,11 +65,9 @@ const endpointDataRef = createExtensionDataRef<GraphQLEndpoint>( export const graphiqlBrowseApi = createApiExtension({ api: graphQlBrowseApiRef, // apis.plugin.graphiql.browse inputs: { - endpoints: { - extensionData: { - endpoint: endpointDataRef, - }, - }, + endpoints: createExtensionInput({ + endpoint: endpointDataRef, + }), }, factory({ inputs }) { return createApiFactory( diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 1a62048007..fbe80e1091 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-graphql-backend +## 0.1.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-catalog-graphql@0.3.23 + +## 0.1.41 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-catalog-graphql@0.3.23 + ## 0.1.41-next.3 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 7582c150cb..11fd377905 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.41-next.3", + "version": "0.1.43-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md index f08159c76d..ef1eb4a5c1 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-graphql-voyager +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## 0.1.7 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/graphql-voyager/api-report.md b/plugins/graphql-voyager/api-report.md index 257a8ca7b7..e926bbd193 100644 --- a/plugins/graphql-voyager/api-report.md +++ b/plugins/graphql-voyager/api-report.md @@ -59,7 +59,6 @@ export const graphqlVoyagerPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index df62a7e9a2..24901e8c17 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-voyager", "description": "Backstage plugin for GraphQL Voyager", - "version": "0.1.7-next.3", + "version": "0.1.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index ebd48bd7ef..197ba61e80 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-home-react +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + +## 0.1.3 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + ## 0.1.3-next.3 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index 792e4f8ebe..f01adae751 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home-react", "description": "A Backstage plugin that contains react components helps you build a home page", - "version": "0.1.3-next.3", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 41c1271790..f8bd2aab50 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-home +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-home-react@0.1.4-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.5.8 + +### Patch Changes + +- 2bc96ce69eea: Fixed a bug where customizable home page cards would render missing their normal borders. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 98bb77c1f0b8: Align zod dependency to align with other packages. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 1853ffa09b50: Allow specifying static widgets to custom home page +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.5.8-next.3 ### Patch Changes diff --git a/plugins/home/api-report.md b/plugins/home/api-report.md index 450bc054fa..497b11224d 100644 --- a/plugins/home/api-report.md +++ b/plugins/home/api-report.md @@ -137,7 +137,6 @@ export const homePlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/home/package.json b/plugins/home/package.json index e403bf7328..bba62e9706 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.5.8-next.3", + "version": "0.5.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index 7d11440f8a..02d39b0594 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-ilert +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.2.13-next.3 ### Patch Changes diff --git a/plugins/ilert/api-report.md b/plugins/ilert/api-report.md index b2081e049e..821a3a6bd0 100644 --- a/plugins/ilert/api-report.md +++ b/plugins/ilert/api-report.md @@ -539,7 +539,6 @@ const ilertPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; export { ilertPlugin }; diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 255b2ca27d..83cde2ff54 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.13-next.3", + "version": "0.2.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 676101785f..4bcb34c73c 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-jenkins-backend +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-jenkins-common@0.1.19 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-jenkins-common@0.1.19 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 1844f0a38d..717d94733d 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.2.6-next.3", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md index 39a9bb51a3..4fa915f473 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins-common +## 0.1.19 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + ## 0.1.19-next.2 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index fbbbcdaa15..4bf522dadd 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.19-next.2", + "version": "0.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index 8d1e20b61b..66f3d3b026 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-jenkins +## 0.8.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-jenkins-common@0.1.19 + +## 0.8.6 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-jenkins-common@0.1.19 + - @backstage/theme@0.4.2 + ## 0.8.6-next.3 ### Patch Changes diff --git a/plugins/jenkins/api-report.md b/plugins/jenkins/api-report.md index 0782f0abd2..611a56cd5f 100644 --- a/plugins/jenkins/api-report.md +++ b/plugins/jenkins/api-report.md @@ -99,7 +99,6 @@ const jenkinsPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; export { jenkinsPlugin }; diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 4cebda493e..e3042ccb53 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.8.6-next.3", + "version": "0.8.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 84c206fd0c..d5e7101f55 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-kafka-backend +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## 0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/backend-plugin-api@0.6.3 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 801e4bdc95..7afdb219ab 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.3.0-next.3", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index 0d7035392b..d741d0fe2d 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-kafka +## 0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.3.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.24-next.3 ### Patch Changes diff --git a/plugins/kafka/api-report.md b/plugins/kafka/api-report.md index 990a4da295..ba0c9a3820 100644 --- a/plugins/kafka/api-report.md +++ b/plugins/kafka/api-report.md @@ -28,7 +28,6 @@ const kafkaPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; export { kafkaPlugin }; diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 3da6d27e17..b48ee3322e 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.24-next.3", + "version": "0.3.25-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 043ffd5bb3..8fc7a281db 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,72 @@ # @backstage/plugin-kubernetes-backend +## 0.12.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## 0.12.0 + +### Minor Changes + +- 0ad36158d980: Integrators can now bring their own auth strategies through the use of the `addAuthStrategy` method on `KubernetesBuilder`. + + **BREAKING** the `ClusterDetails` interface has been refactored to add an `authMetadata` field, and the`authProvider`, `serviceAccountToken`, `assumeRole`, and `externalID` fields have all been removed -- they appear within `authMetadata` using the same keys as those read by the `catalog` cluster locator. This means that if you are using a custom cluster supplier, your code will need to be updated -- as an example, instead of returning a `ClusterDetails` like `{authProvider: 'aws'}`, you will need to return one like `{authMetadata: {['kubernetes.io/auth-provider']: 'aws'}`. + + **BREAKING** on the slight chance you were using the `setAuthTranslatorMap` method on `KubernetesBuilder`, it has been removed along with the entire `KubernetesAuthTranslator` interface. This notion has been replaced with the more focused concept of an `AuthenticationStrategy`. Converting a translator to a strategy should not be especially difficult. + +### Patch Changes + +- ccf00accb408: Add AWS Annotations to Kubernetes Cluster Resource +- 72390ab2670d: Handle Proxy WS upgrade manually for WS handshakes +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- 024b2b66a332: Fixed a bug where requests to the proxy endpoint would fail for clusters with `caFile` configured +- a8a614ba0d07: Minor `package.json` update. +- 47ea122590f5: fix "undefined" kind for custom resources +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/integration-aws-node@0.1.6 + ## 0.11.6-next.3 ### Patch Changes diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index 051706bbd5..158b917a48 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -18,7 +18,7 @@ import { Logger } from 'winston'; import type { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; -import type { RequestHandler } from 'express'; +import { RequestHandler } from 'http-proxy-middleware'; import { TokenCredential } from '@azure/identity'; // @public (undocumented) diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index f755dc2c6b..54c5a35201 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.11.6-next.3", + "version": "0.12.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -68,6 +68,7 @@ "@jest-mock/express": "^2.0.1", "@kubernetes/client-node": "0.18.1", "@types/express": "^4.17.6", + "@types/http-proxy-middleware": "^0.19.3", "@types/luxon": "^3.0.0", "compression": "^1.7.4", "cors": "^2.8.5", @@ -88,8 +89,6 @@ "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/aws4": "^1.5.1", - "@types/http-proxy-middleware": "^0.19.3", - "cross-fetch": "^3.1.5", "mock-fs": "^5.2.0", "msw": "^1.0.0", "supertest": "^6.1.3", diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index a84482082f..327d580d10 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -46,7 +46,6 @@ import { HEADER_KUBERNETES_CLUSTER, KubernetesProxy, } from './KubernetesProxy'; -import fetch from 'cross-fetch'; import type { Request } from 'express'; @@ -757,7 +756,6 @@ describe('KubernetesProxy', () => { const wsProxyAddress = `ws://127.0.0.1:${proxyPort}${proxyPath}${wsPath}`; const wsAddress = `ws://localhost:${wsPort}${wsPath}`; - console.log('Ports: ', wsProxyAddress, wsAddress); // Let this request through so it reaches the express router above worker.use( @@ -769,10 +767,6 @@ describe('KubernetesProxy', () => { ), ); - // Prepopulate the proxy so the WebSocket upgrade can happen, result doesn't actually matter - const result = await fetch(wsProxyAddress.replace('ws', 'http')); - expect(result.ok).toBeFalsy(); - const webSocket = new WebSocket(wsProxyAddress); const connectMessagePromise = eventPromiseFactory(webSocket, 'message'); diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 6e699d1220..d2a3649c27 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { ErrorResponseBody, ForwardedError, @@ -24,16 +23,18 @@ import { import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; import { kubernetesProxyPermission } from '@backstage/plugin-kubernetes-common'; import { - PermissionEvaluator, AuthorizeResult, + PermissionEvaluator, } from '@backstage/plugin-permission-common'; import { bufferFromFileOrString } from '@kubernetes/client-node'; -import type { Request, RequestHandler } from 'express'; -import { createProxyMiddleware } from 'http-proxy-middleware'; +import { createProxyMiddleware, RequestHandler } from 'http-proxy-middleware'; import { Logger } from 'winston'; + import { AuthenticationStrategy } from '../auth'; import { ClusterDetails, KubernetesClustersSupplier } from '../types/types'; +import type { Request } from 'express'; + export const APPLICATION_JSON: string = 'application/json'; /** @@ -121,7 +122,17 @@ export class KubernetesProxy { } const middleware = await this.getMiddleware(req); - middleware(req, res, next); + + // If req is an upgrade handshake, use middleware upgrade instead of http request handler https://github.com/chimurai/http-proxy-middleware#external-websocket-upgrade + if ( + req.header('connection')?.toLowerCase() === 'upgrade' && + req.header('upgrade')?.toLowerCase() === 'websocket' + ) { + // Missing the `head`, since it's optional we pass undefined to avoid type issues + middleware.upgrade!(req, req.socket, undefined); + } else { + middleware(req, res, next); + } }; } diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 7604edfb12..83451a1999 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-kubernetes-common +## 0.6.6 + +### Patch Changes + +- 0ad36158d980: Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. +- ccf00accb408: Add AWS Annotations to Kubernetes Cluster Resource +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + ## 0.6.6-next.2 ### Patch Changes diff --git a/plugins/kubernetes-common/api-report.md b/plugins/kubernetes-common/api-report.md index 051293f37f..0840278394 100644 --- a/plugins/kubernetes-common/api-report.md +++ b/plugins/kubernetes-common/api-report.md @@ -5,7 +5,9 @@ ```ts import { BasicPermission } from '@backstage/plugin-permission-common'; import { Entity } from '@backstage/catalog-model'; +import { FetchResponse as FetchResponse_2 } from '@backstage/plugin-kubernetes-common'; import type { JsonObject } from '@backstage/types'; +import { ObjectsByEntityResponse as ObjectsByEntityResponse_2 } from '@backstage/plugin-kubernetes-common'; import { PodStatus } from '@kubernetes/client-node'; import { V1ConfigMap } from '@kubernetes/client-node'; import { V1CronJob } from '@kubernetes/client-node'; @@ -174,6 +176,67 @@ export interface DeploymentFetchResponse { type: 'deployments'; } +// @public (undocumented) +export interface DeploymentResources { + // (undocumented) + deployments: V1Deployment[]; + // (undocumented) + horizontalPodAutoscalers: V1HorizontalPodAutoscaler[]; + // (undocumented) + pods: V1Pod[]; + // (undocumented) + replicaSets: V1ReplicaSet[]; +} + +// @public +export interface DetectedError { + // (undocumented) + message: string; + // (undocumented) + occurrenceCount: number; + // (undocumented) + proposedFix?: ProposedFix; + // (undocumented) + severity: ErrorSeverity; + // (undocumented) + sourceRef: ResourceRef; + // (undocumented) + type: string; +} + +// @public +export type DetectedErrorsByCluster = Map<string, DetectedError[]>; + +// @public +export const detectErrors: ( + objects: ObjectsByEntityResponse_2, +) => DetectedErrorsByCluster; + +// @public (undocumented) +export interface DocsSolution extends ProposedFixBase { + // (undocumented) + docsLink: string; + // (undocumented) + type: 'docs'; +} + +// @public (undocumented) +export interface ErrorMapper<T> { + // (undocumented) + detectErrors: (resource: T) => DetectedError[]; +} + +// @public +export type ErrorSeverity = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10; + +// @public (undocumented) +export interface EventsSolution extends ProposedFixBase { + // (undocumented) + podName: string; + // (undocumented) + type: 'events'; +} + // @public (undocumented) export type FetchResponse = | PodFetchResponse @@ -191,6 +254,29 @@ export type FetchResponse = | DaemonSetsFetchResponse | PodStatusFetchResponse; +// @public (undocumented) +export interface GroupedResponses extends DeploymentResources { + // (undocumented) + configMaps: V1ConfigMap[]; + // (undocumented) + cronJobs: V1CronJob[]; + // (undocumented) + customResources: any[]; + // (undocumented) + ingresses: V1Ingress[]; + // (undocumented) + jobs: V1Job[]; + // (undocumented) + services: V1Service[]; + // (undocumented) + statefulsets: V1StatefulSet[]; +} + +// @public (undocumented) +export const groupResponses: ( + fetchResponse: FetchResponse_2[], +) => GroupedResponses; + // @public (undocumented) export interface HorizontalPodAutoscalersFetchResponse { // (undocumented) @@ -251,6 +337,14 @@ export interface LimitRangeFetchResponse { type: 'limitranges'; } +// @public (undocumented) +export interface LogSolution extends ProposedFixBase { + // (undocumented) + container: string; + // (undocumented) + type: 'logs'; +} + // @public (undocumented) export interface ObjectsByEntityResponse { // (undocumented) @@ -273,6 +367,19 @@ export interface PodStatusFetchResponse { type: 'podstatus'; } +// @public (undocumented) +export type ProposedFix = LogSolution | DocsSolution | EventsSolution; + +// @public (undocumented) +export interface ProposedFixBase { + // (undocumented) + actions: string[]; + // (undocumented) + errorType: string; + // (undocumented) + rootCauseExplanation: string; +} + // @public (undocumented) export interface RawFetchError { // (undocumented) @@ -289,6 +396,18 @@ export interface ReplicaSetsFetchResponse { type: 'replicasets'; } +// @public +export interface ResourceRef { + // (undocumented) + apiGroup: string; + // (undocumented) + kind: string; + // (undocumented) + name: string; + // (undocumented) + namespace: string; +} + // @public (undocumented) export interface ServiceFetchResponse { // (undocumented) diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index dce023dc2d..99d38b803e 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.6.6-next.2", + "version": "0.6.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,11 +40,20 @@ }, "dependencies": { "@backstage/catalog-model": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@backstage/errors": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", - "@kubernetes/client-node": "0.18.1" + "@backstage/types": "workspace:^", + "@kubernetes/client-node": "0.18.1", + "kubernetes-models": "^4.3.1", + "lodash": "^4.17.21", + "luxon": "^3.0.0" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@backstage/core-app-api": "workspace:^", + "@backstage/test-utils": "workspace:^", + "msw": "^1.3.1" }, "jest": { "roots": [ diff --git a/plugins/kubernetes/src/error-detection/__fixtures__/deploy-bad.json b/plugins/kubernetes-common/src/error-detection/__fixtures__/deploy-bad.json similarity index 100% rename from plugins/kubernetes/src/error-detection/__fixtures__/deploy-bad.json rename to plugins/kubernetes-common/src/error-detection/__fixtures__/deploy-bad.json diff --git a/plugins/kubernetes/src/error-detection/__fixtures__/deploy-healthy.json b/plugins/kubernetes-common/src/error-detection/__fixtures__/deploy-healthy.json similarity index 100% rename from plugins/kubernetes/src/error-detection/__fixtures__/deploy-healthy.json rename to plugins/kubernetes-common/src/error-detection/__fixtures__/deploy-healthy.json diff --git a/plugins/kubernetes/src/error-detection/__fixtures__/hpa-healthy.json b/plugins/kubernetes-common/src/error-detection/__fixtures__/hpa-healthy.json similarity index 100% rename from plugins/kubernetes/src/error-detection/__fixtures__/hpa-healthy.json rename to plugins/kubernetes-common/src/error-detection/__fixtures__/hpa-healthy.json diff --git a/plugins/kubernetes/src/error-detection/__fixtures__/hpa-maxed-out.json b/plugins/kubernetes-common/src/error-detection/__fixtures__/hpa-maxed-out.json similarity index 100% rename from plugins/kubernetes/src/error-detection/__fixtures__/hpa-maxed-out.json rename to plugins/kubernetes-common/src/error-detection/__fixtures__/hpa-maxed-out.json diff --git a/plugins/kubernetes/src/error-detection/__fixtures__/pod-crashing.json b/plugins/kubernetes-common/src/error-detection/__fixtures__/pod-crashing.json similarity index 100% rename from plugins/kubernetes/src/error-detection/__fixtures__/pod-crashing.json rename to plugins/kubernetes-common/src/error-detection/__fixtures__/pod-crashing.json diff --git a/plugins/kubernetes/src/error-detection/__fixtures__/pod-missing-cm.json b/plugins/kubernetes-common/src/error-detection/__fixtures__/pod-missing-cm.json similarity index 100% rename from plugins/kubernetes/src/error-detection/__fixtures__/pod-missing-cm.json rename to plugins/kubernetes-common/src/error-detection/__fixtures__/pod-missing-cm.json diff --git a/plugins/kubernetes/src/components/Pods/__fixtures__/pod.json b/plugins/kubernetes-common/src/error-detection/__fixtures__/pod.json similarity index 100% rename from plugins/kubernetes/src/components/Pods/__fixtures__/pod.json rename to plugins/kubernetes-common/src/error-detection/__fixtures__/pod.json diff --git a/plugins/kubernetes/src/error-detection/common.ts b/plugins/kubernetes-common/src/error-detection/common.ts similarity index 100% rename from plugins/kubernetes/src/error-detection/common.ts rename to plugins/kubernetes-common/src/error-detection/common.ts diff --git a/plugins/kubernetes/src/error-detection/deployments.ts b/plugins/kubernetes-common/src/error-detection/deployments.ts similarity index 100% rename from plugins/kubernetes/src/error-detection/deployments.ts rename to plugins/kubernetes-common/src/error-detection/deployments.ts diff --git a/plugins/kubernetes/src/error-detection/error-detection.test.ts b/plugins/kubernetes-common/src/error-detection/error-detection.test.ts similarity index 100% rename from plugins/kubernetes/src/error-detection/error-detection.test.ts rename to plugins/kubernetes-common/src/error-detection/error-detection.test.ts diff --git a/plugins/kubernetes/src/error-detection/error-detection.ts b/plugins/kubernetes-common/src/error-detection/error-detection.ts similarity index 97% rename from plugins/kubernetes/src/error-detection/error-detection.ts rename to plugins/kubernetes-common/src/error-detection/error-detection.ts index c33de18b80..a3a4d58d9e 100644 --- a/plugins/kubernetes/src/error-detection/error-detection.ts +++ b/plugins/kubernetes-common/src/error-detection/error-detection.ts @@ -16,7 +16,7 @@ import { DetectedError, DetectedErrorsByCluster } from './types'; import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; -import { groupResponses } from '../utils/response'; +import { groupResponses } from '../util'; import { detectErrorsInPods } from './pods'; import { detectErrorsInDeployments } from './deployments'; import { detectErrorsInHpa } from './hpas'; diff --git a/plugins/kubernetes/src/error-detection/hpas.ts b/plugins/kubernetes-common/src/error-detection/hpas.ts similarity index 100% rename from plugins/kubernetes/src/error-detection/hpas.ts rename to plugins/kubernetes-common/src/error-detection/hpas.ts diff --git a/plugins/catalog-customized/src/index.ts b/plugins/kubernetes-common/src/error-detection/index.ts similarity index 88% rename from plugins/catalog-customized/src/index.ts rename to plugins/kubernetes-common/src/error-detection/index.ts index cc8aefeaa6..0b79b023c2 100644 --- a/plugins/catalog-customized/src/index.ts +++ b/plugins/kubernetes-common/src/error-detection/index.ts @@ -13,6 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import './plugin'; -export * from '@backstage/plugin-catalog'; +export * from './types'; +export { detectErrors } from './error-detection'; diff --git a/plugins/kubernetes/src/error-detection/pods.ts b/plugins/kubernetes-common/src/error-detection/pods.ts similarity index 100% rename from plugins/kubernetes/src/error-detection/pods.ts rename to plugins/kubernetes-common/src/error-detection/pods.ts diff --git a/plugins/kubernetes/src/error-detection/types.ts b/plugins/kubernetes-common/src/error-detection/types.ts similarity index 93% rename from plugins/kubernetes/src/error-detection/types.ts rename to plugins/kubernetes-common/src/error-detection/types.ts index 4148056171..bf918bbacb 100644 --- a/plugins/kubernetes/src/error-detection/types.ts +++ b/plugins/kubernetes-common/src/error-detection/types.ts @@ -54,29 +54,35 @@ export interface DetectedError { occurrenceCount: number; } +/** @public */ export type ProposedFix = LogSolution | DocsSolution | EventsSolution; -interface ProposedFixBase { +/** @public */ +export interface ProposedFixBase { errorType: string; rootCauseExplanation: string; actions: string[]; } +/** @public */ export interface LogSolution extends ProposedFixBase { type: 'logs'; container: string; } +/** @public */ export interface DocsSolution extends ProposedFixBase { type: 'docs'; docsLink: string; } +/** @public */ export interface EventsSolution extends ProposedFixBase { type: 'events'; podName: string; } +/** @public */ export interface ErrorMapper<T> { detectErrors: (resource: T) => DetectedError[]; } diff --git a/plugins/kubernetes-common/src/index.ts b/plugins/kubernetes-common/src/index.ts index d5cf8dcf61..6704242383 100644 --- a/plugins/kubernetes-common/src/index.ts +++ b/plugins/kubernetes-common/src/index.ts @@ -26,3 +26,5 @@ export { kubernetesProxyPermission, kubernetesPermissions, } from './permissions'; +export * from './error-detection'; +export * from './util'; diff --git a/plugins/kubernetes-common/src/types.ts b/plugins/kubernetes-common/src/types.ts index feb213d520..9648293432 100644 --- a/plugins/kubernetes-common/src/types.ts +++ b/plugins/kubernetes-common/src/types.ts @@ -262,3 +262,22 @@ export interface ClientPodStatus { memory: ClientCurrentResourceUsage; containers: ClientContainerStatus[]; } + +/** @public */ +export interface DeploymentResources { + pods: V1Pod[]; + replicaSets: V1ReplicaSet[]; + deployments: V1Deployment[]; + horizontalPodAutoscalers: V1HorizontalPodAutoscaler[]; +} + +/** @public */ +export interface GroupedResponses extends DeploymentResources { + services: V1Service[]; + configMaps: V1ConfigMap[]; + ingresses: V1Ingress[]; + jobs: V1Job[]; + cronJobs: V1CronJob[]; + customResources: any[]; + statefulsets: V1StatefulSet[]; +} diff --git a/plugins/kubernetes/src/components/Cluster/index.ts b/plugins/kubernetes-common/src/util/index.ts similarity index 94% rename from plugins/kubernetes/src/components/Cluster/index.ts rename to plugins/kubernetes-common/src/util/index.ts index dc9df63d42..1cc287df08 100644 --- a/plugins/kubernetes/src/components/Cluster/index.ts +++ b/plugins/kubernetes-common/src/util/index.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { Cluster } from './Cluster'; + +export * from './response'; diff --git a/plugins/kubernetes/src/utils/response.ts b/plugins/kubernetes-common/src/util/response.ts similarity index 95% rename from plugins/kubernetes/src/utils/response.ts rename to plugins/kubernetes-common/src/util/response.ts index 894b881f22..a86d90f780 100644 --- a/plugins/kubernetes/src/utils/response.ts +++ b/plugins/kubernetes-common/src/util/response.ts @@ -15,12 +15,13 @@ */ import { FetchResponse } from '@backstage/plugin-kubernetes-common'; -import { GroupedResponses } from '../types/types'; +import { GroupedResponses } from '../types'; -// TODO this could probably be a lodash groupBy +/** @public */ export const groupResponses = ( fetchResponse: FetchResponse[], ): GroupedResponses => { + // TODO this could probably be a lodash groupBy return fetchResponse.reduce( (prev, next) => { switch (next.type) { diff --git a/plugins/kubernetes-react/.eslintrc.js b/plugins/kubernetes-react/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/kubernetes-react/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/kubernetes-react/README.md b/plugins/kubernetes-react/README.md new file mode 100644 index 0000000000..02963c2e0a --- /dev/null +++ b/plugins/kubernetes-react/README.md @@ -0,0 +1,5 @@ +# @backstage/plugin-kubernetes-react + +Welcome to the web library package for the kubernetes-react plugin! + +_This plugin was created through the Backstage CLI_ diff --git a/plugins/kubernetes-react/api-report.md b/plugins/kubernetes-react/api-report.md new file mode 100644 index 0000000000..e182524426 --- /dev/null +++ b/plugins/kubernetes-react/api-report.md @@ -0,0 +1,751 @@ +## API Report File for "@backstage/plugin-kubernetes-react" + +> 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 { AsyncState } from 'react-use/lib/useAsyncFn'; +import { ClientContainerStatus } from '@backstage/plugin-kubernetes-common'; +import { ClientPodStatus } from '@backstage/plugin-kubernetes-common'; +import { ClusterAttributes } from '@backstage/plugin-kubernetes-common'; +import { ClusterObjects } from '@backstage/plugin-kubernetes-common'; +import { CustomObjectsByEntityRequest } from '@backstage/plugin-kubernetes-common'; +import { CustomResourceMatcher } from '@backstage/plugin-kubernetes-common'; +import { DetectedError } from '@backstage/plugin-kubernetes-common'; +import { DetectedErrorsByCluster } from '@backstage/plugin-kubernetes-common'; +import { DiscoveryApi } from '@backstage/core-plugin-api'; +import { Entity } from '@backstage/catalog-model'; +import { Event as Event_2 } from 'kubernetes-models/v1'; +import { GroupedResponses } from '@backstage/plugin-kubernetes-common'; +import { IContainer } from 'kubernetes-models/v1'; +import { IContainerStatus } from 'kubernetes-models/v1'; +import { IdentityApi } from '@backstage/core-plugin-api'; +import { IIoK8sApimachineryPkgApisMetaV1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; +import { OAuthApi } from '@backstage/core-plugin-api'; +import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; +import { OpenIdConnectApi } from '@backstage/core-plugin-api'; +import { Pod } from 'kubernetes-models/v1'; +import { Pod as Pod_2 } from 'kubernetes-models/v1/Pod'; +import { default as React_2 } from 'react'; +import * as React_3 from 'react'; +import { TypeMeta } from '@kubernetes-models/base'; +import { V1HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import { V1Job } from '@kubernetes/client-node'; +import { V1ObjectMeta } from '@kubernetes/client-node'; +import { V1Pod } from '@kubernetes/client-node'; +import { WorkloadsByEntityRequest } from '@backstage/plugin-kubernetes-common'; + +// @public (undocumented) +export class AksKubernetesAuthProvider implements KubernetesAuthProvider { + constructor(microsoftAuthApi: OAuthApi); + // (undocumented) + decorateRequestBodyForAuth( + requestBody: KubernetesRequestBody, + ): Promise<KubernetesRequestBody>; + // (undocumented) + getCredentials(): Promise<{ + token?: string; + }>; +} + +// @public +export const Cluster: ({ + clusterObjects, + podsWithErrors, +}: ClusterProps) => React_2.JSX.Element; + +// @public (undocumented) +export const ClusterContext: React_2.Context<ClusterAttributes>; + +// @public +export type ClusterProps = { + clusterObjects: ClusterObjects; + podsWithErrors: Set<string>; + children?: React_2.ReactNode; +}; + +// @public +export const ContainerCard: React_2.FC<ContainerCardProps>; + +// @public +export interface ContainerCardProps { + // (undocumented) + containerMetrics?: ClientContainerStatus; + // (undocumented) + containerSpec?: IContainer; + // (undocumented) + containerStatus: IContainerStatus; + // (undocumented) + podScope: PodScope; +} + +// @public +export interface ContainerScope extends PodScope { + // (undocumented) + containerName: string; +} + +// @public (undocumented) +export const CronJobsAccordions: ({}: CronJobsAccordionsProps) => React_2.JSX.Element; + +// @public (undocumented) +export type CronJobsAccordionsProps = { + children?: React_2.ReactNode; +}; + +// @public (undocumented) +export const CustomResources: ({}: CustomResourcesProps) => React_2.JSX.Element; + +// @public (undocumented) +export interface CustomResourcesProps { + // (undocumented) + children?: React_2.ReactNode; +} + +// @public +export const DetectedErrorsContext: React_2.Context<DetectedError[]>; + +// @public +export const ErrorList: ({ + podAndErrors, +}: ErrorListProps) => React_2.JSX.Element; + +// @public +export interface ErrorListProps { + // (undocumented) + podAndErrors: PodAndErrors[]; +} + +// @public (undocumented) +export type ErrorMatcher = { + metadata?: IIoK8sApimachineryPkgApisMetaV1ObjectMeta; +} & TypeMeta; + +// @public (undocumented) +export const ErrorPanel: ({ + entityName, + errorMessage, + clustersWithErrors, +}: ErrorPanelProps) => React_2.JSX.Element; + +// @public (undocumented) +export type ErrorPanelProps = { + entityName: string; + errorMessage?: string; + clustersWithErrors?: ClusterObjects[]; + children?: React_2.ReactNode; +}; + +// @public (undocumented) +export const ErrorReporting: ({ + detectedErrors, +}: ErrorReportingProps) => React_3.JSX.Element; + +// @public (undocumented) +export type ErrorReportingProps = { + detectedErrors: DetectedErrorsByCluster; +}; + +// @public +export const Events: ({ + involvedObjectName, + namespace, + clusterName, + warningEventsOnly, +}: EventsProps) => React_2.JSX.Element; + +// @public +export const EventsContent: ({ + events, + warningEventsOnly, +}: EventsContentProps) => React_2.JSX.Element; + +// @public +export interface EventsContentProps { + // (undocumented) + events: Event_2[]; + // (undocumented) + warningEventsOnly?: boolean; +} + +// @public +export interface EventsOptions { + // (undocumented) + clusterName: string; + // (undocumented) + involvedObjectName: string; + // (undocumented) + namespace: string; +} + +// @public +export interface EventsProps { + // (undocumented) + clusterName: string; + // (undocumented) + involvedObjectName: string; + // (undocumented) + namespace: string; + // (undocumented) + warningEventsOnly?: boolean; +} + +// @public +export const FixDialog: React_2.FC<FixDialogProps>; + +// @public +export interface FixDialogProps { + // (undocumented) + clusterName: string; + // (undocumented) + error: DetectedError; + // (undocumented) + open?: boolean; + // (undocumented) + pod: Pod_2; +} + +// @public (undocumented) +export class GoogleKubernetesAuthProvider implements KubernetesAuthProvider { + constructor(authProvider: OAuthApi); + // (undocumented) + authProvider: OAuthApi; + // (undocumented) + decorateRequestBodyForAuth( + requestBody: KubernetesRequestBody, + ): Promise<KubernetesRequestBody>; + // (undocumented) + getCredentials(): Promise<{ + token: string; + }>; +} + +// @public (undocumented) +export const GroupedResponsesContext: React_2.Context<GroupedResponses>; + +// @public (undocumented) +export const HorizontalPodAutoscalerDrawer: (props: { + hpa: V1HorizontalPodAutoscaler; + expanded?: boolean; + children?: React_2.ReactNode; +}) => React_2.JSX.Element; + +// @public (undocumented) +export const IngressesAccordions: ({}: IngressesAccordionsProps) => React_2.JSX.Element; + +// @public (undocumented) +export type IngressesAccordionsProps = {}; + +// @public (undocumented) +export const JobsAccordions: ({ + jobs, +}: JobsAccordionsProps) => React_2.JSX.Element; + +// @public (undocumented) +export type JobsAccordionsProps = { + jobs: V1Job[]; + children?: React_2.ReactNode; +}; + +// @public (undocumented) +export interface KubernetesApi { + // (undocumented) + getClusters(): Promise< + { + name: string; + authProvider: string; + oidcTokenProvider?: string | undefined; + }[] + >; + // (undocumented) + getCustomObjectsByEntity( + request: CustomObjectsByEntityRequest, + ): Promise<ObjectsByEntityResponse>; + // (undocumented) + getObjectsByEntity( + requestBody: KubernetesRequestBody, + ): Promise<ObjectsByEntityResponse>; + // (undocumented) + getWorkloadsByEntity( + request: WorkloadsByEntityRequest, + ): Promise<ObjectsByEntityResponse>; + // (undocumented) + proxy(options: { + clusterName: string; + path: string; + init?: RequestInit; + }): Promise<Response>; +} + +// @public (undocumented) +export const kubernetesApiRef: ApiRef<KubernetesApi>; + +// @public (undocumented) +export interface KubernetesAuthProvider { + // (undocumented) + decorateRequestBodyForAuth( + requestBody: KubernetesRequestBody, + ): Promise<KubernetesRequestBody>; + // (undocumented) + getCredentials(): Promise<{ + token?: string; + }>; +} + +// @public (undocumented) +export class KubernetesAuthProviders implements KubernetesAuthProvidersApi { + constructor(options: { + microsoftAuthApi: OAuthApi; + googleAuthApi: OAuthApi; + oidcProviders?: { + [key: string]: OpenIdConnectApi; + }; + }); + // (undocumented) + decorateRequestBodyForAuth( + authProvider: string, + requestBody: KubernetesRequestBody, + ): Promise<KubernetesRequestBody>; + // (undocumented) + getCredentials(authProvider: string): Promise<{ + token?: string; + }>; +} + +// @public (undocumented) +export interface KubernetesAuthProvidersApi { + // (undocumented) + decorateRequestBodyForAuth( + authProvider: string, + requestBody: KubernetesRequestBody, + ): Promise<KubernetesRequestBody>; + // (undocumented) + getCredentials(authProvider: string): Promise<{ + token?: string; + }>; +} + +// @public (undocumented) +export const kubernetesAuthProvidersApiRef: ApiRef<KubernetesAuthProvidersApi>; + +// @public (undocumented) +export class KubernetesBackendClient implements KubernetesApi { + constructor(options: { + discoveryApi: DiscoveryApi; + identityApi: IdentityApi; + kubernetesAuthProvidersApi: KubernetesAuthProvidersApi; + }); + // (undocumented) + getClusters(): Promise< + { + name: string; + authProvider: string; + }[] + >; + // (undocumented) + getCustomObjectsByEntity( + request: CustomObjectsByEntityRequest, + ): Promise<ObjectsByEntityResponse>; + // (undocumented) + getObjectsByEntity( + requestBody: KubernetesRequestBody, + ): Promise<ObjectsByEntityResponse>; + // (undocumented) + getWorkloadsByEntity( + request: WorkloadsByEntityRequest, + ): Promise<ObjectsByEntityResponse>; + // (undocumented) + proxy(options: { + clusterName: string; + path: string; + init?: RequestInit; + }): Promise<Response>; +} + +// @public +export const KubernetesDrawer: ({ + open, + label, + drawerContentsHeader, + kubernetesObject, + children, +}: KubernetesDrawerProps) => React_2.JSX.Element; + +// @public (undocumented) +export interface KubernetesDrawerable { + // (undocumented) + metadata?: V1ObjectMeta; +} + +// @public +export interface KubernetesDrawerProps { + // (undocumented) + children?: React_2.ReactNode; + // (undocumented) + drawerContentsHeader?: React_2.ReactNode; + // (undocumented) + kubernetesObject: KubernetesObject; + // (undocumented) + label: React_2.ReactNode; + // (undocumented) + open?: boolean; +} + +// @public +export interface KubernetesObject { + // (undocumented) + kind: string; + // (undocumented) + metadata?: IObjectMeta; +} + +// @public (undocumented) +export interface KubernetesObjects { + // (undocumented) + error?: string; + // (undocumented) + kubernetesObjects?: ObjectsByEntityResponse; + // (undocumented) + loading: boolean; +} + +// @public (undocumented) +export interface KubernetesProxyApi { + // (undocumented) + getEventsByInvolvedObjectName(request: { + clusterName: string; + involvedObjectName: string; + namespace: string; + }): Promise<Event_2[]>; + // (undocumented) + getPodLogs(request: { + podName: string; + namespace: string; + clusterName: string; + containerName: string; + previous?: boolean; + }): Promise<{ + text: string; + }>; +} + +// @public (undocumented) +export const kubernetesProxyApiRef: ApiRef<KubernetesProxyApi>; + +// @public +export class KubernetesProxyClient { + constructor(options: { kubernetesApi: KubernetesApi }); + // (undocumented) + getEventsByInvolvedObjectName({ + clusterName, + involvedObjectName, + namespace, + }: { + clusterName: string; + involvedObjectName: string; + namespace: string; + }): Promise<Event_2[]>; + // (undocumented) + getPodLogs({ + podName, + namespace, + clusterName, + containerName, + previous, + }: { + podName: string; + namespace: string; + clusterName: string; + containerName: string; + previous?: boolean; + }): Promise<{ + text: string; + }>; +} + +// @public (undocumented) +export const KubernetesStructuredMetadataTableDrawer: < + T extends KubernetesDrawerable, +>({ + object, + renderObject, + kind, + buttonVariant, + expanded, + children, +}: KubernetesStructuredMetadataTableDrawerProps<T>) => React_2.JSX.Element; + +// @public (undocumented) +export interface KubernetesStructuredMetadataTableDrawerProps< + T extends KubernetesDrawerable, +> { + // (undocumented) + buttonVariant?: 'h5' | 'subtitle2'; + // (undocumented) + children?: React_2.ReactNode; + // (undocumented) + expanded?: boolean; + // (undocumented) + kind: string; + // (undocumented) + object: T; + // (undocumented) + renderObject: (obj: T) => object; +} + +// @public (undocumented) +export const LinkErrorPanel: ({ + cluster, + errorMessage, +}: LinkErrorPanelProps) => React_2.JSX.Element; + +// @public (undocumented) +export type LinkErrorPanelProps = { + cluster: ClusterAttributes; + errorMessage?: string; + children?: React_2.ReactNode; +}; + +// @public +export const ManifestYaml: ({ + object, +}: ManifestYamlProps) => React_2.JSX.Element; + +// @public +export interface ManifestYamlProps { + // (undocumented) + object: object; +} + +// @public (undocumented) +export class OidcKubernetesAuthProvider implements KubernetesAuthProvider { + constructor(providerName: string, authProvider: OpenIdConnectApi); + // (undocumented) + authProvider: OpenIdConnectApi; + // (undocumented) + decorateRequestBodyForAuth( + requestBody: KubernetesRequestBody, + ): Promise<KubernetesRequestBody>; + // (undocumented) + getCredentials(): Promise<{ + token: string; + }>; + // (undocumented) + providerName: string; +} + +// @public +export const PendingPodContent: ({ + pod, +}: PendingPodContentProps) => React_2.JSX.Element; + +// @public +export interface PendingPodContentProps { + // (undocumented) + pod: Pod; +} + +// @public +export interface PodAndErrors { + // (undocumented) + clusterName: string; + // (undocumented) + errors: DetectedError[]; + // (undocumented) + pod: Pod; +} + +// @public (undocumented) +export type PodColumns = 'READY' | 'RESOURCE'; + +// @public +export const PodDrawer: ({ + podAndErrors, + open, +}: PodDrawerProps) => React_2.JSX.Element; + +// @public +export interface PodDrawerProps { + // (undocumented) + open?: boolean; + // (undocumented) + podAndErrors: PodAndErrors; +} + +// @public +export const PodExecTerminal: ( + props: PodExecTerminalProps, +) => React_2.JSX.Element; + +// @public +export const PodExecTerminalDialog: ( + props: PodExecTerminalProps, +) => React_2.JSX.Element; + +// @public +export interface PodExecTerminalProps { + // (undocumented) + clusterName: string; + // (undocumented) + containerName: string; + // (undocumented) + podName: string; + // (undocumented) + podNamespace: string; +} + +// @public +export const PodLogs: React_2.FC<PodLogsProps>; + +// @public +export const PodLogsDialog: ({ + containerScope, +}: PodLogsDialogProps) => React_2.JSX.Element; + +// @public +export interface PodLogsDialogProps { + // (undocumented) + containerScope: ContainerScope; +} + +// @public +export interface PodLogsOptions { + // (undocumented) + containerScope: ContainerScope; + // (undocumented) + previous?: boolean; +} + +// @public +export interface PodLogsProps { + // (undocumented) + containerScope: ContainerScope; + // (undocumented) + previous?: boolean; +} + +// @public +export const PodMetricsContext: React_2.Context<Map<string, ClientPodStatus[]>>; + +// @public (undocumented) +export type PodMetricsMatcher = { + metadata?: IObjectMeta; +}; + +// @public (undocumented) +export const PodNamesWithErrorsContext: React_2.Context<Set<string>>; + +// @public (undocumented) +export const PodNamesWithMetricsContext: React_2.Context< + Map<string, ClientPodStatus> +>; + +// @public +export interface PodScope { + // (undocumented) + clusterName: string; + // (undocumented) + podName: string; + // (undocumented) + podNamespace: string; +} + +// @public (undocumented) +export const PodsTable: ({ + pods, + extraColumns, +}: PodsTablesProps) => React_2.JSX.Element; + +// @public (undocumented) +export type PodsTablesProps = { + pods: Pod_2 | V1Pod[]; + extraColumns?: PodColumns[]; + children?: React_2.ReactNode; +}; + +// @public (undocumented) +export const READY_COLUMNS: PodColumns; + +// @public (undocumented) +export const RESOURCE_COLUMNS: PodColumns; + +// @public +export const ResourceUtilization: ({ + compressed, + title, + usage, + total, + totalFormatted, +}: ResourceUtilizationProps) => React_2.JSX.Element; + +// @public +export interface ResourceUtilizationProps { + // (undocumented) + compressed?: boolean; + // (undocumented) + title: string; + // (undocumented) + total: number | string; + // (undocumented) + totalFormatted: string; + // (undocumented) + usage: number | string; +} + +// @public +export class ServerSideKubernetesAuthProvider + implements KubernetesAuthProvider +{ + // (undocumented) + decorateRequestBodyForAuth( + requestBody: KubernetesRequestBody, + ): Promise<KubernetesRequestBody>; + // (undocumented) + getCredentials(): Promise<{}>; +} + +// @public (undocumented) +export const ServicesAccordions: ({}: ServicesAccordionsProps) => React_2.JSX.Element; + +// @public (undocumented) +export type ServicesAccordionsProps = {}; + +// @public +export const useCustomResources: ( + entity: Entity, + customResourceMatchers: CustomResourceMatcher[], + intervalMs?: number, +) => KubernetesObjects; + +// @public +export const useEvents: ({ + involvedObjectName, + namespace, + clusterName, +}: EventsOptions) => AsyncState<Event_2[]>; + +// @public (undocumented) +export const useKubernetesObjects: ( + entity: Entity, + intervalMs?: number, +) => KubernetesObjects; + +// @public +export const useMatchingErrors: (matcher: ErrorMatcher) => DetectedError[]; + +// @public +export const usePodLogs: ({ + containerScope, + previous, +}: PodLogsOptions) => AsyncState<{ + text: string; +}>; + +// @public +export const usePodMetrics: ( + clusterName: string, + matcher: PodMetricsMatcher, +) => ClientPodStatus | undefined; +``` diff --git a/plugins/kubernetes-react/catalog-info.yaml b/plugins/kubernetes-react/catalog-info.yaml new file mode 100644 index 0000000000..a2fb40d32c --- /dev/null +++ b/plugins/kubernetes-react/catalog-info.yaml @@ -0,0 +1,11 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-kubernetes-react + title: '@backstage/plugin-kubernetes-react' + description: >- + Shared frontend utilities for Kubernetes plugins +spec: + lifecycle: experimental + type: backstage-web-library + owner: kubernetes-maintainers diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json new file mode 100644 index 0000000000..5c95b29870 --- /dev/null +++ b/plugins/kubernetes-react/package.json @@ -0,0 +1,66 @@ +{ + "name": "@backstage/plugin-kubernetes-react", + "description": "Web library for the kubernetes-react plugin", + "version": "0.0.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" + }, + "sideEffects": false, + "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/catalog-model": "workspace:^", + "@backstage/core-components": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/plugin-kubernetes-common": "workspace:^", + "@backstage/types": "workspace:^", + "@kubernetes-models/apimachinery": "^1.1.0", + "@kubernetes-models/base": "^4.0.1", + "@kubernetes/client-node": "^0.19.0", + "@material-ui/core": "^4.9.13", + "@material-ui/icons": "^4.11.3", + "@material-ui/lab": "^4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", + "cronstrue": "^2.32.0", + "js-yaml": "^4.1.0", + "kubernetes-models": "^4.3.1", + "lodash": "^4.17.21", + "luxon": "^3.0.0", + "react-use": "^17.4.0", + "xterm": "^5.3.0", + "xterm-addon-attach": "^0.9.0", + "xterm-addon-fit": "^0.8.0" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/core-app-api": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3", + "@testing-library/react-hooks": "^8.0.1", + "jest-websocket-mock": "^2.5.0", + "msw": "^1.3.1" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/kubernetes-react/src/__fixtures__/1-cronjobs.json b/plugins/kubernetes-react/src/__fixtures__/1-cronjobs.json new file mode 100644 index 0000000000..1edc43710d --- /dev/null +++ b/plugins/kubernetes-react/src/__fixtures__/1-cronjobs.json @@ -0,0 +1,446 @@ +{ + "cronJobs": [ + { + "metadata": { + "name": "dice-roller-cronjob", + "namespace": "default", + "uid": "9ea073bc-7a4b-4b99-8321-0305bce85568", + "resourceVersion": "1362732552", + "creationTimestamp": "2021-07-16T22:39:58Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "annotations": {} + }, + "spec": { + "schedule": "30 5 * * *", + "startingDeadlineSeconds": 1800, + "concurrencyPolicy": "Forbid", + "suspend": false, + "jobTemplate": { + "metadata": { "creationTimestamp": null }, + "spec": { + "backoffLimit": 2, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "annotations": {} + }, + "spec": { + "containers": [ + { + "name": "busybox", + "image": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "IfNotPresent", + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"] + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "securityContext": {}, + "schedulerName": "default-scheduler" + } + } + } + }, + "successfulJobsHistoryLimit": 2, + "failedJobsHistoryLimit": 2 + }, + "status": { + "active": [ + { + "kind": "Job", + "namespace": "default", + "name": "dice-roller-cronjob-1637028600", + "uid": "32be1b89-5b53-45b2-aa84-277e75214f61", + "apiVersion": "batch/v1", + "resourceVersion": "1361174163" + } + ], + "lastScheduleTime": "2021-11-16T02:10:00Z" + } + } + ], + "jobs": [ + { + "metadata": { + "name": "dice-roller-cronjob-1637025000", + "namespace": "default", + "uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "resourceVersion": "1361029181", + "creationTimestamp": "2021-11-16T01:10:24Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "ownerReferences": [ + { + "apiVersion": "batch/v1", + "kind": "CronJob", + "name": "dice-roller-cronjob", + "uid": "9ea073bc-7a4b-4b99-8321-0305bce85568", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "parallelism": 1, + "completions": 1, + "backoffLimit": 2, + "selector": { + "matchLabels": { + "controller-uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "controller-uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "job-name": "dice-roller-cronjob-1637025000" + }, + "annotations": {} + }, + "spec": { + "containers": [ + { + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"], + "image": "busybox", + "imagePullPolicy": "IfNotPresent", + "name": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "securityContext": {}, + "schedulerName": "default-scheduler" + } + } + }, + "status": { + "conditions": [ + { + "type": "Complete", + "status": "True", + "lastProbeTime": "2021-11-16T01:11:31Z", + "lastTransitionTime": "2021-11-16T01:11:31Z" + } + ], + "startTime": "2021-11-16T01:10:24Z", + "completionTime": "2021-11-16T01:11:31Z", + "succeeded": 1 + } + }, + { + "metadata": { + "name": "dice-roller-cronjob-1637028600", + "namespace": "default", + "uid": "32be1b89-5b53-45b2-aa84-277e75214f61", + "resourceVersion": "1361174166", + "creationTimestamp": "2021-11-16T02:10:22Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "ownerReferences": [ + { + "apiVersion": "batch/v1", + "kind": "CronJob", + "name": "dice-roller-cronjob", + "uid": "9ea073bc-7a4b-4b99-8321-0305bce85568", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "parallelism": 1, + "completions": 1, + "backoffLimit": 2, + "selector": { + "matchLabels": { + "controller-uid": "32be1b89-5b53-45b2-aa84-277e75214f61" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "controller-uid": "32be1b89-5b53-45b2-aa84-277e75214f61", + "job-name": "dice-roller-cronjob-1637028600" + }, + "annotations": {} + }, + "spec": { + "containers": [ + { + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"], + "image": "busybox", + "imagePullPolicy": "IfNotPresent", + "name": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "securityContext": {}, + "schedulerName": "default-scheduler" + } + } + }, + "status": { "startTime": "2021-11-16T02:10:22Z", "active": 1 } + } + ], + "pods": [ + { + "metadata": { + "name": "dice-roller-cronjob-1637025000-gstc4", + "generateName": "dice-roller-cronjob-1637025000-", + "namespace": "default", + "uid": "3b0f2b65-5ae2-441a-beda-bdc92bcafaf0", + "resourceVersion": "1361029179", + "creationTimestamp": "2021-11-16T01:10:24Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "controller-uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "job-name": "dice-roller-cronjob-1637025000" + }, + "annotations": {}, + "ownerReferences": [ + { + "apiVersion": "batch/v1", + "kind": "Job", + "name": "dice-roller-cronjob-1637025000", + "uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [], + "containers": [ + { + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"], + "image": "busybox", + "imagePullPolicy": "IfNotPresent", + "name": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "minikube", + "securityContext": {}, + "schedulerName": "default-scheduler", + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + }, + { + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + } + ], + "priority": 0, + "enableServiceLinks": true + }, + "status": { + "phase": "Succeeded", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2021-11-16T01:10:27Z", + "reason": "PodCompleted" + }, + { + "type": "Ready", + "status": "False", + "lastProbeTime": null, + "lastTransitionTime": "2021-11-16T01:11:31Z", + "reason": "PodCompleted" + }, + { + "type": "ContainersReady", + "status": "False", + "lastProbeTime": null, + "lastTransitionTime": "2021-11-16T01:11:31Z", + "reason": "PodCompleted" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2021-11-16T01:10:24Z" + } + ], + "hostIP": "192.168.49.2", + "podIP": "172.17.0.25", + "podIPs": [{ "ip": "172.17.0.25" }], + "startTime": "2021-11-16T01:10:24Z", + "containerStatuses": [ + { + "name": "busybox", + "state": { + "terminated": { + "exitCode": 0, + "reason": "Completed", + "startedAt": "2021-11-16T01:10:31Z", + "finishedAt": "2021-11-16T01:11:30Z", + "containerID": "docker://1062343e1bb3625e36717bc15617c1bbca976366c3c9dd87035c71f33d015615" + } + }, + "lastState": {}, + "ready": false, + "restartCount": 0, + "image": "busybox:latest/node", + "imageID": "docker-pullable://busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353", + "containerID": "docker://1062343e1bb3625e36717bc15617c1bbca976366c3c9dd87035c71f33d015615", + "started": false + } + ], + "qosClass": "Burstable" + } + }, + { + "metadata": { + "name": "dice-roller-cronjob-1637028600-p4mlc", + "generateName": "dice-roller-cronjob-1637028600-", + "namespace": "default", + "uid": "acddd5d2-ac7f-473b-a9d8-17a89f99ac39", + "resourceVersion": "1361174579", + "creationTimestamp": "2021-11-16T02:10:22Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "controller-uid": "32be1b89-5b53-45b2-aa84-277e75214f61", + "job-name": "dice-roller-cronjob-1637028600" + }, + "annotations": {}, + "ownerReferences": [ + { + "apiVersion": "batch/v1", + "kind": "Job", + "name": "dice-roller-cronjob-1637028600", + "uid": "32be1b89-5b53-45b2-aa84-277e75214f61", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [], + "containers": [ + { + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"], + "image": "busybox", + "imagePullPolicy": "IfNotPresent", + "name": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "minikube", + "securityContext": {}, + "schedulerName": "default-scheduler", + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + }, + { + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + } + ], + "priority": 0, + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2021-11-16T02:10:25Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2021-11-16T02:10:35Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2021-11-16T02:10:35Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2021-11-16T02:10:22Z" + } + ], + "hostIP": "192.168.49.2", + "podIP": "172.17.0.25", + "podIPs": [{ "ip": "172.17.0.25" }], + "startTime": "2021-11-16T02:10:22Z", + "containerStatuses": [ + { + "name": "busybox", + "state": { + "running": { "startedAt": "2021-11-16T02:10:31Z" } + }, + "lastState": {}, + "ready": true, + "restartCount": 0, + "image": "busybox:latest", + "imageID": "docker-pullable://busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353", + "containerID": "docker://1062343e1bb3625e36717bc15617c1bbca976366c3c9dd87035c71f33d015615", + "started": true + } + ], + "qosClass": "Burstable" + } + } + ] +} diff --git a/plugins/kubernetes-react/src/__fixtures__/1-deployments.json b/plugins/kubernetes-react/src/__fixtures__/1-deployments.json new file mode 100644 index 0000000000..5ad847dc49 --- /dev/null +++ b/plugins/kubernetes-react/src/__fixtures__/1-deployments.json @@ -0,0 +1,2911 @@ +{ + "pods": [ + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.11\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-2m5hv", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593216", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-2m5hv", + "uid": "aadb71c0-36fa-43e3-b38a-162f134d4359" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://aa4489297c34c48bb33c18474a8d2b33854a82ed42155680b259f635f556ce70", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.11", + "podIPs": [ + { + "ip": "172.17.0.11" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.7\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-4v6s8", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593221", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-4v6s8", + "uid": "32e56490-6f20-4757-991f-a0c7fb407358" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://d91cc76c41249b8d3dfcf538d180b471b2a7966aae0d17a818307c8a9b4af897", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.7", + "podIPs": [ + { + "ip": "172.17.0.7" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-24T11:39:26.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-24T11:39:26.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.6\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-24T11:39:27.000Z" + } + ], + "name": "dice-roller-6c8646bfd-b9zt5", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "503886", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-b9zt5", + "uid": "8b6601b6-469e-4e89-8fd0-abb2f1a567e4" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:26.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:26.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://c50e0d0fa96f09a2ed5df7dd5a7f7de88e6b7c7addb8f002f299d6afc52d82ce", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-24T11:39:27.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.6", + "podIPs": [ + { + "ip": "172.17.0.6" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-24T11:39:26.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.13\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-cfxqc", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593211", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-cfxqc", + "uid": "e87e1776-0ca7-41fb-aeea-e1f648387545" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:51.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://c1641d986aae424429b7c2c1117baeb17d3794f73206bd57292cdf8264f929b2", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.13", + "podIPs": [ + { + "ip": "172.17.0.13" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:51.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.15\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:54.000Z" + } + ], + "name": "dice-roller-6c8646bfd-dtv5z", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593190", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-dtv5z", + "uid": "1638a41b-e47e-4c17-a1f7-7b447df248b6" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:51.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://e62c32db58dbfe0a74b2d2cba0e0a97b7f222693c68e930037ac8738c4758ca3", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.15", + "podIPs": [ + { + "ip": "172.17.0.15" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:51.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.12\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:53.000Z" + } + ], + "name": "dice-roller-6c8646bfd-hhts2", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593186", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-hhts2", + "uid": "ea0b147a-c56a-46e6-9445-7a0b1b0ed3c0" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://bcdbc153630f90556d57ff0d62f04d847ca63a5f0a7e5d9230683623d33d4b8d", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.12", + "podIPs": [ + { + "ip": "172.17.0.12" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.14\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-j68lm", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593226", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-j68lm", + "uid": "b230ff1d-7a13-479b-9c7b-77c26bd79f62" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://30fa8a3429f86ab8e9a4cec472b79d74266609082703f48950f4aae021e9d6a2", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.14", + "podIPs": [ + { + "ip": "172.17.0.14" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.9\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:53.000Z" + } + ], + "name": "dice-roller-6c8646bfd-m6f9w", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593181", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-m6f9w", + "uid": "9b0079f6-ff29-4619-bf6e-71cc10199ac5" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://f78767ee90eedffe46ff64bfe76d7f69426800dd89f3df012daf0baf3a9c5bdd", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.9", + "podIPs": [ + { + "ip": "172.17.0.9" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-24T11:39:27.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-24T11:39:27.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.4\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-24T11:39:28.000Z" + } + ], + "name": "dice-roller-6c8646bfd-nv9pk", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "503918", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-nv9pk", + "uid": "acf7f77f-78c6-4d4b-bc73-637211770ffc" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:28.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:28.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://63dec9b32942c4b09ae43d09d6978261f674a3ee623823b8f1d20da8044c12ac", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-24T11:39:28.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.4", + "podIPs": [ + { + "ip": "172.17.0.4" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-24T11:39:27.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.10\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-pjhfj", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593205", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-pjhfj", + "uid": "78775c3a-7af2-4ebe-a676-bc2e5dfa2bcc" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://cbb83dda250db74285dcbe0b81bd0896acf402bac9710af090311f7360f824aa", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.10", + "podIPs": [ + { + "ip": "172.17.0.10" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + } + ], + "replicaSets": [ + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "10", + "deployment.kubernetes.io/max-replicas": "13", + "deployment.kubernetes.io/revision": "2" + }, + "creationTimestamp": "2020-09-24T11:39:26.000Z", + "generation": 3, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"7551e949-42d1-4061-83c5-9da107186e47\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:availableReplicas": {}, + "f:fullyLabeledReplicas": {}, + "f:observedGeneration": {}, + "f:readyReplicas": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller", + "uid": "7551e949-42d1-4061-83c5-9da107186e47" + } + ], + "resourceVersion": "593228", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + }, + "spec": { + "replicas": 10, + "selector": { + "matchLabels": { + "app": "dice-roller", + "pod-template-hash": "6c8646bfd" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "availableReplicas": 10, + "fullyLabeledReplicas": 10, + "observedGeneration": 3, + "readyReplicas": 10, + "replicas": 10 + } + } + ], + "deployments": [ + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/revision": "2", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller\",\"namespace\":\"default\"},\"spec\":{\"replicas\":10,\"selector\":{\"matchLabels\":{\"app\":\"dice-roller\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"dice-roller\",\"backstage.io/kubernetes-id\":\"dice-roller\"}},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}]}]}}}}\n" + }, + "creationTimestamp": "2020-09-23T12:00:55.000Z", + "generation": 3, + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:progressDeadlineSeconds": {}, + "f:replicas": {}, + "f:revisionHistoryLimit": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {} + } + }, + "f:strategy": { + "f:rollingUpdate": { + ".": {}, + "f:maxSurge": {}, + "f:maxUnavailable": {} + }, + "f:type": {} + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + } + }, + "manager": "kubectl", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:deployment.kubernetes.io/revision": {} + } + }, + "f:status": { + "f:availableReplicas": {}, + "f:conditions": { + ".": {}, + "k:{\"type\":\"Available\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Progressing\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:observedGeneration": {}, + "f:readyReplicas": {}, + "f:replicas": {}, + "f:updatedReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller", + "namespace": "default", + "resourceVersion": "593230", + "selfLink": "/apis/apps/v1/namespaces/default/deployments/dice-roller", + "uid": "7551e949-42d1-4061-83c5-9da107186e47" + }, + "spec": { + "progressDeadlineSeconds": 600, + "replicas": 10, + "revisionHistoryLimit": 10, + "selector": { + "matchLabels": { + "app": "dice-roller" + } + }, + "strategy": { + "rollingUpdate": { + "maxSurge": "25%", + "maxUnavailable": "25%" + }, + "type": "RollingUpdate" + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "availableReplicas": 10, + "conditions": [ + { + "lastTransitionTime": "2020-09-23T12:00:55.000Z", + "lastUpdateTime": "2020-09-24T11:39:28.000Z", + "message": "ReplicaSet \"dice-roller-6c8646bfd\" has successfully progressed.", + "reason": "NewReplicaSetAvailable", + "status": "True", + "type": "Progressing" + }, + { + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "lastUpdateTime": "2020-09-25T09:58:55.000Z", + "message": "Deployment has minimum availability.", + "reason": "MinimumReplicasAvailable", + "status": "True", + "type": "Available" + } + ], + "observedGeneration": 3, + "readyReplicas": 10, + "replicas": 10, + "updatedReplicas": 10 + } + } + ], + "horizontalPodAutoscalers": [ + { + "apiVersion": "autoscaling/v1", + "kind": "HorizontalPodAutoscaler", + "metadata": { + "annotations": { + "autoscaling.alpha.kubernetes.io/conditions": "[{\"type\":\"AbleToScale\",\"status\":\"True\",\"lastTransitionTime\":\"2021-01-05T10:26:04Z\",\"reason\":\"SucceededGetScale\",\"message\":\"the HPA controller was able to get the target's current scale\"},{\"type\":\"ScalingActive\",\"status\":\"False\",\"lastTransitionTime\":\"2021-01-05T10:26:04Z\",\"reason\":\"FailedGetResourceMetric\",\"message\":\"the HPA was unable to compute the replica count: unable to get metrics for resource cpu: no metrics returned from resource metrics API\"}]", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"autoscaling/v1\",\"kind\":\"HorizontalPodAutoscaler\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller\",\"namespace\":\"default\"},\"spec\":{\"maxReplicas\":15,\"minReplicas\":10,\"scaleTargetRef\":{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"name\":\"dice-roller\"},\"targetCPUUtilizationPercentage\":50}}\n" + }, + "creationTimestamp": "2021-01-05T10:25:48Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "autoscaling/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:maxReplicas": {}, + "f:minReplicas": {}, + "f:scaleTargetRef": { + "f:apiVersion": {}, + "f:kind": {}, + "f:name": {} + }, + "f:targetCPUUtilizationPercentage": {} + } + }, + "manager": "kubectl-client-side-apply", + "operation": "Update", + "time": "2021-01-05T10:25:48Z" + }, + { + "apiVersion": "autoscaling/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:autoscaling.alpha.kubernetes.io/conditions": {} + } + }, + "f:status": { + "f:currentReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2021-01-05T10:26:04Z" + } + ], + "name": "dice-roller", + "namespace": "default", + "resourceVersion": "598", + "selfLink": "/apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/dice-roller", + "uid": "dd7c5329-567c-43c2-b159-756808d90a8e" + }, + "spec": { + "maxReplicas": 15, + "minReplicas": 10, + "scaleTargetRef": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "dice-roller" + }, + "targetCPUUtilizationPercentage": 50 + }, + "status": { + "currentReplicas": 10, + "desiredReplicas": 0, + "currentCPUUtilizationPercentage": 30 + } + } + ] +} diff --git a/plugins/kubernetes-react/src/__fixtures__/1-statefulsets.json b/plugins/kubernetes-react/src/__fixtures__/1-statefulsets.json new file mode 100644 index 0000000000..6c04774ff1 --- /dev/null +++ b/plugins/kubernetes-react/src/__fixtures__/1-statefulsets.json @@ -0,0 +1,2912 @@ +{ + "pods": [ + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.11\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-2m5hv", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593216", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-2m5hv", + "uid": "aadb71c0-36fa-43e3-b38a-162f134d4359" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://aa4489297c34c48bb33c18474a8d2b33854a82ed42155680b259f635f556ce70", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.11", + "podIPs": [ + { + "ip": "172.17.0.11" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.7\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-4v6s8", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593221", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-4v6s8", + "uid": "32e56490-6f20-4757-991f-a0c7fb407358" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://d91cc76c41249b8d3dfcf538d180b471b2a7966aae0d17a818307c8a9b4af897", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.7", + "podIPs": [ + { + "ip": "172.17.0.7" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-24T11:39:26.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-24T11:39:26.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.6\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-24T11:39:27.000Z" + } + ], + "name": "dice-roller-6c8646bfd-b9zt5", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "503886", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-b9zt5", + "uid": "8b6601b6-469e-4e89-8fd0-abb2f1a567e4" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:26.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:26.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://c50e0d0fa96f09a2ed5df7dd5a7f7de88e6b7c7addb8f002f299d6afc52d82ce", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-24T11:39:27.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.6", + "podIPs": [ + { + "ip": "172.17.0.6" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-24T11:39:26.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.13\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-cfxqc", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593211", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-cfxqc", + "uid": "e87e1776-0ca7-41fb-aeea-e1f648387545" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:51.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://c1641d986aae424429b7c2c1117baeb17d3794f73206bd57292cdf8264f929b2", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.13", + "podIPs": [ + { + "ip": "172.17.0.13" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:51.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.15\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:54.000Z" + } + ], + "name": "dice-roller-6c8646bfd-dtv5z", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593190", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-dtv5z", + "uid": "1638a41b-e47e-4c17-a1f7-7b447df248b6" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:51.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://e62c32db58dbfe0a74b2d2cba0e0a97b7f222693c68e930037ac8738c4758ca3", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.15", + "podIPs": [ + { + "ip": "172.17.0.15" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:51.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.12\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:53.000Z" + } + ], + "name": "dice-roller-6c8646bfd-hhts2", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593186", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-hhts2", + "uid": "ea0b147a-c56a-46e6-9445-7a0b1b0ed3c0" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://bcdbc153630f90556d57ff0d62f04d847ca63a5f0a7e5d9230683623d33d4b8d", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.12", + "podIPs": [ + { + "ip": "172.17.0.12" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.14\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-j68lm", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593226", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-j68lm", + "uid": "b230ff1d-7a13-479b-9c7b-77c26bd79f62" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://30fa8a3429f86ab8e9a4cec472b79d74266609082703f48950f4aae021e9d6a2", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.14", + "podIPs": [ + { + "ip": "172.17.0.14" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.9\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:53.000Z" + } + ], + "name": "dice-roller-6c8646bfd-m6f9w", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593181", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-m6f9w", + "uid": "9b0079f6-ff29-4619-bf6e-71cc10199ac5" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://f78767ee90eedffe46ff64bfe76d7f69426800dd89f3df012daf0baf3a9c5bdd", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.9", + "podIPs": [ + { + "ip": "172.17.0.9" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-24T11:39:27.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-24T11:39:27.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.4\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-24T11:39:28.000Z" + } + ], + "name": "dice-roller-6c8646bfd-nv9pk", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "503918", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-nv9pk", + "uid": "acf7f77f-78c6-4d4b-bc73-637211770ffc" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:28.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:28.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://63dec9b32942c4b09ae43d09d6978261f674a3ee623823b8f1d20da8044c12ac", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-24T11:39:28.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.4", + "podIPs": [ + { + "ip": "172.17.0.4" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-24T11:39:27.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.10\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-pjhfj", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593205", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-pjhfj", + "uid": "78775c3a-7af2-4ebe-a676-bc2e5dfa2bcc" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://cbb83dda250db74285dcbe0b81bd0896acf402bac9710af090311f7360f824aa", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.10", + "podIPs": [ + { + "ip": "172.17.0.10" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + } + ], + "replicaSets": [ + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "10", + "deployment.kubernetes.io/max-replicas": "13", + "deployment.kubernetes.io/revision": "2" + }, + "creationTimestamp": "2020-09-24T11:39:26.000Z", + "generation": 3, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"7551e949-42d1-4061-83c5-9da107186e47\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:availableReplicas": {}, + "f:fullyLabeledReplicas": {}, + "f:observedGeneration": {}, + "f:readyReplicas": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller", + "uid": "7551e949-42d1-4061-83c5-9da107186e47" + } + ], + "resourceVersion": "593228", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + }, + "spec": { + "replicas": 10, + "selector": { + "matchLabels": { + "app": "dice-roller", + "pod-template-hash": "6c8646bfd" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "availableReplicas": 10, + "fullyLabeledReplicas": 10, + "observedGeneration": 3, + "readyReplicas": 10, + "replicas": 10 + } + } + ], + "statefulsets": [ + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/revision": "2", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"StatefulSet\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller\",\"namespace\":\"default\"},\"spec\":{\"replicas\":10,\"selector\":{\"matchLabels\":{\"app\":\"dice-roller\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"dice-roller\",\"backstage.io/kubernetes-id\":\"dice-roller\"}},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}]}]}}}}\n" + }, + "creationTimestamp": "2020-09-23T12:00:55.000Z", + "generation": 3, + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:progressDeadlineSeconds": {}, + "f:replicas": {}, + "f:revisionHistoryLimit": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {} + } + }, + "f:strategy": { + "f:rollingUpdate": { + ".": {}, + "f:maxSurge": {}, + "f:maxUnavailable": {} + }, + "f:type": {} + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + } + }, + "manager": "kubectl", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:deployment.kubernetes.io/revision": {} + } + }, + "f:status": { + "f:availableReplicas": {}, + "f:conditions": { + ".": {}, + "k:{\"type\":\"Available\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Progressing\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:observedGeneration": {}, + "f:readyReplicas": {}, + "f:replicas": {}, + "f:updatedReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller", + "namespace": "default", + "resourceVersion": "593230", + "selfLink": "/apis/apps/v1/namespaces/default/deployments/dice-roller", + "uid": "7551e949-42d1-4061-83c5-9da107186e47" + }, + "spec": { + "replicas": 10, + "revisionHistoryLimit": 10, + "selector": { + "matchLabels": { + "app": "dice-roller" + } + }, + "updateStrategy": { + "rollingUpdate": { + "maxSurge": "25%", + "maxUnavailable": "25%" + }, + "type": "RollingUpdate" + }, + "podManagementPolicy": "Parallel", + "serviceName": "dice-roller", + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "availableReplicas": 10, + "conditions": [ + { + "lastTransitionTime": "2020-09-23T12:00:55.000Z", + "lastUpdateTime": "2020-09-24T11:39:28.000Z", + "message": "ReplicaSet \"dice-roller-6c8646bfd\" has successfully progressed.", + "reason": "NewReplicaSetAvailable", + "status": "True", + "type": "Progressing" + }, + { + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "lastUpdateTime": "2020-09-25T09:58:55.000Z", + "message": "Deployment has minimum availability.", + "reason": "MinimumReplicasAvailable", + "status": "True", + "type": "Available" + } + ], + "observedGeneration": 3, + "readyReplicas": 10, + "replicas": 10, + "updatedReplicas": 10 + } + } + ], + "horizontalPodAutoscalers": [ + { + "apiVersion": "autoscaling/v1", + "kind": "HorizontalPodAutoscaler", + "metadata": { + "annotations": { + "autoscaling.alpha.kubernetes.io/conditions": "[{\"type\":\"AbleToScale\",\"status\":\"True\",\"lastTransitionTime\":\"2021-01-05T10:26:04Z\",\"reason\":\"SucceededGetScale\",\"message\":\"the HPA controller was able to get the target's current scale\"},{\"type\":\"ScalingActive\",\"status\":\"False\",\"lastTransitionTime\":\"2021-01-05T10:26:04Z\",\"reason\":\"FailedGetResourceMetric\",\"message\":\"the HPA was unable to compute the replica count: unable to get metrics for resource cpu: no metrics returned from resource metrics API\"}]", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"autoscaling/v1\",\"kind\":\"HorizontalPodAutoscaler\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller\",\"namespace\":\"default\"},\"spec\":{\"maxReplicas\":15,\"minReplicas\":10,\"scaleTargetRef\":{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"name\":\"dice-roller\"},\"targetCPUUtilizationPercentage\":50}}\n" + }, + "creationTimestamp": "2021-01-05T10:25:48Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "autoscaling/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:maxReplicas": {}, + "f:minReplicas": {}, + "f:scaleTargetRef": { + "f:apiVersion": {}, + "f:kind": {}, + "f:name": {} + }, + "f:targetCPUUtilizationPercentage": {} + } + }, + "manager": "kubectl-client-side-apply", + "operation": "Update", + "time": "2021-01-05T10:25:48Z" + }, + { + "apiVersion": "autoscaling/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:autoscaling.alpha.kubernetes.io/conditions": {} + } + }, + "f:status": { + "f:currentReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2021-01-05T10:26:04Z" + } + ], + "name": "dice-roller", + "namespace": "default", + "resourceVersion": "598", + "selfLink": "/apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/dice-roller", + "uid": "dd7c5329-567c-43c2-b159-756808d90a8e" + }, + "spec": { + "maxReplicas": 15, + "minReplicas": 10, + "scaleTargetRef": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "dice-roller" + }, + "targetCPUUtilizationPercentage": 50 + }, + "status": { + "currentReplicas": 10, + "desiredReplicas": 0, + "currentCPUUtilizationPercentage": 30 + } + } + ] +} diff --git a/plugins/kubernetes-react/src/__fixtures__/2-cronjobs.json b/plugins/kubernetes-react/src/__fixtures__/2-cronjobs.json new file mode 100644 index 0000000000..6c087023b7 --- /dev/null +++ b/plugins/kubernetes-react/src/__fixtures__/2-cronjobs.json @@ -0,0 +1,385 @@ +{ + "cronJobs": [ + { + "metadata": { + "name": "dice-roller-cronjob", + "namespace": "default", + "uid": "9ea073bc-7a4b-4b99-8321-0305bce85568", + "resourceVersion": "1362732552", + "creationTimestamp": "2021-07-16T22:39:58Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "annotations": {} + }, + "spec": { + "schedule": "* */2 * * *", + "startingDeadlineSeconds": 1800, + "concurrencyPolicy": "Forbid", + "suspend": true, + "jobTemplate": { + "metadata": { "creationTimestamp": null }, + "spec": { + "backoffLimit": 2, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "annotations": {} + }, + "spec": { + "containers": [ + { + "name": "busybox", + "image": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "IfNotPresent", + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"] + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "securityContext": {}, + "schedulerName": "default-scheduler" + } + } + } + }, + "successfulJobsHistoryLimit": 2, + "failedJobsHistoryLimit": 2 + }, + "status": { + "lastScheduleTime": "2021-11-16T02:10:00Z" + } + } + ], + "jobs": [ + { + "metadata": { + "name": "dice-roller-cronjob-1637025000", + "namespace": "default", + "uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "resourceVersion": "1361029181", + "creationTimestamp": "2021-11-16T01:10:24Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "ownerReferences": [ + { + "apiVersion": "batch/v1", + "kind": "CronJob", + "name": "dice-roller-cronjob", + "uid": "9ea073bc-7a4b-4b99-8321-0305bce85568", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "parallelism": 1, + "completions": 1, + "backoffLimit": 2, + "selector": { + "matchLabels": { + "controller-uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "controller-uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "job-name": "dice-roller-cronjob-1637025000" + }, + "annotations": {} + }, + "spec": { + "containers": [ + { + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"], + "image": "busybox", + "imagePullPolicy": "IfNotPresent", + "name": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "securityContext": {}, + "schedulerName": "default-scheduler" + } + } + }, + "status": { + "conditions": [ + { + "type": "Failed", + "status": "True", + "reason": "BackoffLimitExceeded", + "lastProbeTime": "2021-11-16T01:11:31Z", + "lastTransitionTime": "2021-11-16T01:11:31Z" + } + ], + "startTime": "2021-11-16T01:10:24Z", + "failed": 2 + } + } + ], + "pods": [ + { + "metadata": { + "name": "dice-roller-cronjob-1637025000-gstc4", + "generateName": "dice-roller-cronjob-1637025000-", + "namespace": "default", + "uid": "3b0f2b65-5ae2-441a-beda-bdc92bcafaf0", + "resourceVersion": "1361029179", + "creationTimestamp": "2021-11-16T01:10:24Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "controller-uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "job-name": "dice-roller-cronjob-1637025000" + }, + "annotations": {}, + "ownerReferences": [ + { + "apiVersion": "batch/v1", + "kind": "Job", + "name": "dice-roller-cronjob-1637025000", + "uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [], + "containers": [ + { + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"], + "image": "busybox", + "imagePullPolicy": "IfNotPresent", + "name": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "minikube", + "securityContext": {}, + "schedulerName": "default-scheduler", + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + }, + { + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + } + ], + "priority": 0, + "enableServiceLinks": true + }, + "status": { + "phase": "Failed", + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2021-11-18T19:10:13Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2021-11-18T19:11:02Z", + "message": "containers with unready status: [busybox]", + "reason": "ContainersNotReady", + "status": "False", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2021-11-18T19:11:02Z", + "message": "containers with unready status: [busybox]", + "reason": "ContainersNotReady", + "status": "False", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2021-11-18T19:10:08Z", + "status": "True", + "type": "PodScheduled" + } + ], + "hostIP": "192.168.49.2", + "podIP": "172.17.0.25", + "podIPs": [{ "ip": "172.17.0.25" }], + "startTime": "2021-11-18T19:10:08Z", + "containerStatuses": [ + { + "name": "busybox", + "state": { + "terminated": { + "exitCode": 1, + "finishedAt": "2021-11-18T19:11:01Z", + "reason": "Error", + "startedAt": "2021-11-18T19:10:17Z", + "containerID": "docker://1062343e1bb3625e36717bc15617c1bbca976366c3c9dd87035c71f33d015615" + } + }, + "lastState": {}, + "ready": false, + "restartCount": 0, + "image": "busybox:latest", + "imageID": "docker-pullable://busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353", + "containerID": "docker://1062343e1bb3625e36717bc15617c1bbca976366c3c9dd87035c71f33d015615", + "started": false + } + ], + "qosClass": "Burstable" + } + }, + { + "metadata": { + "name": "dice-roller-cronjob-1637025000-p4mlc", + "generateName": "dice-roller-cronjob-1637025000-", + "namespace": "default", + "uid": "acddd5d2-ac7f-473b-a9d8-17a89f99ac39", + "resourceVersion": "1361174579", + "creationTimestamp": "2021-11-16T02:10:22Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "controller-uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "job-name": "dice-roller-cronjob-1637025000" + }, + "annotations": {}, + "ownerReferences": [ + { + "apiVersion": "batch/v1", + "kind": "Job", + "name": "dice-roller-cronjob-1637025000", + "uid": "69d5d242-a9a4-47b8-b9c7-c536ae8f151a", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [], + "containers": [ + { + "command": ["/bin/sh", "-c", "date; echo Rolling a die!"], + "image": "busybox", + "imagePullPolicy": "IfNotPresent", + "name": "busybox", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "restartPolicy": "Never", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "minikube", + "securityContext": {}, + "schedulerName": "default-scheduler", + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + }, + { + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + } + ], + "priority": 0, + "enableServiceLinks": true + }, + "status": { + "phase": "Failed", + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2021-11-18T19:10:13Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2021-11-18T19:11:02Z", + "message": "containers with unready status: [busybox]", + "reason": "ContainersNotReady", + "status": "False", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2021-11-18T19:11:02Z", + "message": "containers with unready status: [busybox]", + "reason": "ContainersNotReady", + "status": "False", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2021-11-18T19:10:08Z", + "status": "True", + "type": "PodScheduled" + } + ], + "hostIP": "192.168.49.2", + "podIP": "172.17.0.25", + "podIPs": [{ "ip": "172.17.0.25" }], + "startTime": "2021-11-16T02:10:22Z", + "containerStatuses": [ + { + "name": "busybox", + "state": { + "terminated": { + "exitCode": 1, + "finishedAt": "2021-11-18T19:11:01Z", + "reason": "Error", + "startedAt": "2021-11-18T19:10:17Z", + "containerID": "docker://2659c4d0f8a68f2b49863c18738322f1686d5b87275428e5e641fd9fd9e06739" + } + }, + "lastState": {}, + "ready": true, + "restartCount": 0, + "image": "busybox:latest", + "imageID": "docker-pullable://busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353", + "containerID": "docker://2659c4d0f8a68f2b49863c18738322f1686d5b87275428e5e641fd9fd9e06739", + "started": true + } + ], + "qosClass": "Burstable" + } + } + ] +} diff --git a/plugins/kubernetes-react/src/__fixtures__/2-deployments.json b/plugins/kubernetes-react/src/__fixtures__/2-deployments.json new file mode 100644 index 0000000000..f5efdbf1cb --- /dev/null +++ b/plugins/kubernetes-react/src/__fixtures__/2-deployments.json @@ -0,0 +1,4519 @@ +{ + "pods": [ + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.11\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-2m5hv", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593216", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-2m5hv", + "uid": "aadb71c0-36fa-43e3-b38a-162f134d4359" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://aa4489297c34c48bb33c18474a8d2b33854a82ed42155680b259f635f556ce70", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.11", + "podIPs": [ + { + "ip": "172.17.0.11" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.7\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-4v6s8", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593221", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-4v6s8", + "uid": "32e56490-6f20-4757-991f-a0c7fb407358" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://d91cc76c41249b8d3dfcf538d180b471b2a7966aae0d17a818307c8a9b4af897", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.7", + "podIPs": [ + { + "ip": "172.17.0.7" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-24T11:39:26.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-24T11:39:26.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.6\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-24T11:39:27.000Z" + } + ], + "name": "dice-roller-6c8646bfd-b9zt5", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "503886", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-b9zt5", + "uid": "8b6601b6-469e-4e89-8fd0-abb2f1a567e4" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:26.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:26.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://c50e0d0fa96f09a2ed5df7dd5a7f7de88e6b7c7addb8f002f299d6afc52d82ce", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-24T11:39:27.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.6", + "podIPs": [ + { + "ip": "172.17.0.6" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-24T11:39:26.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.13\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-cfxqc", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593211", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-cfxqc", + "uid": "e87e1776-0ca7-41fb-aeea-e1f648387545" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:51.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://c1641d986aae424429b7c2c1117baeb17d3794f73206bd57292cdf8264f929b2", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.13", + "podIPs": [ + { + "ip": "172.17.0.13" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:51.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.15\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:54.000Z" + } + ], + "name": "dice-roller-6c8646bfd-dtv5z", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593190", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-dtv5z", + "uid": "1638a41b-e47e-4c17-a1f7-7b447df248b6" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:51.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://e62c32db58dbfe0a74b2d2cba0e0a97b7f222693c68e930037ac8738c4758ca3", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.15", + "podIPs": [ + { + "ip": "172.17.0.15" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:51.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.12\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:53.000Z" + } + ], + "name": "dice-roller-6c8646bfd-hhts2", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593186", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-hhts2", + "uid": "ea0b147a-c56a-46e6-9445-7a0b1b0ed3c0" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://bcdbc153630f90556d57ff0d62f04d847ca63a5f0a7e5d9230683623d33d4b8d", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.12", + "podIPs": [ + { + "ip": "172.17.0.12" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.14\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-j68lm", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593226", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-j68lm", + "uid": "b230ff1d-7a13-479b-9c7b-77c26bd79f62" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://30fa8a3429f86ab8e9a4cec472b79d74266609082703f48950f4aae021e9d6a2", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.14", + "podIPs": [ + { + "ip": "172.17.0.14" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.9\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:53.000Z" + } + ], + "name": "dice-roller-6c8646bfd-m6f9w", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593181", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-m6f9w", + "uid": "9b0079f6-ff29-4619-bf6e-71cc10199ac5" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://f78767ee90eedffe46ff64bfe76d7f69426800dd89f3df012daf0baf3a9c5bdd", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.9", + "podIPs": [ + { + "ip": "172.17.0.9" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-24T11:39:27.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-24T11:39:27.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.4\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-24T11:39:28.000Z" + } + ], + "name": "dice-roller-6c8646bfd-nv9pk", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "503918", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-nv9pk", + "uid": "acf7f77f-78c6-4d4b-bc73-637211770ffc" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:28.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:28.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://63dec9b32942c4b09ae43d09d6978261f674a3ee623823b8f1d20da8044c12ac", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-24T11:39:28.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.4", + "podIPs": [ + { + "ip": "172.17.0.4" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-24T11:39:27.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.10\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-pjhfj", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593205", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-pjhfj", + "uid": "78775c3a-7af2-4ebe-a676-bc2e5dfa2bcc" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://cbb83dda250db74285dcbe0b81bd0896acf402bac9710af090311f7360f824aa", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.10", + "podIPs": [ + { + "ip": "172.17.0.10" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T10:34:01.000Z", + "generateName": "dice-roller-canary-7d64cd756c-", + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "7d64cd756c" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"9208395b-a9a7-4e46-b881-6a189f7fbdb0\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"other-side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":82,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T10:34:01.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.16\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T14:18:54.000Z" + } + ], + "name": "dice-roller-canary-7d64cd756c-55rfq", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-canary-7d64cd756c", + "uid": "9208395b-a9a7-4e46-b881-6a189f7fbdb0" + } + ], + "resourceVersion": "620452", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-canary-7d64cd756c-55rfq", + "uid": "65ad28e3-5d51-4b4b-9bf8-4cb069803034" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "other-side-car", + "ports": [ + { + "containerPort": 82, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T10:34:01.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T14:18:53.000Z", + "message": "containers with unready status: [side-car other-side-car]", + "reason": "ContainersNotReady", + "status": "False", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T14:18:53.000Z", + "message": "containers with unready status: [side-car other-side-car]", + "reason": "ContainersNotReady", + "status": "False", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T10:34:01.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://6ce15178d114a85f3d2e832de45c3355ab5b71ed5f4d4d225ee1c83bf07f69d9", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T10:34:01.000Z" + } + } + }, + { + "containerID": "docker://b3ce93d7f90bfe22558c61d2505b8473580574accdebb5fa4e51c0729c3511f4", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": { + "terminated": { + "containerID": "docker://b3ce93d7f90bfe22558c61d2505b8473580574accdebb5fa4e51c0729c3511f4", + "exitCode": 1, + "finishedAt": "2020-09-25T14:18:52.000Z", + "reason": "Error", + "startedAt": "2020-09-25T14:18:50.000Z" + } + }, + "name": "other-side-car", + "ready": false, + "restartCount": 38, + "started": false, + "state": { + "waiting": { + "message": "back-off 5m0s restarting failed container=other-side-car pod=dice-roller-canary-7d64cd756c-55rfq_default(65ad28e3-5d51-4b4b-9bf8-4cb069803034)", + "reason": "CrashLoopBackOff" + } + } + }, + { + "containerID": "docker://b7f0e65a2b8ab48c5f234616cfe8286aa96b55c3ef09c5cfbc4cdbe67a96f8cb", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": { + "terminated": { + "containerID": "docker://b7f0e65a2b8ab48c5f234616cfe8286aa96b55c3ef09c5cfbc4cdbe67a96f8cb", + "exitCode": 1, + "finishedAt": "2020-09-25T14:18:52.000Z", + "reason": "Error", + "startedAt": "2020-09-25T14:18:50.000Z" + } + }, + "name": "side-car", + "ready": false, + "restartCount": 38, + "started": false, + "state": { + "waiting": { + "message": "back-off 5m0s restarting failed container=side-car pod=dice-roller-canary-7d64cd756c-55rfq_default(65ad28e3-5d51-4b4b-9bf8-4cb069803034)", + "reason": "CrashLoopBackOff" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.16", + "podIPs": [ + { + "ip": "172.17.0.16" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T10:34:01.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T10:34:02.000Z", + "generateName": "dice-roller-canary-7d64cd756c-", + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "7d64cd756c" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"9208395b-a9a7-4e46-b881-6a189f7fbdb0\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"other-side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":82,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T10:34:02.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.5\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T14:19:05.000Z" + } + ], + "name": "dice-roller-canary-7d64cd756c-vtbdx", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-canary-7d64cd756c", + "uid": "9208395b-a9a7-4e46-b881-6a189f7fbdb0" + } + ], + "resourceVersion": "620481", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-canary-7d64cd756c-vtbdx", + "uid": "0b8d9d79-b43d-4339-be57-ad5c63add77e" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "other-side-car", + "ports": [ + { + "containerPort": 82, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T10:34:02.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T14:19:04.000Z", + "message": "containers with unready status: [side-car other-side-car]", + "reason": "ContainersNotReady", + "status": "False", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T14:19:04.000Z", + "message": "containers with unready status: [side-car other-side-car]", + "reason": "ContainersNotReady", + "status": "False", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T10:34:02.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://3f9cadc6f135247eb2df9aaca8f25ea05dcf42be86d58fb833c8acf192da0d66", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T10:34:03.000Z" + } + } + }, + { + "containerID": "docker://5e3a9f9129e5ce74fea249c013afcc056ee95a940fed24495ef9b58df67771f3", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": { + "terminated": { + "containerID": "docker://5e3a9f9129e5ce74fea249c013afcc056ee95a940fed24495ef9b58df67771f3", + "exitCode": 1, + "finishedAt": "2020-09-25T14:19:03.000Z", + "reason": "Error", + "startedAt": "2020-09-25T14:19:01.000Z" + } + }, + "name": "other-side-car", + "ready": false, + "restartCount": 38, + "started": false, + "state": { + "waiting": { + "message": "back-off 5m0s restarting failed container=other-side-car pod=dice-roller-canary-7d64cd756c-vtbdx_default(0b8d9d79-b43d-4339-be57-ad5c63add77e)", + "reason": "CrashLoopBackOff" + } + } + }, + { + "containerID": "docker://21b42cae298c0ed7f90373974d8c88b0941d17733f35398144a17ece32e03210", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": { + "terminated": { + "containerID": "docker://21b42cae298c0ed7f90373974d8c88b0941d17733f35398144a17ece32e03210", + "exitCode": 1, + "finishedAt": "2020-09-25T14:19:03.000Z", + "reason": "Error", + "startedAt": "2020-09-25T14:19:01.000Z" + } + }, + "name": "side-car", + "ready": false, + "restartCount": 38, + "started": false, + "state": { + "waiting": { + "message": "back-off 5m0s restarting failed container=side-car pod=dice-roller-canary-7d64cd756c-vtbdx_default(0b8d9d79-b43d-4339-be57-ad5c63add77e)", + "reason": "CrashLoopBackOff" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.5", + "podIPs": [ + { + "ip": "172.17.0.5" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T10:34:02.000Z" + } + } + ], + "replicaSets": [ + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "10", + "deployment.kubernetes.io/max-replicas": "13", + "deployment.kubernetes.io/revision": "2" + }, + "creationTimestamp": "2020-09-24T11:39:26.000Z", + "generation": 3, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"7551e949-42d1-4061-83c5-9da107186e47\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:availableReplicas": {}, + "f:fullyLabeledReplicas": {}, + "f:observedGeneration": {}, + "f:readyReplicas": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller", + "uid": "7551e949-42d1-4061-83c5-9da107186e47" + } + ], + "resourceVersion": "593228", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + }, + "spec": { + "replicas": 10, + "selector": { + "matchLabels": { + "app": "dice-roller", + "pod-template-hash": "6c8646bfd" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "availableReplicas": 10, + "fullyLabeledReplicas": 10, + "observedGeneration": 3, + "readyReplicas": 10, + "replicas": 10 + } + }, + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "2", + "deployment.kubernetes.io/max-replicas": "3", + "deployment.kubernetes.io/revision": "3" + }, + "creationTimestamp": "2020-09-25T10:34:01.000Z", + "generation": 2, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "7d64cd756c" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"0b6ae80f-999b-40e9-b116-ea925f0ed07b\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"other-side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":82,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:fullyLabeledReplicas": {}, + "f:observedGeneration": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T14:19:01.000Z" + } + ], + "name": "dice-roller-canary-7d64cd756c", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller-canary", + "uid": "0b6ae80f-999b-40e9-b116-ea925f0ed07b" + } + ], + "resourceVersion": "620479", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-canary-7d64cd756c", + "uid": "9208395b-a9a7-4e46-b881-6a189f7fbdb0" + }, + "spec": { + "replicas": 2, + "selector": { + "matchLabels": { + "app": "dice-roller-canary", + "pod-template-hash": "7d64cd756c" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "7d64cd756c" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "other-side-car", + "ports": [ + { + "containerPort": 82, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "fullyLabeledReplicas": 2, + "observedGeneration": 2, + "replicas": 2 + } + }, + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "2", + "deployment.kubernetes.io/max-replicas": "3", + "deployment.kubernetes.io/revision": "2" + }, + "creationTimestamp": "2020-09-25T09:25:16.000Z", + "generation": 4, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "bcb8d54dd" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"0b6ae80f-999b-40e9-b116-ea925f0ed07b\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:observedGeneration": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T10:34:04.000Z" + } + ], + "name": "dice-roller-canary-bcb8d54dd", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller-canary", + "uid": "0b6ae80f-999b-40e9-b116-ea925f0ed07b" + } + ], + "resourceVersion": "598025", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-canary-bcb8d54dd", + "uid": "51942585-d599-42aa-bf23-9cf1acad4006" + }, + "spec": { + "replicas": 0, + "selector": { + "matchLabels": { + "app": "dice-roller-canary", + "pod-template-hash": "bcb8d54dd" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "bcb8d54dd" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "observedGeneration": 4, + "replicas": 0 + } + }, + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "2", + "deployment.kubernetes.io/max-replicas": "3", + "deployment.kubernetes.io/revision": "1" + }, + "creationTimestamp": "2020-09-25T09:02:53.000Z", + "generation": 3, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "c866fbf67" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"0b6ae80f-999b-40e9-b116-ea925f0ed07b\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:observedGeneration": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:25:20.000Z" + } + ], + "name": "dice-roller-canary-c866fbf67", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller-canary", + "uid": "0b6ae80f-999b-40e9-b116-ea925f0ed07b" + } + ], + "resourceVersion": "588501", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-canary-c866fbf67", + "uid": "4d2dfe13-978f-4504-9036-ca585acdea6c" + }, + "spec": { + "replicas": 0, + "selector": { + "matchLabels": { + "app": "dice-roller-canary", + "pod-template-hash": "c866fbf67" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "c866fbf67" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "observedGeneration": 3, + "replicas": 0 + } + } + ], + "deployments": [ + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/revision": "2", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller\",\"namespace\":\"default\"},\"spec\":{\"replicas\":10,\"selector\":{\"matchLabels\":{\"app\":\"dice-roller\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"dice-roller\",\"backstage.io/kubernetes-id\":\"dice-roller\"}},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}]}]}}}}\n" + }, + "creationTimestamp": "2020-09-23T12:00:55.000Z", + "generation": 3, + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:progressDeadlineSeconds": {}, + "f:replicas": {}, + "f:revisionHistoryLimit": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {} + } + }, + "f:strategy": { + "f:rollingUpdate": { + ".": {}, + "f:maxSurge": {}, + "f:maxUnavailable": {} + }, + "f:type": {} + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + } + }, + "manager": "kubectl", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:deployment.kubernetes.io/revision": {} + } + }, + "f:status": { + "f:availableReplicas": {}, + "f:conditions": { + ".": {}, + "k:{\"type\":\"Available\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Progressing\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:observedGeneration": {}, + "f:readyReplicas": {}, + "f:replicas": {}, + "f:updatedReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller", + "namespace": "default", + "resourceVersion": "593230", + "selfLink": "/apis/apps/v1/namespaces/default/deployments/dice-roller", + "uid": "7551e949-42d1-4061-83c5-9da107186e47" + }, + "spec": { + "progressDeadlineSeconds": 600, + "replicas": 10, + "revisionHistoryLimit": 10, + "selector": { + "matchLabels": { + "app": "dice-roller" + } + }, + "strategy": { + "rollingUpdate": { + "maxSurge": "25%", + "maxUnavailable": "25%" + }, + "type": "RollingUpdate" + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "availableReplicas": 10, + "conditions": [ + { + "lastTransitionTime": "2020-09-23T12:00:55.000Z", + "lastUpdateTime": "2020-09-24T11:39:28.000Z", + "message": "ReplicaSet \"dice-roller-6c8646bfd\" has successfully progressed.", + "reason": "NewReplicaSetAvailable", + "status": "True", + "type": "Progressing" + }, + { + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "lastUpdateTime": "2020-09-25T09:58:55.000Z", + "message": "Deployment has minimum availability.", + "reason": "MinimumReplicasAvailable", + "status": "True", + "type": "Available" + } + ], + "observedGeneration": 3, + "readyReplicas": 10, + "replicas": 10, + "updatedReplicas": 10 + } + }, + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/revision": "3", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller-canary\",\"namespace\":\"default\"},\"spec\":{\"replicas\":2,\"selector\":{\"matchLabels\":{\"app\":\"dice-roller-canary\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"dice-roller-canary\",\"backstage.io/kubernetes-id\":\"dice-roller\"}},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}]},{\"image\":\"nginx:1.14.2\",\"name\":\"side-car\",\"ports\":[{\"containerPort\":81}]},{\"image\":\"nginx:1.14.2\",\"name\":\"other-side-car\",\"ports\":[{\"containerPort\":82}]}]}}}}\n" + }, + "creationTimestamp": "2020-09-25T09:02:53.000Z", + "generation": 3, + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:progressDeadlineSeconds": {}, + "f:replicas": {}, + "f:revisionHistoryLimit": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {} + } + }, + "f:strategy": { + "f:rollingUpdate": { + ".": {}, + "f:maxSurge": {}, + "f:maxUnavailable": {} + }, + "f:type": {} + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"other-side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":82,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + } + }, + "manager": "kubectl", + "operation": "Update", + "time": "2020-09-25T10:34:01.000Z" + }, + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:deployment.kubernetes.io/revision": {} + } + }, + "f:status": { + "f:conditions": { + ".": {}, + "k:{\"type\":\"Available\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Progressing\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:observedGeneration": {}, + "f:replicas": {}, + "f:unavailableReplicas": {}, + "f:updatedReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T14:19:04.000Z" + } + ], + "name": "dice-roller-canary", + "namespace": "default", + "resourceVersion": "620480", + "selfLink": "/apis/apps/v1/namespaces/default/deployments/dice-roller-canary", + "uid": "0b6ae80f-999b-40e9-b116-ea925f0ed07b" + }, + "spec": { + "progressDeadlineSeconds": 600, + "replicas": 2, + "revisionHistoryLimit": 10, + "selector": { + "matchLabels": { + "app": "dice-roller-canary" + } + }, + "strategy": { + "rollingUpdate": { + "maxSurge": "25%", + "maxUnavailable": "25%" + }, + "type": "RollingUpdate" + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "other-side-car", + "ports": [ + { + "containerPort": 82, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "conditions": [ + { + "lastTransitionTime": "2020-09-25T09:02:53.000Z", + "lastUpdateTime": "2020-09-25T10:34:04.000Z", + "message": "ReplicaSet \"dice-roller-canary-7d64cd756c\" has successfully progressed.", + "reason": "NewReplicaSetAvailable", + "status": "True", + "type": "Progressing" + }, + { + "lastTransitionTime": "2020-09-25T13:48:06.000Z", + "lastUpdateTime": "2020-09-25T13:48:06.000Z", + "message": "Deployment does not have minimum availability.", + "reason": "MinimumReplicasUnavailable", + "status": "False", + "type": "Available" + } + ], + "observedGeneration": 3, + "replicas": 2, + "unavailableReplicas": 2, + "updatedReplicas": 2 + } + } + ], + "horizontalPodAutoscalers": [ + { + "apiVersion": "autoscaling/v1", + "kind": "HorizontalPodAutoscaler", + "metadata": { + "annotations": { + "autoscaling.alpha.kubernetes.io/conditions": "[{\"type\":\"AbleToScale\",\"status\":\"True\",\"lastTransitionTime\":\"2021-01-05T10:26:04Z\",\"reason\":\"SucceededGetScale\",\"message\":\"the HPA controller was able to get the target's current scale\"},{\"type\":\"ScalingActive\",\"status\":\"False\",\"lastTransitionTime\":\"2021-01-05T10:26:04Z\",\"reason\":\"FailedGetResourceMetric\",\"message\":\"the HPA was unable to compute the replica count: unable to get metrics for resource cpu: no metrics returned from resource metrics API\"}]", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"autoscaling/v1\",\"kind\":\"HorizontalPodAutoscaler\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller\",\"namespace\":\"default\"},\"spec\":{\"maxReplicas\":15,\"minReplicas\":10,\"scaleTargetRef\":{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"name\":\"dice-roller\"},\"targetCPUUtilizationPercentage\":50}}\n" + }, + "creationTimestamp": "2021-01-05T10:25:48Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "autoscaling/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:maxReplicas": {}, + "f:minReplicas": {}, + "f:scaleTargetRef": { + "f:apiVersion": {}, + "f:kind": {}, + "f:name": {} + }, + "f:targetCPUUtilizationPercentage": {} + } + }, + "manager": "kubectl-client-side-apply", + "operation": "Update", + "time": "2021-01-05T10:25:48Z" + }, + { + "apiVersion": "autoscaling/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:autoscaling.alpha.kubernetes.io/conditions": {} + } + }, + "f:status": { + "f:currentReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2021-01-05T10:26:04Z" + } + ], + "name": "dice-roller", + "namespace": "default", + "resourceVersion": "598", + "selfLink": "/apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/dice-roller", + "uid": "dd7c5329-567c-43c2-b159-756808d90a8e" + }, + "spec": { + "maxReplicas": 15, + "minReplicas": 10, + "scaleTargetRef": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "dice-roller" + }, + "targetCPUUtilizationPercentage": 50 + }, + "status": { + "currentReplicas": 10, + "desiredReplicas": 0, + "currentCPUUtilizationPercentage": 30 + } + } + ] +} diff --git a/plugins/kubernetes-react/src/__fixtures__/2-statefulsets.json b/plugins/kubernetes-react/src/__fixtures__/2-statefulsets.json new file mode 100644 index 0000000000..0a8c26c198 --- /dev/null +++ b/plugins/kubernetes-react/src/__fixtures__/2-statefulsets.json @@ -0,0 +1,4521 @@ +{ + "pods": [ + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.11\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-2m5hv", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "StatefulSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593216", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-2m5hv", + "uid": "aadb71c0-36fa-43e3-b38a-162f134d4359" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://aa4489297c34c48bb33c18474a8d2b33854a82ed42155680b259f635f556ce70", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.11", + "podIPs": [ + { + "ip": "172.17.0.11" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.7\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-4v6s8", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593221", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-4v6s8", + "uid": "32e56490-6f20-4757-991f-a0c7fb407358" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://d91cc76c41249b8d3dfcf538d180b471b2a7966aae0d17a818307c8a9b4af897", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.7", + "podIPs": [ + { + "ip": "172.17.0.7" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-24T11:39:26.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-24T11:39:26.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.6\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-24T11:39:27.000Z" + } + ], + "name": "dice-roller-6c8646bfd-b9zt5", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "503886", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-b9zt5", + "uid": "8b6601b6-469e-4e89-8fd0-abb2f1a567e4" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:26.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:26.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://c50e0d0fa96f09a2ed5df7dd5a7f7de88e6b7c7addb8f002f299d6afc52d82ce", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-24T11:39:27.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.6", + "podIPs": [ + { + "ip": "172.17.0.6" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-24T11:39:26.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.13\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-cfxqc", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593211", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-cfxqc", + "uid": "e87e1776-0ca7-41fb-aeea-e1f648387545" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:51.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://c1641d986aae424429b7c2c1117baeb17d3794f73206bd57292cdf8264f929b2", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.13", + "podIPs": [ + { + "ip": "172.17.0.13" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:51.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.15\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:54.000Z" + } + ], + "name": "dice-roller-6c8646bfd-dtv5z", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593190", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-dtv5z", + "uid": "1638a41b-e47e-4c17-a1f7-7b447df248b6" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:51.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://e62c32db58dbfe0a74b2d2cba0e0a97b7f222693c68e930037ac8738c4758ca3", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.15", + "podIPs": [ + { + "ip": "172.17.0.15" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:51.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.12\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:53.000Z" + } + ], + "name": "dice-roller-6c8646bfd-hhts2", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593186", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-hhts2", + "uid": "ea0b147a-c56a-46e6-9445-7a0b1b0ed3c0" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://bcdbc153630f90556d57ff0d62f04d847ca63a5f0a7e5d9230683623d33d4b8d", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.12", + "podIPs": [ + { + "ip": "172.17.0.12" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.14\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-j68lm", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593226", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-j68lm", + "uid": "b230ff1d-7a13-479b-9c7b-77c26bd79f62" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://30fa8a3429f86ab8e9a4cec472b79d74266609082703f48950f4aae021e9d6a2", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.14", + "podIPs": [ + { + "ip": "172.17.0.14" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.9\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:53.000Z" + } + ], + "name": "dice-roller-6c8646bfd-m6f9w", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593181", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-m6f9w", + "uid": "9b0079f6-ff29-4619-bf6e-71cc10199ac5" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:53.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://f78767ee90eedffe46ff64bfe76d7f69426800dd89f3df012daf0baf3a9c5bdd", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.9", + "podIPs": [ + { + "ip": "172.17.0.9" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-24T11:39:27.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-24T11:39:27.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.4\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-24T11:39:28.000Z" + } + ], + "name": "dice-roller-6c8646bfd-nv9pk", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "503918", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-nv9pk", + "uid": "acf7f77f-78c6-4d4b-bc73-637211770ffc" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:28.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:28.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-24T11:39:27.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://63dec9b32942c4b09ae43d09d6978261f674a3ee623823b8f1d20da8044c12ac", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-24T11:39:28.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.4", + "podIPs": [ + { + "ip": "172.17.0.4" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-24T11:39:27.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T09:58:50.000Z", + "generateName": "dice-roller-6c8646bfd-", + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"5126c354-4310-4e23-a9e4-c9b87cb69792\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.10\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd-pjhfj", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + } + ], + "resourceVersion": "593205", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-6c8646bfd-pjhfj", + "uid": "78775c3a-7af2-4ebe-a676-bc2e5dfa2bcc" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T09:58:50.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://cbb83dda250db74285dcbe0b81bd0896acf402bac9710af090311f7360f824aa", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T09:58:53.000Z" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.10", + "podIPs": [ + { + "ip": "172.17.0.10" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T09:58:50.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T10:34:01.000Z", + "generateName": "dice-roller-canary-7d64cd756c-", + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "7d64cd756c" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"9208395b-a9a7-4e46-b881-6a189f7fbdb0\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"other-side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":82,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T10:34:01.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.16\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T14:18:54.000Z" + } + ], + "name": "dice-roller-canary-7d64cd756c-55rfq", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-canary-7d64cd756c", + "uid": "9208395b-a9a7-4e46-b881-6a189f7fbdb0" + } + ], + "resourceVersion": "620452", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-canary-7d64cd756c-55rfq", + "uid": "65ad28e3-5d51-4b4b-9bf8-4cb069803034" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "other-side-car", + "ports": [ + { + "containerPort": 82, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T10:34:01.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T14:18:53.000Z", + "message": "containers with unready status: [side-car other-side-car]", + "reason": "ContainersNotReady", + "status": "False", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T14:18:53.000Z", + "message": "containers with unready status: [side-car other-side-car]", + "reason": "ContainersNotReady", + "status": "False", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T10:34:01.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://6ce15178d114a85f3d2e832de45c3355ab5b71ed5f4d4d225ee1c83bf07f69d9", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T10:34:01.000Z" + } + } + }, + { + "containerID": "docker://b3ce93d7f90bfe22558c61d2505b8473580574accdebb5fa4e51c0729c3511f4", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": { + "terminated": { + "containerID": "docker://b3ce93d7f90bfe22558c61d2505b8473580574accdebb5fa4e51c0729c3511f4", + "exitCode": 1, + "finishedAt": "2020-09-25T14:18:52.000Z", + "reason": "Error", + "startedAt": "2020-09-25T14:18:50.000Z" + } + }, + "name": "other-side-car", + "ready": false, + "restartCount": 38, + "started": false, + "state": { + "waiting": { + "message": "back-off 5m0s restarting failed container=other-side-car pod=dice-roller-canary-7d64cd756c-55rfq_default(65ad28e3-5d51-4b4b-9bf8-4cb069803034)", + "reason": "CrashLoopBackOff" + } + } + }, + { + "containerID": "docker://b7f0e65a2b8ab48c5f234616cfe8286aa96b55c3ef09c5cfbc4cdbe67a96f8cb", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": { + "terminated": { + "containerID": "docker://b7f0e65a2b8ab48c5f234616cfe8286aa96b55c3ef09c5cfbc4cdbe67a96f8cb", + "exitCode": 1, + "finishedAt": "2020-09-25T14:18:52.000Z", + "reason": "Error", + "startedAt": "2020-09-25T14:18:50.000Z" + } + }, + "name": "side-car", + "ready": false, + "restartCount": 38, + "started": false, + "state": { + "waiting": { + "message": "back-off 5m0s restarting failed container=side-car pod=dice-roller-canary-7d64cd756c-55rfq_default(65ad28e3-5d51-4b4b-9bf8-4cb069803034)", + "reason": "CrashLoopBackOff" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.16", + "podIPs": [ + { + "ip": "172.17.0.16" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T10:34:01.000Z" + } + }, + { + "metadata": { + "creationTimestamp": "2020-09-25T10:34:02.000Z", + "generateName": "dice-roller-canary-7d64cd756c-", + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "7d64cd756c" + }, + "managedFields": [ + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:generateName": {}, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"9208395b-a9a7-4e46-b881-6a189f7fbdb0\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"other-side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":82,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:enableServiceLinks": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T10:34:02.000Z" + }, + { + "apiVersion": "v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:status": { + "f:conditions": { + "k:{\"type\":\"ContainersReady\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Initialized\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Ready\"}": { + ".": {}, + "f:lastProbeTime": {}, + "f:lastTransitionTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:containerStatuses": {}, + "f:hostIP": {}, + "f:phase": {}, + "f:podIP": {}, + "f:podIPs": { + ".": {}, + "k:{\"ip\":\"172.17.0.5\"}": { + ".": {}, + "f:ip": {} + } + }, + "f:startTime": {} + } + }, + "manager": "kubelet", + "operation": "Update", + "time": "2020-09-25T14:19:05.000Z" + } + ], + "name": "dice-roller-canary-7d64cd756c-vtbdx", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "ReplicaSet", + "name": "dice-roller-canary-7d64cd756c", + "uid": "9208395b-a9a7-4e46-b881-6a189f7fbdb0" + } + ], + "resourceVersion": "620481", + "selfLink": "/api/v1/namespaces/default/pods/dice-roller-canary-7d64cd756c-vtbdx", + "uid": "0b8d9d79-b43d-4339-be57-ad5c63add77e" + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "other-side-car", + "ports": [ + { + "containerPort": 82, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "default-token-5gctn", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "default", + "serviceAccountName": "default", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "default-token-5gctn", + "secret": { + "defaultMode": 420, + "secretName": "default-token-5gctn" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T10:34:02.000Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T14:19:04.000Z", + "message": "containers with unready status: [side-car other-side-car]", + "reason": "ContainersNotReady", + "status": "False", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T14:19:04.000Z", + "message": "containers with unready status: [side-car other-side-car]", + "reason": "ContainersNotReady", + "status": "False", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-09-25T10:34:02.000Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://3f9cadc6f135247eb2df9aaca8f25ea05dcf42be86d58fb833c8acf192da0d66", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": {}, + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "state": { + "running": { + "startedAt": "2020-09-25T10:34:03.000Z" + } + } + }, + { + "containerID": "docker://5e3a9f9129e5ce74fea249c013afcc056ee95a940fed24495ef9b58df67771f3", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": { + "terminated": { + "containerID": "docker://5e3a9f9129e5ce74fea249c013afcc056ee95a940fed24495ef9b58df67771f3", + "exitCode": 1, + "finishedAt": "2020-09-25T14:19:03.000Z", + "reason": "Error", + "startedAt": "2020-09-25T14:19:01.000Z" + } + }, + "name": "other-side-car", + "ready": false, + "restartCount": 38, + "started": false, + "state": { + "waiting": { + "message": "back-off 5m0s restarting failed container=other-side-car pod=dice-roller-canary-7d64cd756c-vtbdx_default(0b8d9d79-b43d-4339-be57-ad5c63add77e)", + "reason": "CrashLoopBackOff" + } + } + }, + { + "containerID": "docker://21b42cae298c0ed7f90373974d8c88b0941d17733f35398144a17ece32e03210", + "image": "nginx:1.14.2", + "imageID": "docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d", + "lastState": { + "terminated": { + "containerID": "docker://21b42cae298c0ed7f90373974d8c88b0941d17733f35398144a17ece32e03210", + "exitCode": 1, + "finishedAt": "2020-09-25T14:19:03.000Z", + "reason": "Error", + "startedAt": "2020-09-25T14:19:01.000Z" + } + }, + "name": "side-car", + "ready": false, + "restartCount": 38, + "started": false, + "state": { + "waiting": { + "message": "back-off 5m0s restarting failed container=side-car pod=dice-roller-canary-7d64cd756c-vtbdx_default(0b8d9d79-b43d-4339-be57-ad5c63add77e)", + "reason": "CrashLoopBackOff" + } + } + } + ], + "hostIP": "192.168.64.2", + "phase": "Running", + "podIP": "172.17.0.5", + "podIPs": [ + { + "ip": "172.17.0.5" + } + ], + "qosClass": "BestEffort", + "startTime": "2020-09-25T10:34:02.000Z" + } + } + ], + "replicaSets": [ + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "10", + "deployment.kubernetes.io/max-replicas": "13", + "deployment.kubernetes.io/revision": "2" + }, + "creationTimestamp": "2020-09-24T11:39:26.000Z", + "generation": 3, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"7551e949-42d1-4061-83c5-9da107186e47\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:availableReplicas": {}, + "f:fullyLabeledReplicas": {}, + "f:observedGeneration": {}, + "f:readyReplicas": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller-6c8646bfd", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller", + "uid": "7551e949-42d1-4061-83c5-9da107186e47" + } + ], + "resourceVersion": "593228", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-6c8646bfd", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + }, + "spec": { + "replicas": 10, + "selector": { + "matchLabels": { + "app": "dice-roller", + "pod-template-hash": "6c8646bfd" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "6c8646bfd" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "availableReplicas": 10, + "fullyLabeledReplicas": 10, + "observedGeneration": 3, + "readyReplicas": 10, + "replicas": 10 + } + }, + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "2", + "deployment.kubernetes.io/max-replicas": "3", + "deployment.kubernetes.io/revision": "3" + }, + "creationTimestamp": "2020-09-25T10:34:01.000Z", + "generation": 2, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "7d64cd756c" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"0b6ae80f-999b-40e9-b116-ea925f0ed07b\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"other-side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":82,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:fullyLabeledReplicas": {}, + "f:observedGeneration": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T14:19:01.000Z" + } + ], + "name": "dice-roller-canary-7d64cd756c", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller-canary", + "uid": "0b6ae80f-999b-40e9-b116-ea925f0ed07b" + } + ], + "resourceVersion": "620479", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-canary-7d64cd756c", + "uid": "9208395b-a9a7-4e46-b881-6a189f7fbdb0" + }, + "spec": { + "replicas": 2, + "selector": { + "matchLabels": { + "app": "dice-roller-canary", + "pod-template-hash": "7d64cd756c" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "7d64cd756c" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "other-side-car", + "ports": [ + { + "containerPort": 82, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "fullyLabeledReplicas": 2, + "observedGeneration": 2, + "replicas": 2 + } + }, + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "2", + "deployment.kubernetes.io/max-replicas": "3", + "deployment.kubernetes.io/revision": "2" + }, + "creationTimestamp": "2020-09-25T09:25:16.000Z", + "generation": 4, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "bcb8d54dd" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"0b6ae80f-999b-40e9-b116-ea925f0ed07b\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:observedGeneration": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T10:34:04.000Z" + } + ], + "name": "dice-roller-canary-bcb8d54dd", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller-canary", + "uid": "0b6ae80f-999b-40e9-b116-ea925f0ed07b" + } + ], + "resourceVersion": "598025", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-canary-bcb8d54dd", + "uid": "51942585-d599-42aa-bf23-9cf1acad4006" + }, + "spec": { + "replicas": 0, + "selector": { + "matchLabels": { + "app": "dice-roller-canary", + "pod-template-hash": "bcb8d54dd" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "bcb8d54dd" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "observedGeneration": 4, + "replicas": 0 + } + }, + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/desired-replicas": "2", + "deployment.kubernetes.io/max-replicas": "3", + "deployment.kubernetes.io/revision": "1" + }, + "creationTimestamp": "2020-09-25T09:02:53.000Z", + "generation": 3, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "c866fbf67" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:deployment.kubernetes.io/desired-replicas": {}, + "f:deployment.kubernetes.io/max-replicas": {}, + "f:deployment.kubernetes.io/revision": {} + }, + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + }, + "f:ownerReferences": { + ".": {}, + "k:{\"uid\":\"0b6ae80f-999b-40e9-b116-ea925f0ed07b\"}": { + ".": {}, + "f:apiVersion": {}, + "f:blockOwnerDeletion": {}, + "f:controller": {}, + "f:kind": {}, + "f:name": {}, + "f:uid": {} + } + } + }, + "f:spec": { + "f:replicas": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {}, + "f:pod-template-hash": {} + } + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {}, + "f:pod-template-hash": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + }, + "f:status": { + "f:observedGeneration": {}, + "f:replicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:25:20.000Z" + } + ], + "name": "dice-roller-canary-c866fbf67", + "namespace": "default", + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "blockOwnerDeletion": true, + "controller": true, + "kind": "Deployment", + "name": "dice-roller-canary", + "uid": "0b6ae80f-999b-40e9-b116-ea925f0ed07b" + } + ], + "resourceVersion": "588501", + "selfLink": "/apis/apps/v1/namespaces/default/replicasets/dice-roller-canary-c866fbf67", + "uid": "4d2dfe13-978f-4504-9036-ca585acdea6c" + }, + "spec": { + "replicas": 0, + "selector": { + "matchLabels": { + "app": "dice-roller-canary", + "pod-template-hash": "c866fbf67" + } + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller", + "pod-template-hash": "c866fbf67" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "observedGeneration": 3, + "replicas": 0 + } + } + ], + "statefulsets": [ + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/revision": "2", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"StatefulSet\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller\",\"namespace\":\"default\"},\"spec\":{\"replicas\":10,\"selector\":{\"matchLabels\":{\"app\":\"dice-roller\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"dice-roller\",\"backstage.io/kubernetes-id\":\"dice-roller\"}},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}]}]}}}}\n" + }, + "creationTimestamp": "2020-09-23T12:00:55.000Z", + "generation": 3, + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:progressDeadlineSeconds": {}, + "f:replicas": {}, + "f:revisionHistoryLimit": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {} + } + }, + "f:strategy": { + "f:rollingUpdate": { + ".": {}, + "f:maxSurge": {}, + "f:maxUnavailable": {} + }, + "f:type": {} + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + } + }, + "manager": "kubectl", + "operation": "Update", + "time": "2020-09-25T09:58:50.000Z" + }, + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:deployment.kubernetes.io/revision": {} + } + }, + "f:status": { + "f:availableReplicas": {}, + "f:conditions": { + ".": {}, + "k:{\"type\":\"Available\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Progressing\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:observedGeneration": {}, + "f:readyReplicas": {}, + "f:replicas": {}, + "f:updatedReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T09:58:55.000Z" + } + ], + "name": "dice-roller", + "namespace": "default", + "resourceVersion": "593230", + "selfLink": "/apis/apps/v1/namespaces/default/statefulsets/dice-roller", + "uid": "5126c354-4310-4e23-a9e4-c9b87cb69792" + }, + "spec": { + "replicas": 10, + "revisionHistoryLimit": 10, + "selector": { + "matchLabels": { + "app": "dice-roller" + } + }, + "updateStrategy": { + "rollingUpdate": { + "maxSurge": "25%", + "maxUnavailable": "25%" + }, + "type": "RollingUpdate" + }, + "podManagementPolicy": "Parallel", + "serviceName": "dice-roller", + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller", + "backstage.io/kubernetes-id": "dice-roller" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "availableReplicas": 10, + "conditions": [ + { + "lastTransitionTime": "2020-09-23T12:00:55.000Z", + "lastUpdateTime": "2020-09-24T11:39:28.000Z", + "message": "ReplicaSet \"dice-roller-6c8646bfd\" has successfully progressed.", + "reason": "NewReplicaSetAvailable", + "status": "True", + "type": "Progressing" + }, + { + "lastTransitionTime": "2020-09-25T09:58:55.000Z", + "lastUpdateTime": "2020-09-25T09:58:55.000Z", + "message": "Deployment has minimum availability.", + "reason": "MinimumReplicasAvailable", + "status": "True", + "type": "Available" + } + ], + "observedGeneration": 3, + "readyReplicas": 10, + "replicas": 10, + "updatedReplicas": 10 + } + }, + { + "metadata": { + "annotations": { + "deployment.kubernetes.io/revision": "3", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"StatefulSet\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller-canary\",\"namespace\":\"default\"},\"spec\":{\"replicas\":2,\"selector\":{\"matchLabels\":{\"app\":\"dice-roller-canary\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"dice-roller-canary\",\"backstage.io/kubernetes-id\":\"dice-roller\"}},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}]},{\"image\":\"nginx:1.14.2\",\"name\":\"side-car\",\"ports\":[{\"containerPort\":81}]},{\"image\":\"nginx:1.14.2\",\"name\":\"other-side-car\",\"ports\":[{\"containerPort\":82}]}]}}}}\n" + }, + "creationTimestamp": "2020-09-25T09:02:53.000Z", + "generation": 3, + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:progressDeadlineSeconds": {}, + "f:replicas": {}, + "f:revisionHistoryLimit": {}, + "f:selector": { + "f:matchLabels": { + ".": {}, + "f:app": {} + } + }, + "f:strategy": { + "f:rollingUpdate": { + ".": {}, + "f:maxSurge": {}, + "f:maxUnavailable": {} + }, + "f:type": {} + }, + "f:template": { + "f:metadata": { + "f:labels": { + ".": {}, + "f:app": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:containers": { + "k:{\"name\":\"nginx\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"other-side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":82,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + }, + "k:{\"name\":\"side-car\"}": { + ".": {}, + "f:image": {}, + "f:imagePullPolicy": {}, + "f:name": {}, + "f:ports": { + ".": {}, + "k:{\"containerPort\":81,\"protocol\":\"TCP\"}": { + ".": {}, + "f:containerPort": {}, + "f:protocol": {} + } + }, + "f:resources": {}, + "f:terminationMessagePath": {}, + "f:terminationMessagePolicy": {} + } + }, + "f:dnsPolicy": {}, + "f:restartPolicy": {}, + "f:schedulerName": {}, + "f:securityContext": {}, + "f:terminationGracePeriodSeconds": {} + } + } + } + }, + "manager": "kubectl", + "operation": "Update", + "time": "2020-09-25T10:34:01.000Z" + }, + { + "apiVersion": "apps/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:deployment.kubernetes.io/revision": {} + } + }, + "f:status": { + "f:conditions": { + ".": {}, + "k:{\"type\":\"Available\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + }, + "k:{\"type\":\"Progressing\"}": { + ".": {}, + "f:lastTransitionTime": {}, + "f:lastUpdateTime": {}, + "f:message": {}, + "f:reason": {}, + "f:status": {}, + "f:type": {} + } + }, + "f:observedGeneration": {}, + "f:replicas": {}, + "f:unavailableReplicas": {}, + "f:updatedReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2020-09-25T14:19:04.000Z" + } + ], + "name": "dice-roller-canary", + "namespace": "default", + "resourceVersion": "620480", + "selfLink": "/apis/apps/v1/namespaces/default/statefulsets/dice-roller-canary", + "uid": "9208395b-a9a7-4e46-b881-6a189f7fbdb0" + }, + "spec": { + "replicas": 2, + "revisionHistoryLimit": 10, + "selector": { + "matchLabels": { + "app": "dice-roller-canary" + } + }, + "updateStrategy": { + "rollingUpdate": { + "maxSurge": "25%", + "maxUnavailable": "25%" + }, + "type": "RollingUpdate" + }, + "podManagementPolicy": "Parallel", + "serviceName": "dice-roller", + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "app": "dice-roller-canary", + "backstage.io/kubernetes-id": "dice-roller" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "nginx", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "side-car", + "ports": [ + { + "containerPort": 81, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + }, + { + "image": "nginx:1.14.2", + "imagePullPolicy": "IfNotPresent", + "name": "other-side-car", + "ports": [ + { + "containerPort": 82, + "protocol": "TCP" + } + ], + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File" + } + ], + "dnsPolicy": "ClusterFirst", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "terminationGracePeriodSeconds": 30 + } + } + }, + "status": { + "conditions": [ + { + "lastTransitionTime": "2020-09-25T09:02:53.000Z", + "lastUpdateTime": "2020-09-25T10:34:04.000Z", + "message": "ReplicaSet \"dice-roller-canary-7d64cd756c\" has successfully progressed.", + "reason": "NewReplicaSetAvailable", + "status": "True", + "type": "Progressing" + }, + { + "lastTransitionTime": "2020-09-25T13:48:06.000Z", + "lastUpdateTime": "2020-09-25T13:48:06.000Z", + "message": "Deployment does not have minimum availability.", + "reason": "MinimumReplicasUnavailable", + "status": "False", + "type": "Available" + } + ], + "observedGeneration": 3, + "replicas": 2, + "unavailableReplicas": 2, + "updatedReplicas": 2 + } + } + ], + "horizontalPodAutoscalers": [ + { + "apiVersion": "autoscaling/v1", + "kind": "HorizontalPodAutoscaler", + "metadata": { + "annotations": { + "autoscaling.alpha.kubernetes.io/conditions": "[{\"type\":\"AbleToScale\",\"status\":\"True\",\"lastTransitionTime\":\"2021-01-05T10:26:04Z\",\"reason\":\"SucceededGetScale\",\"message\":\"the HPA controller was able to get the target's current scale\"},{\"type\":\"ScalingActive\",\"status\":\"False\",\"lastTransitionTime\":\"2021-01-05T10:26:04Z\",\"reason\":\"FailedGetResourceMetric\",\"message\":\"the HPA was unable to compute the replica count: unable to get metrics for resource cpu: no metrics returned from resource metrics API\"}]", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"autoscaling/v1\",\"kind\":\"HorizontalPodAutoscaler\",\"metadata\":{\"annotations\":{},\"labels\":{\"backstage.io/kubernetes-id\":\"dice-roller\"},\"name\":\"dice-roller\",\"namespace\":\"default\"},\"spec\":{\"maxReplicas\":15,\"minReplicas\":10,\"scaleTargetRef\":{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"name\":\"dice-roller\"},\"targetCPUUtilizationPercentage\":50}}\n" + }, + "creationTimestamp": "2021-01-05T10:25:48Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller" + }, + "managedFields": [ + { + "apiVersion": "autoscaling/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + ".": {}, + "f:kubectl.kubernetes.io/last-applied-configuration": {} + }, + "f:labels": { + ".": {}, + "f:backstage.io/kubernetes-id": {} + } + }, + "f:spec": { + "f:maxReplicas": {}, + "f:minReplicas": {}, + "f:scaleTargetRef": { + "f:apiVersion": {}, + "f:kind": {}, + "f:name": {} + }, + "f:targetCPUUtilizationPercentage": {} + } + }, + "manager": "kubectl-client-side-apply", + "operation": "Update", + "time": "2021-01-05T10:25:48Z" + }, + { + "apiVersion": "autoscaling/v1", + "fieldsType": "FieldsV1", + "fieldsV1": { + "f:metadata": { + "f:annotations": { + "f:autoscaling.alpha.kubernetes.io/conditions": {} + } + }, + "f:status": { + "f:currentReplicas": {} + } + }, + "manager": "kube-controller-manager", + "operation": "Update", + "time": "2021-01-05T10:26:04Z" + } + ], + "name": "dice-roller", + "namespace": "default", + "resourceVersion": "598", + "selfLink": "/apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/dice-roller", + "uid": "dd7c5329-567c-43c2-b159-756808d90a8e" + }, + "spec": { + "maxReplicas": 15, + "minReplicas": 10, + "scaleTargetRef": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "dice-roller" + }, + "targetCPUUtilizationPercentage": 50 + }, + "status": { + "currentReplicas": 10, + "desiredReplicas": 0, + "currentCPUUtilizationPercentage": 30 + } + } + ] +} diff --git a/plugins/kubernetes/src/api/KubernetesBackendClient.test.ts b/plugins/kubernetes-react/src/api/KubernetesBackendClient.test.ts similarity index 100% rename from plugins/kubernetes/src/api/KubernetesBackendClient.test.ts rename to plugins/kubernetes-react/src/api/KubernetesBackendClient.test.ts diff --git a/plugins/kubernetes/src/api/KubernetesBackendClient.ts b/plugins/kubernetes-react/src/api/KubernetesBackendClient.ts similarity index 99% rename from plugins/kubernetes/src/api/KubernetesBackendClient.ts rename to plugins/kubernetes-react/src/api/KubernetesBackendClient.ts index 681daa0ac0..b483c267d8 100644 --- a/plugins/kubernetes/src/api/KubernetesBackendClient.ts +++ b/plugins/kubernetes-react/src/api/KubernetesBackendClient.ts @@ -26,6 +26,7 @@ import { stringifyEntityRef } from '@backstage/catalog-model'; import { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider'; import { NotFoundError } from '@backstage/errors'; +/** @public */ export class KubernetesBackendClient implements KubernetesApi { private readonly discoveryApi: DiscoveryApi; private readonly identityApi: IdentityApi; diff --git a/plugins/kubernetes/src/api/KubernetesProxyClient.test.ts b/plugins/kubernetes-react/src/api/KubernetesProxyClient.test.ts similarity index 100% rename from plugins/kubernetes/src/api/KubernetesProxyClient.test.ts rename to plugins/kubernetes-react/src/api/KubernetesProxyClient.test.ts diff --git a/plugins/kubernetes/src/api/KubernetesProxyClient.ts b/plugins/kubernetes-react/src/api/KubernetesProxyClient.ts similarity index 100% rename from plugins/kubernetes/src/api/KubernetesProxyClient.ts rename to plugins/kubernetes-react/src/api/KubernetesProxyClient.ts diff --git a/plugins/kubernetes/src/api/index.ts b/plugins/kubernetes-react/src/api/index.ts similarity index 100% rename from plugins/kubernetes/src/api/index.ts rename to plugins/kubernetes-react/src/api/index.ts diff --git a/plugins/kubernetes/src/api/types.ts b/plugins/kubernetes-react/src/api/types.ts similarity index 97% rename from plugins/kubernetes/src/api/types.ts rename to plugins/kubernetes-react/src/api/types.ts index 6065e47169..c0f97ffd41 100644 --- a/plugins/kubernetes/src/api/types.ts +++ b/plugins/kubernetes-react/src/api/types.ts @@ -23,14 +23,17 @@ import { import { createApiRef } from '@backstage/core-plugin-api'; import { Event } from 'kubernetes-models/v1'; +/** @public */ export const kubernetesApiRef = createApiRef<KubernetesApi>({ id: 'plugin.kubernetes.service', }); +/** @public */ export const kubernetesProxyApiRef = createApiRef<KubernetesProxyApi>({ id: 'plugin.kubernetes.proxy-service', }); +/** @public */ export interface KubernetesApi { getObjectsByEntity( requestBody: KubernetesRequestBody, @@ -55,6 +58,7 @@ export interface KubernetesApi { }): Promise<Response>; } +/** @public */ export interface KubernetesProxyApi { getPodLogs(request: { podName: string; diff --git a/plugins/kubernetes/src/components/Cluster/Cluster.test.tsx b/plugins/kubernetes-react/src/components/Cluster/Cluster.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/Cluster/Cluster.test.tsx rename to plugins/kubernetes-react/src/components/Cluster/Cluster.test.tsx diff --git a/plugins/kubernetes/src/components/Cluster/Cluster.tsx b/plugins/kubernetes-react/src/components/Cluster/Cluster.tsx similarity index 96% rename from plugins/kubernetes/src/components/Cluster/Cluster.tsx rename to plugins/kubernetes-react/src/components/Cluster/Cluster.tsx index bea7a46d37..42f1aca3a0 100644 --- a/plugins/kubernetes/src/components/Cluster/Cluster.tsx +++ b/plugins/kubernetes-react/src/components/Cluster/Cluster.tsx @@ -25,11 +25,11 @@ import { import { ClientPodStatus, ClusterObjects, + groupResponses, } from '@backstage/plugin-kubernetes-common'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { DeploymentsAccordions } from '../DeploymentsAccordions'; import { StatefulSetsAccordions } from '../StatefulSetsAccordions'; -import { groupResponses } from '../../utils/response'; import { IngressesAccordions } from '../IngressesAccordions'; import { ServicesAccordions } from '../ServicesAccordions'; import { CronJobsAccordions } from '../CronJobsAccordions'; @@ -103,12 +103,22 @@ const ClusterSummary = ({ ); }; -type ClusterProps = { +/** + * Props for Cluster + * + * @public + */ +export type ClusterProps = { clusterObjects: ClusterObjects; podsWithErrors: Set<string>; children?: React.ReactNode; }; +/** + * Component for rendering Kubernetes resources in a cluster + * + * @public + */ export const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => { const groupedResponses = groupResponses(clusterObjects.resources); diff --git a/plugins/kubernetes/src/components/ErrorPanel/index.ts b/plugins/kubernetes-react/src/components/Cluster/index.ts similarity index 93% rename from plugins/kubernetes/src/components/ErrorPanel/index.ts rename to plugins/kubernetes-react/src/components/Cluster/index.ts index 2d3778e2c2..eac1e358b6 100644 --- a/plugins/kubernetes/src/components/ErrorPanel/index.ts +++ b/plugins/kubernetes-react/src/components/Cluster/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { ErrorPanel } from './ErrorPanel'; +export * from './Cluster'; diff --git a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.test.tsx b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.test.tsx rename to plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.test.tsx diff --git a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.tsx b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx similarity index 97% rename from plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.tsx rename to plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx index c5babe67fc..e724c14fdf 100644 --- a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx @@ -30,7 +30,12 @@ import { GroupedResponsesContext } from '../../hooks'; import { StatusError, StatusOK } from '@backstage/core-components'; import { humanizeCron } from '../../utils/crons'; -type CronJobsAccordionsProps = { +/** + * + * + * @public + */ +export type CronJobsAccordionsProps = { children?: React.ReactNode; }; @@ -101,6 +106,11 @@ const CronJobAccordion = ({ cronJob, ownedJobs }: CronJobAccordionProps) => { ); }; +/** + * + * + * @public + */ export const CronJobsAccordions = ({}: CronJobsAccordionsProps) => { const groupedResponses = useContext(GroupedResponsesContext); diff --git a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsDrawer.test.tsx b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/CronJobsAccordions/CronJobsDrawer.test.tsx rename to plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.test.tsx diff --git a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsDrawer.tsx b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/CronJobsAccordions/CronJobsDrawer.tsx rename to plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx diff --git a/plugins/kubernetes/src/components/JobsAccordions/index.ts b/plugins/kubernetes-react/src/components/CronJobsAccordions/index.ts similarity index 92% rename from plugins/kubernetes/src/components/JobsAccordions/index.ts rename to plugins/kubernetes-react/src/components/CronJobsAccordions/index.ts index 392309de79..ecc7172523 100644 --- a/plugins/kubernetes/src/components/JobsAccordions/index.ts +++ b/plugins/kubernetes-react/src/components/CronJobsAccordions/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { JobsAccordions } from './JobsAccordions'; +export * from './CronJobsAccordions'; diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/Rollout.test.tsx b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/Rollout.test.tsx rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.test.tsx diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/Rollout.tsx b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/Rollout.tsx rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/RolloutDrawer.tsx b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/RolloutDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/RolloutDrawer.tsx rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/RolloutDrawer.tsx diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/StepsProgress.test.tsx b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/StepsProgress.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/StepsProgress.test.tsx rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/StepsProgress.test.tsx diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/StepsProgress.tsx b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/StepsProgress.tsx similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/StepsProgress.tsx rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/StepsProgress.tsx diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/aborted-rollout.json b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/aborted-rollout.json similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/aborted-rollout.json rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/aborted-rollout.json diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/analysis-steps.ts b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/analysis-steps.ts similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/analysis-steps.ts rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/analysis-steps.ts diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/grouped-resources.json b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/grouped-resources.json similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/grouped-resources.json rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/grouped-resources.json diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/pause-steps.ts b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/pause-steps.ts similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/pause-steps.ts rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/pause-steps.ts diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/paused-rollout.json b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/paused-rollout.json similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/paused-rollout.json rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/paused-rollout.json diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/rollout.json b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/rollout.json similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/rollout.json rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/rollout.json diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/setweight-steps.ts b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/setweight-steps.ts similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/__fixtures__/setweight-steps.ts rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/__fixtures__/setweight-steps.ts diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/index.ts b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/index.ts similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/index.ts rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/index.ts diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/types.ts b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/types.ts similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/ArgoRollouts/types.ts rename to plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/types.ts diff --git a/plugins/kubernetes/src/components/CustomResources/CustomResources.tsx b/plugins/kubernetes-react/src/components/CustomResources/CustomResources.tsx similarity index 95% rename from plugins/kubernetes/src/components/CustomResources/CustomResources.tsx rename to plugins/kubernetes-react/src/components/CustomResources/CustomResources.tsx index 436e97fce8..f204f5fdd1 100644 --- a/plugins/kubernetes/src/components/CustomResources/CustomResources.tsx +++ b/plugins/kubernetes-react/src/components/CustomResources/CustomResources.tsx @@ -20,7 +20,12 @@ import { RolloutAccordions } from './ArgoRollouts'; import { DefaultCustomResourceAccordions } from './DefaultCustomResource'; import { GroupedResponsesContext } from '../../hooks'; -interface CustomResourcesProps { +/** + * + * + * @public + */ +export interface CustomResourcesProps { children?: React.ReactNode; } @@ -30,6 +35,11 @@ const kindToResource = (customResources: any[]): Dictionary<any[]> => { }); }; +/** + * + * + * @public + */ export const CustomResources = ({}: CustomResourcesProps) => { const groupedResponses = useContext(GroupedResponsesContext); const kindToResourceMap = kindToResource(groupedResponses.customResources); diff --git a/plugins/kubernetes/src/components/CustomResources/DefaultCustomResource.test.tsx b/plugins/kubernetes-react/src/components/CustomResources/DefaultCustomResource.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/DefaultCustomResource.test.tsx rename to plugins/kubernetes-react/src/components/CustomResources/DefaultCustomResource.test.tsx diff --git a/plugins/kubernetes/src/components/CustomResources/DefaultCustomResource.tsx b/plugins/kubernetes-react/src/components/CustomResources/DefaultCustomResource.tsx similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/DefaultCustomResource.tsx rename to plugins/kubernetes-react/src/components/CustomResources/DefaultCustomResource.tsx diff --git a/plugins/kubernetes/src/components/CustomResources/DefaultCustomResourceDrawer.tsx b/plugins/kubernetes-react/src/components/CustomResources/DefaultCustomResourceDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/DefaultCustomResourceDrawer.tsx rename to plugins/kubernetes-react/src/components/CustomResources/DefaultCustomResourceDrawer.tsx diff --git a/plugins/kubernetes/src/components/CustomResources/__fixtures__/analysis-run.json b/plugins/kubernetes-react/src/components/CustomResources/__fixtures__/analysis-run.json similarity index 100% rename from plugins/kubernetes/src/components/CustomResources/__fixtures__/analysis-run.json rename to plugins/kubernetes-react/src/components/CustomResources/__fixtures__/analysis-run.json diff --git a/plugins/kubernetes/src/components/ErrorReporting/index.ts b/plugins/kubernetes-react/src/components/CustomResources/index.ts similarity index 92% rename from plugins/kubernetes/src/components/ErrorReporting/index.ts rename to plugins/kubernetes-react/src/components/CustomResources/index.ts index 451d08ec76..0c5e0ce7a0 100644 --- a/plugins/kubernetes/src/components/ErrorReporting/index.ts +++ b/plugins/kubernetes-react/src/components/CustomResources/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { ErrorReporting } from './ErrorReporting'; +export * from './CustomResources'; diff --git a/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentDrawer.test.tsx b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentDrawer.test.tsx rename to plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.test.tsx diff --git a/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentDrawer.tsx b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentDrawer.tsx rename to plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx diff --git a/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentsAccordions.test.tsx b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentsAccordions.test.tsx rename to plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.test.tsx diff --git a/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx similarity index 100% rename from plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx rename to plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx diff --git a/plugins/kubernetes/src/components/DeploymentsAccordions/index.ts b/plugins/kubernetes-react/src/components/DeploymentsAccordions/index.ts similarity index 100% rename from plugins/kubernetes/src/components/DeploymentsAccordions/index.ts rename to plugins/kubernetes-react/src/components/DeploymentsAccordions/index.ts diff --git a/plugins/kubernetes/src/components/ErrorPanel/ErrorPanel.test.tsx b/plugins/kubernetes-react/src/components/ErrorPanel/ErrorPanel.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/ErrorPanel/ErrorPanel.test.tsx rename to plugins/kubernetes-react/src/components/ErrorPanel/ErrorPanel.test.tsx diff --git a/plugins/kubernetes/src/components/ErrorPanel/ErrorPanel.tsx b/plugins/kubernetes-react/src/components/ErrorPanel/ErrorPanel.tsx similarity index 96% rename from plugins/kubernetes/src/components/ErrorPanel/ErrorPanel.tsx rename to plugins/kubernetes-react/src/components/ErrorPanel/ErrorPanel.tsx index d2cb88b9ca..b02f4c18dc 100644 --- a/plugins/kubernetes/src/components/ErrorPanel/ErrorPanel.tsx +++ b/plugins/kubernetes-react/src/components/ErrorPanel/ErrorPanel.tsx @@ -41,13 +41,23 @@ const clustersWithErrorsToErrorMessage = ( }); }; -type ErrorPanelProps = { +/** + * + * + * @public + */ +export type ErrorPanelProps = { entityName: string; errorMessage?: string; clustersWithErrors?: ClusterObjects[]; children?: React.ReactNode; }; +/** + * + * + * @public + */ export const ErrorPanel = ({ entityName, errorMessage, diff --git a/plugins/kubernetes/src/components/CustomResources/index.ts b/plugins/kubernetes-react/src/components/ErrorPanel/index.ts similarity index 91% rename from plugins/kubernetes/src/components/CustomResources/index.ts rename to plugins/kubernetes-react/src/components/ErrorPanel/index.ts index 9297fd8ac1..94d6e5b028 100644 --- a/plugins/kubernetes/src/components/CustomResources/index.ts +++ b/plugins/kubernetes-react/src/components/ErrorPanel/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { CustomResources } from './CustomResources'; +export * from './ErrorPanel'; diff --git a/plugins/kubernetes/src/components/ErrorReporting/ErrorReporting.tsx b/plugins/kubernetes-react/src/components/ErrorReporting/ErrorReporting.tsx similarity index 92% rename from plugins/kubernetes/src/components/ErrorReporting/ErrorReporting.tsx rename to plugins/kubernetes-react/src/components/ErrorReporting/ErrorReporting.tsx index 367e791067..64345662ed 100644 --- a/plugins/kubernetes/src/components/ErrorReporting/ErrorReporting.tsx +++ b/plugins/kubernetes-react/src/components/ErrorReporting/ErrorReporting.tsx @@ -14,10 +14,18 @@ * limitations under the License. */ import * as React from 'react'; -import { DetectedError, DetectedErrorsByCluster } from '../../error-detection'; +import { + DetectedError, + DetectedErrorsByCluster, +} from '@backstage/plugin-kubernetes-common'; import { Table, TableColumn } from '@backstage/core-components'; -type ErrorReportingProps = { +/** + * + * + * @public + */ +export type ErrorReportingProps = { detectedErrors: DetectedErrorsByCluster; }; @@ -65,6 +73,11 @@ const sortBySeverity = (a: Row, b: Row) => { return 0; }; +/** + * + * + * @public + */ export const ErrorReporting = ({ detectedErrors }: ErrorReportingProps) => { const errors = Array.from(detectedErrors.entries()) .flatMap(([clusterName, resourceErrors]) => { diff --git a/plugins/kubernetes-react/src/components/ErrorReporting/index.ts b/plugins/kubernetes-react/src/components/ErrorReporting/index.ts new file mode 100644 index 0000000000..3382849229 --- /dev/null +++ b/plugins/kubernetes-react/src/components/ErrorReporting/index.ts @@ -0,0 +1,16 @@ +/* + * 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 './ErrorReporting'; diff --git a/plugins/kubernetes/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.test.tsx b/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.test.tsx rename to plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.test.tsx diff --git a/plugins/kubernetes/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx b/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx rename to plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx diff --git a/plugins/kubernetes/src/components/HorizontalPodAutoscalers/__fixtures__/horizontalpodautoscalers.json b/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/__fixtures__/horizontalpodautoscalers.json similarity index 100% rename from plugins/kubernetes/src/components/HorizontalPodAutoscalers/__fixtures__/horizontalpodautoscalers.json rename to plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/__fixtures__/horizontalpodautoscalers.json diff --git a/plugins/kubernetes/src/components/HorizontalPodAutoscalers/index.ts b/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/index.ts similarity index 100% rename from plugins/kubernetes/src/components/HorizontalPodAutoscalers/index.ts rename to plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/index.ts diff --git a/plugins/kubernetes/src/components/IngressesAccordions/IngressDrawer.test.tsx b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/IngressesAccordions/IngressDrawer.test.tsx rename to plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.test.tsx diff --git a/plugins/kubernetes/src/components/IngressesAccordions/IngressDrawer.tsx b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/IngressesAccordions/IngressDrawer.tsx rename to plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx diff --git a/plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.test.tsx b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.test.tsx rename to plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.test.tsx diff --git a/plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.tsx b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx similarity index 96% rename from plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.tsx rename to plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx index 6e12c033ba..28aa5d42e4 100644 --- a/plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.tsx +++ b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx @@ -27,7 +27,12 @@ import { IngressDrawer } from './IngressDrawer'; import { GroupedResponsesContext } from '../../hooks'; import { StructuredMetadataTable } from '@backstage/core-components'; -type IngressesAccordionsProps = {}; +/** + * + * + * @public + */ +export type IngressesAccordionsProps = {}; type IngressAccordionProps = { ingress: V1Ingress; @@ -78,6 +83,12 @@ const IngressAccordion = ({ ingress }: IngressAccordionProps) => { </Accordion> ); }; + +/** + * + * + * @public + */ export const IngressesAccordions = ({}: IngressesAccordionsProps) => { const groupedResponses = useContext(GroupedResponsesContext); return ( diff --git a/plugins/kubernetes/src/components/IngressesAccordions/__fixtures__/2-ingresses.json b/plugins/kubernetes-react/src/components/IngressesAccordions/__fixtures__/2-ingresses.json similarity index 100% rename from plugins/kubernetes/src/components/IngressesAccordions/__fixtures__/2-ingresses.json rename to plugins/kubernetes-react/src/components/IngressesAccordions/__fixtures__/2-ingresses.json diff --git a/plugins/kubernetes-react/src/components/IngressesAccordions/index.ts b/plugins/kubernetes-react/src/components/IngressesAccordions/index.ts new file mode 100644 index 0000000000..ece35ab17a --- /dev/null +++ b/plugins/kubernetes-react/src/components/IngressesAccordions/index.ts @@ -0,0 +1,16 @@ +/* + * 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 './IngressesAccordions'; diff --git a/plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.test.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.test.tsx rename to plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx diff --git a/plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx similarity index 97% rename from plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.tsx rename to plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx index e805e3664b..460d0b80c0 100644 --- a/plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx @@ -32,7 +32,12 @@ import { StatusPending, } from '@backstage/core-components'; -type JobsAccordionsProps = { +/** + * + * + * @public + */ +export type JobsAccordionsProps = { jobs: V1Job[]; children?: React.ReactNode; }; @@ -98,6 +103,11 @@ const JobAccordion = ({ job, ownedPods }: JobAccordionProps) => { ); }; +/** + * + * + * @public + */ export const JobsAccordions = ({ jobs }: JobsAccordionsProps) => { const groupedResponses = useContext(GroupedResponsesContext); diff --git a/plugins/kubernetes/src/components/JobsAccordions/JobsDrawer.test.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/JobsAccordions/JobsDrawer.test.tsx rename to plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.test.tsx diff --git a/plugins/kubernetes/src/components/JobsAccordions/JobsDrawer.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/JobsAccordions/JobsDrawer.tsx rename to plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx diff --git a/cypress/src/plugins/index.ts b/plugins/kubernetes-react/src/components/JobsAccordions/index.ts similarity index 94% rename from cypress/src/plugins/index.ts rename to plugins/kubernetes-react/src/components/JobsAccordions/index.ts index 4c8a35f0d1..c69c493dc8 100644 --- a/cypress/src/plugins/index.ts +++ b/plugins/kubernetes-react/src/components/JobsAccordions/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export default () => {}; +export * from './JobsAccordions'; diff --git a/plugins/kubernetes/src/components/KubernetesDrawer/KubernetesDrawer.tsx b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx similarity index 93% rename from plugins/kubernetes/src/components/KubernetesDrawer/KubernetesDrawer.tsx rename to plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx index 18ef5d9505..598dac4fe8 100644 --- a/plugins/kubernetes/src/components/KubernetesDrawer/KubernetesDrawer.tsx +++ b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx @@ -48,7 +48,12 @@ const useDrawerContentStyles = makeStyles((_theme: Theme) => }), ); -interface KubernetesObject { +/** + * The type of object that can be represented by the Drawer + * + * @public + */ +export interface KubernetesObject { kind: string; metadata?: IObjectMeta; } @@ -60,7 +65,7 @@ interface KubernetesDrawerContentProps { children?: React.ReactNode; } -export const KubernetesDrawerContent = ({ +const KubernetesDrawerContent = ({ children, header, kubernetesObject, @@ -115,7 +120,12 @@ export const KubernetesDrawerContent = ({ ); }; -interface KubernetesDrawerProps { +/** + * Props of KubernetesDrawer + * + * @public + */ +export interface KubernetesDrawerProps { open?: boolean; kubernetesObject: KubernetesObject; label: React.ReactNode; @@ -142,6 +152,11 @@ const DrawerButton = withStyles({ }, })(Button); +/** + * Button/Drawer component for Kubernetes Objects + * + * @public + */ export const KubernetesDrawer = ({ open, label, diff --git a/plugins/kubernetes/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx similarity index 95% rename from plugins/kubernetes/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx rename to plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx index 8f28549f83..65001c658e 100644 --- a/plugins/kubernetes/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx +++ b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx @@ -86,13 +86,26 @@ const PodDrawerButton = withStyles({ }, })(Button); -type ErrorPanelProps = { +/** + * + * + * @public + */ +export type LinkErrorPanelProps = { cluster: ClusterAttributes; errorMessage?: string; children?: React.ReactNode; }; -export const LinkErrorPanel = ({ cluster, errorMessage }: ErrorPanelProps) => ( +/** + * + * + * @public + */ +export const LinkErrorPanel = ({ + cluster, + errorMessage, +}: LinkErrorPanelProps) => ( <WarningPanel title="There was a problem formatting the link to the Kubernetes dashboard" message={`Could not format the link to the dashboard of your cluster named '${ @@ -107,7 +120,12 @@ export const LinkErrorPanel = ({ cluster, errorMessage }: ErrorPanelProps) => ( </WarningPanel> ); -interface KubernetesDrawerable { +/** + * + * + * @public + */ +export interface KubernetesDrawerable { metadata?: V1ObjectMeta; } @@ -234,7 +252,12 @@ const KubernetesStructuredMetadataTableDrawerContent = < </> ); }; -interface KubernetesStructuredMetadataTableDrawerProps< + +/** + * + * @public + */ +export interface KubernetesStructuredMetadataTableDrawerProps< T extends KubernetesDrawerable, > { object: T; @@ -245,6 +268,10 @@ interface KubernetesStructuredMetadataTableDrawerProps< children?: React.ReactNode; } +/** + * + * @public + */ export const KubernetesStructuredMetadataTableDrawer = < T extends KubernetesDrawerable, >({ diff --git a/plugins/kubernetes/src/components/KubernetesDrawer/ManifestYaml.tsx b/plugins/kubernetes-react/src/components/KubernetesDrawer/ManifestYaml.tsx similarity index 94% rename from plugins/kubernetes/src/components/KubernetesDrawer/ManifestYaml.tsx rename to plugins/kubernetes-react/src/components/KubernetesDrawer/ManifestYaml.tsx index 8f0c38afde..246477b53b 100644 --- a/plugins/kubernetes/src/components/KubernetesDrawer/ManifestYaml.tsx +++ b/plugins/kubernetes-react/src/components/KubernetesDrawer/ManifestYaml.tsx @@ -18,10 +18,20 @@ import { FormControlLabel, Switch } from '@material-ui/core'; import jsyaml from 'js-yaml'; import React, { useState } from 'react'; +/** + * Props of ManifestYaml + * + * @public + */ export interface ManifestYamlProps { object: object; } +/** + * Renders a Kubernetes object as a YAML code snippet + * + * @public + */ export const ManifestYaml = ({ object }: ManifestYamlProps) => { // Toggle whether the Kubernetes resource managed fields should be shown in // the YAML display. This toggle is only available when the YAML is being diff --git a/plugins/kubernetes/src/components/KubernetesDrawer/index.ts b/plugins/kubernetes-react/src/components/KubernetesDrawer/index.ts similarity index 95% rename from plugins/kubernetes/src/components/KubernetesDrawer/index.ts rename to plugins/kubernetes-react/src/components/KubernetesDrawer/index.ts index a0108cbda6..cc5337544b 100644 --- a/plugins/kubernetes/src/components/KubernetesDrawer/index.ts +++ b/plugins/kubernetes-react/src/components/KubernetesDrawer/index.ts @@ -16,3 +16,4 @@ export * from './KubernetesStructuredMetadataTableDrawer'; export * from './KubernetesDrawer'; +export * from './ManifestYaml'; diff --git a/plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminal.test.tsx b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminal.test.tsx rename to plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.test.tsx diff --git a/plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminal.tsx b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.tsx similarity index 99% rename from plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminal.tsx rename to plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.tsx index a741f4e189..f8106bd011 100644 --- a/plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminal.tsx +++ b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import 'xterm/css/xterm.css'; +import 'xterm'; import { discoveryApiRef, useApi } from '@backstage/core-plugin-api'; import React, { useEffect, useMemo, useState } from 'react'; diff --git a/plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminalAttachAddon.ts b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminalAttachAddon.ts similarity index 100% rename from plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminalAttachAddon.ts rename to plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminalAttachAddon.ts diff --git a/plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminalDialog.tsx b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminalDialog.tsx similarity index 100% rename from plugins/kubernetes/src/components/PodExecTerminal/PodExecTerminalDialog.tsx rename to plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminalDialog.tsx diff --git a/plugins/kubernetes/src/components/PodExecTerminal/index.ts b/plugins/kubernetes-react/src/components/PodExecTerminal/index.ts similarity index 100% rename from plugins/kubernetes/src/components/PodExecTerminal/index.ts rename to plugins/kubernetes-react/src/components/PodExecTerminal/index.ts diff --git a/plugins/kubernetes/src/components/PodExecTerminal/matchMedia.mock.ts b/plugins/kubernetes-react/src/components/PodExecTerminal/matchMedia.mock.ts similarity index 100% rename from plugins/kubernetes/src/components/PodExecTerminal/matchMedia.mock.ts rename to plugins/kubernetes-react/src/components/PodExecTerminal/matchMedia.mock.ts diff --git a/plugins/kubernetes/src/components/Pods/ErrorList/ErrorList.test.tsx b/plugins/kubernetes-react/src/components/Pods/ErrorList/ErrorList.test.tsx similarity index 97% rename from plugins/kubernetes/src/components/Pods/ErrorList/ErrorList.test.tsx rename to plugins/kubernetes-react/src/components/Pods/ErrorList/ErrorList.test.tsx index b05b4d2d9e..2423654cc3 100644 --- a/plugins/kubernetes/src/components/Pods/ErrorList/ErrorList.test.tsx +++ b/plugins/kubernetes-react/src/components/Pods/ErrorList/ErrorList.test.tsx @@ -18,7 +18,7 @@ import React from 'react'; import { render } from '@testing-library/react'; import { ErrorList } from './ErrorList'; -import { Pod } from 'kubernetes-models/v1/Pod'; +import { Pod } from 'kubernetes-models/v1'; describe('ErrorList', () => { it('error highlight should render', () => { diff --git a/plugins/kubernetes/src/components/Pods/ErrorList/ErrorList.tsx b/plugins/kubernetes-react/src/components/Pods/ErrorList/ErrorList.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/ErrorList/ErrorList.tsx rename to plugins/kubernetes-react/src/components/Pods/ErrorList/ErrorList.tsx diff --git a/plugins/kubernetes/src/components/Pods/ErrorList/index.ts b/plugins/kubernetes-react/src/components/Pods/ErrorList/index.ts similarity index 100% rename from plugins/kubernetes/src/components/Pods/ErrorList/index.ts rename to plugins/kubernetes-react/src/components/Pods/ErrorList/index.ts diff --git a/plugins/kubernetes/src/components/Pods/Events/Events.test.tsx b/plugins/kubernetes-react/src/components/Pods/Events/Events.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/Events/Events.test.tsx rename to plugins/kubernetes-react/src/components/Pods/Events/Events.test.tsx diff --git a/plugins/kubernetes/src/components/Pods/Events/Events.tsx b/plugins/kubernetes-react/src/components/Pods/Events/Events.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/Events/Events.tsx rename to plugins/kubernetes-react/src/components/Pods/Events/Events.tsx diff --git a/plugins/kubernetes/src/components/Pods/Events/index.ts b/plugins/kubernetes-react/src/components/Pods/Events/index.ts similarity index 100% rename from plugins/kubernetes/src/components/Pods/Events/index.ts rename to plugins/kubernetes-react/src/components/Pods/Events/index.ts diff --git a/plugins/kubernetes/src/components/Pods/Events/useEvents.test.tsx b/plugins/kubernetes-react/src/components/Pods/Events/useEvents.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/Events/useEvents.test.tsx rename to plugins/kubernetes-react/src/components/Pods/Events/useEvents.test.tsx diff --git a/plugins/kubernetes/src/components/Pods/Events/useEvents.ts b/plugins/kubernetes-react/src/components/Pods/Events/useEvents.ts similarity index 95% rename from plugins/kubernetes/src/components/Pods/Events/useEvents.ts rename to plugins/kubernetes-react/src/components/Pods/Events/useEvents.ts index 441937507d..e31a4ee859 100644 --- a/plugins/kubernetes/src/components/Pods/Events/useEvents.ts +++ b/plugins/kubernetes-react/src/components/Pods/Events/useEvents.ts @@ -15,7 +15,7 @@ */ import { useApi } from '@backstage/core-plugin-api'; import useAsync from 'react-use/lib/useAsync'; -import { kubernetesProxyApiRef } from '../../../api'; +import { kubernetesProxyApiRef } from '../../../api/types'; /** * Arguments for useEvents diff --git a/plugins/kubernetes/src/components/Pods/FixDialog/FixDialog.test.tsx b/plugins/kubernetes-react/src/components/Pods/FixDialog/FixDialog.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/FixDialog/FixDialog.test.tsx rename to plugins/kubernetes-react/src/components/Pods/FixDialog/FixDialog.test.tsx diff --git a/plugins/kubernetes/src/components/Pods/FixDialog/FixDialog.tsx b/plugins/kubernetes-react/src/components/Pods/FixDialog/FixDialog.tsx similarity index 98% rename from plugins/kubernetes/src/components/Pods/FixDialog/FixDialog.tsx rename to plugins/kubernetes-react/src/components/Pods/FixDialog/FixDialog.tsx index 63ce4af03b..c691cc67fd 100644 --- a/plugins/kubernetes/src/components/Pods/FixDialog/FixDialog.tsx +++ b/plugins/kubernetes-react/src/components/Pods/FixDialog/FixDialog.tsx @@ -28,7 +28,7 @@ import HelpIcon from '@material-ui/icons/Help'; import OpenInNewIcon from '@material-ui/icons/OpenInNew'; import { Pod } from 'kubernetes-models/v1/Pod'; -import { DetectedError } from '../../../error-detection'; +import { DetectedError } from '@backstage/plugin-kubernetes-common'; import { PodLogs } from '../PodLogs'; import { Events } from '../Events'; import { LinkButton } from '@backstage/core-components'; diff --git a/plugins/kubernetes/src/components/Pods/FixDialog/index.ts b/plugins/kubernetes-react/src/components/Pods/FixDialog/index.ts similarity index 100% rename from plugins/kubernetes/src/components/Pods/FixDialog/index.ts rename to plugins/kubernetes-react/src/components/Pods/FixDialog/index.ts diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/ContainerCard.test.tsx b/plugins/kubernetes-react/src/components/Pods/PodDrawer/ContainerCard.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodDrawer/ContainerCard.test.tsx rename to plugins/kubernetes-react/src/components/Pods/PodDrawer/ContainerCard.test.tsx diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/ContainerCard.tsx b/plugins/kubernetes-react/src/components/Pods/PodDrawer/ContainerCard.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodDrawer/ContainerCard.tsx rename to plugins/kubernetes-react/src/components/Pods/PodDrawer/ContainerCard.tsx diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/PendingPodContent.test.tsx b/plugins/kubernetes-react/src/components/Pods/PodDrawer/PendingPodContent.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodDrawer/PendingPodContent.test.tsx rename to plugins/kubernetes-react/src/components/Pods/PodDrawer/PendingPodContent.test.tsx diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/PendingPodContent.tsx b/plugins/kubernetes-react/src/components/Pods/PodDrawer/PendingPodContent.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodDrawer/PendingPodContent.tsx rename to plugins/kubernetes-react/src/components/Pods/PodDrawer/PendingPodContent.tsx diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.test.tsx b/plugins/kubernetes-react/src/components/Pods/PodDrawer/PodDrawer.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.test.tsx rename to plugins/kubernetes-react/src/components/Pods/PodDrawer/PodDrawer.test.tsx diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.tsx b/plugins/kubernetes-react/src/components/Pods/PodDrawer/PodDrawer.tsx similarity index 99% rename from plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.tsx rename to plugins/kubernetes-react/src/components/Pods/PodDrawer/PodDrawer.tsx index 30588cd347..1b98237d5a 100644 --- a/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.tsx +++ b/plugins/kubernetes-react/src/components/Pods/PodDrawer/PodDrawer.tsx @@ -67,7 +67,7 @@ function getContainerSpecByName(pod: Pod, containerName: string) { * * @public */ -interface PodDrawerProps { +export interface PodDrawerProps { open?: boolean; podAndErrors: PodAndErrors; } diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/index.ts b/plugins/kubernetes-react/src/components/Pods/PodDrawer/index.ts similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodDrawer/index.ts rename to plugins/kubernetes-react/src/components/Pods/PodDrawer/index.ts diff --git a/plugins/kubernetes/src/components/Pods/PodLogs/PodLogs.tsx b/plugins/kubernetes-react/src/components/Pods/PodLogs/PodLogs.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodLogs/PodLogs.tsx rename to plugins/kubernetes-react/src/components/Pods/PodLogs/PodLogs.tsx diff --git a/plugins/kubernetes/src/components/Pods/PodLogs/PodLogsDialog.tsx b/plugins/kubernetes-react/src/components/Pods/PodLogs/PodLogsDialog.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodLogs/PodLogsDialog.tsx rename to plugins/kubernetes-react/src/components/Pods/PodLogs/PodLogsDialog.tsx diff --git a/plugins/kubernetes/src/components/Pods/PodLogs/index.ts b/plugins/kubernetes-react/src/components/Pods/PodLogs/index.ts similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodLogs/index.ts rename to plugins/kubernetes-react/src/components/Pods/PodLogs/index.ts diff --git a/plugins/kubernetes/src/components/Pods/PodLogs/types.ts b/plugins/kubernetes-react/src/components/Pods/PodLogs/types.ts similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodLogs/types.ts rename to plugins/kubernetes-react/src/components/Pods/PodLogs/types.ts diff --git a/plugins/kubernetes/src/components/Pods/PodLogs/usePodLogs.ts b/plugins/kubernetes-react/src/components/Pods/PodLogs/usePodLogs.ts similarity index 95% rename from plugins/kubernetes/src/components/Pods/PodLogs/usePodLogs.ts rename to plugins/kubernetes-react/src/components/Pods/PodLogs/usePodLogs.ts index 495bb1dc71..26764fc64c 100644 --- a/plugins/kubernetes/src/components/Pods/PodLogs/usePodLogs.ts +++ b/plugins/kubernetes-react/src/components/Pods/PodLogs/usePodLogs.ts @@ -17,7 +17,7 @@ import useAsync from 'react-use/lib/useAsync'; import { ContainerScope } from './types'; import { useApi } from '@backstage/core-plugin-api'; -import { kubernetesProxyApiRef } from '../../../api'; +import { kubernetesProxyApiRef } from '../../../api/types'; /** * Arguments for usePodLogs diff --git a/plugins/kubernetes/src/components/Pods/PodsTable.test.tsx b/plugins/kubernetes-react/src/components/Pods/PodsTable.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/Pods/PodsTable.test.tsx rename to plugins/kubernetes-react/src/components/Pods/PodsTable.test.tsx diff --git a/plugins/kubernetes/src/components/Pods/PodsTable.tsx b/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx similarity index 96% rename from plugins/kubernetes/src/components/Pods/PodsTable.tsx rename to plugins/kubernetes-react/src/components/Pods/PodsTable.tsx index bebfbd0b5d..f7c2660c84 100644 --- a/plugins/kubernetes/src/components/Pods/PodsTable.tsx +++ b/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx @@ -31,11 +31,33 @@ import { V1Pod } from '@kubernetes/client-node'; import { usePodMetrics } from '../../hooks/usePodMetrics'; import { Typography } from '@material-ui/core'; +/** + * + * + * @public + */ export const READY_COLUMNS: PodColumns = 'READY'; + +/** + * + * + * @public + */ export const RESOURCE_COLUMNS: PodColumns = 'RESOURCE'; + +/** + * + * + * @public + */ export type PodColumns = 'READY' | 'RESOURCE'; -type PodsTablesProps = { +/** + * + * + * @public + */ +export type PodsTablesProps = { pods: Pod | V1Pod[]; extraColumns?: PodColumns[]; children?: React.ReactNode; @@ -95,6 +117,11 @@ const Memory = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => { return <>{podStatusToMemoryUtil(metrics)}</>; }; +/** + * + * + * @public + */ export const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => { const cluster = useContext(ClusterContext); const defaultColumns: TableColumn<Pod>[] = [ diff --git a/plugins/kubernetes/src/components/Pods/__fixtures__/crashing-pod.json b/plugins/kubernetes-react/src/components/Pods/__fixtures__/crashing-pod.json similarity index 100% rename from plugins/kubernetes/src/components/Pods/__fixtures__/crashing-pod.json rename to plugins/kubernetes-react/src/components/Pods/__fixtures__/crashing-pod.json diff --git a/plugins/kubernetes/src/error-detection/__fixtures__/pod.json b/plugins/kubernetes-react/src/components/Pods/__fixtures__/pod.json similarity index 100% rename from plugins/kubernetes/src/error-detection/__fixtures__/pod.json rename to plugins/kubernetes-react/src/components/Pods/__fixtures__/pod.json diff --git a/plugins/kubernetes/src/components/Pods/index.ts b/plugins/kubernetes-react/src/components/Pods/index.ts similarity index 94% rename from plugins/kubernetes/src/components/Pods/index.ts rename to plugins/kubernetes-react/src/components/Pods/index.ts index c4282de53a..6297a0abce 100644 --- a/plugins/kubernetes/src/components/Pods/index.ts +++ b/plugins/kubernetes-react/src/components/Pods/index.ts @@ -18,5 +18,5 @@ export * from './PodLogs'; export * from './FixDialog'; export * from './Events'; export * from './ErrorList'; -export { PodsTable } from './PodsTable'; +export * from './PodsTable'; export * from './types'; diff --git a/plugins/kubernetes/src/components/Pods/types.ts b/plugins/kubernetes-react/src/components/Pods/types.ts similarity index 92% rename from plugins/kubernetes/src/components/Pods/types.ts rename to plugins/kubernetes-react/src/components/Pods/types.ts index 877df39c24..847e6d63bc 100644 --- a/plugins/kubernetes/src/components/Pods/types.ts +++ b/plugins/kubernetes-react/src/components/Pods/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Pod } from 'kubernetes-models/v1'; -import { DetectedError } from '../../error-detection'; +import { DetectedError } from '@backstage/plugin-kubernetes-common'; /** * Wraps a pod with the associated detected errors and cluster name diff --git a/plugins/kubernetes/src/components/ResourceUtilization/ResourceUtilization.test.tsx b/plugins/kubernetes-react/src/components/ResourceUtilization/ResourceUtilization.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/ResourceUtilization/ResourceUtilization.test.tsx rename to plugins/kubernetes-react/src/components/ResourceUtilization/ResourceUtilization.test.tsx diff --git a/plugins/kubernetes/src/components/ResourceUtilization/ResourceUtilization.tsx b/plugins/kubernetes-react/src/components/ResourceUtilization/ResourceUtilization.tsx similarity index 96% rename from plugins/kubernetes/src/components/ResourceUtilization/ResourceUtilization.tsx rename to plugins/kubernetes-react/src/components/ResourceUtilization/ResourceUtilization.tsx index 75927958e6..15f906e469 100644 --- a/plugins/kubernetes/src/components/ResourceUtilization/ResourceUtilization.tsx +++ b/plugins/kubernetes-react/src/components/ResourceUtilization/ResourceUtilization.tsx @@ -32,8 +32,7 @@ export interface ResourceUtilizationProps { totalFormatted: string; } -// Visible for testing -export const getProgressColor: GaugePropsGetColor = ({ +const getProgressColor: GaugePropsGetColor = ({ palette, value, inverse, diff --git a/plugins/kubernetes-react/src/components/ResourceUtilization/index.ts b/plugins/kubernetes-react/src/components/ResourceUtilization/index.ts new file mode 100644 index 0000000000..088d78a40b --- /dev/null +++ b/plugins/kubernetes-react/src/components/ResourceUtilization/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './ResourceUtilization'; diff --git a/plugins/kubernetes/src/components/ServicesAccordions/ServiceDrawer.test.tsx b/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/ServicesAccordions/ServiceDrawer.test.tsx rename to plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.test.tsx diff --git a/plugins/kubernetes/src/components/ServicesAccordions/ServiceDrawer.tsx b/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/ServicesAccordions/ServiceDrawer.tsx rename to plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx diff --git a/plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.test.tsx b/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.test.tsx rename to plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.test.tsx diff --git a/plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.tsx b/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx similarity index 97% rename from plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.tsx rename to plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx index f0cb99ec9c..50d6ec6f3e 100644 --- a/plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.tsx +++ b/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx @@ -83,7 +83,12 @@ const ServiceCard = ({ service }: ServiceCardProps) => { ); }; -type ServicesAccordionsProps = {}; +/** + * + * + * @public + */ +export type ServicesAccordionsProps = {}; type ServiceAccordionProps = { service: V1Service; @@ -102,6 +107,11 @@ const ServiceAccordion = ({ service }: ServiceAccordionProps) => { ); }; +/** + * + * + * @public + */ export const ServicesAccordions = ({}: ServicesAccordionsProps) => { const groupedResponses = useContext(GroupedResponsesContext); return ( diff --git a/plugins/kubernetes/src/components/ServicesAccordions/__fixtures__/2-services.json b/plugins/kubernetes-react/src/components/ServicesAccordions/__fixtures__/2-services.json similarity index 100% rename from plugins/kubernetes/src/components/ServicesAccordions/__fixtures__/2-services.json rename to plugins/kubernetes-react/src/components/ServicesAccordions/__fixtures__/2-services.json diff --git a/plugins/kubernetes-react/src/components/ServicesAccordions/index.ts b/plugins/kubernetes-react/src/components/ServicesAccordions/index.ts new file mode 100644 index 0000000000..db37d34b5f --- /dev/null +++ b/plugins/kubernetes-react/src/components/ServicesAccordions/index.ts @@ -0,0 +1,16 @@ +/* + * 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 './ServicesAccordions'; diff --git a/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetDrawer.test.tsx b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetDrawer.test.tsx rename to plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.test.tsx diff --git a/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx similarity index 100% rename from plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx rename to plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx diff --git a/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetsAccordions.test.tsx b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.test.tsx similarity index 100% rename from plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetsAccordions.test.tsx rename to plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.test.tsx diff --git a/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx similarity index 100% rename from plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx rename to plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx diff --git a/plugins/kubernetes/src/components/StatefulSetsAccordions/index.ts b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/index.ts similarity index 100% rename from plugins/kubernetes/src/components/StatefulSetsAccordions/index.ts rename to plugins/kubernetes-react/src/components/StatefulSetsAccordions/index.ts diff --git a/plugins/kubernetes/src/components/index.ts b/plugins/kubernetes-react/src/components/index.ts similarity index 96% rename from plugins/kubernetes/src/components/index.ts rename to plugins/kubernetes-react/src/components/index.ts index 18b75247e5..d9cebe35a3 100644 --- a/plugins/kubernetes/src/components/index.ts +++ b/plugins/kubernetes-react/src/components/index.ts @@ -25,6 +25,5 @@ export * from './JobsAccordions'; export * from './KubernetesDrawer'; export * from './Pods'; export * from './ServicesAccordions'; -export * from './KubernetesContent'; export * from './ResourceUtilization'; export * from './PodExecTerminal'; diff --git a/plugins/kubernetes/src/hooks/Cluster.ts b/plugins/kubernetes-react/src/hooks/Cluster.ts similarity index 97% rename from plugins/kubernetes/src/hooks/Cluster.ts rename to plugins/kubernetes-react/src/hooks/Cluster.ts index e8d01c462c..ee950b7f4d 100644 --- a/plugins/kubernetes/src/hooks/Cluster.ts +++ b/plugins/kubernetes-react/src/hooks/Cluster.ts @@ -16,6 +16,9 @@ import React from 'react'; import { ClusterAttributes } from '@backstage/plugin-kubernetes-common'; +/** + * @public + */ export const ClusterContext = React.createContext<ClusterAttributes>({ name: '', }); diff --git a/plugins/kubernetes/src/hooks/GroupedResponses.ts b/plugins/kubernetes-react/src/hooks/GroupedResponses.ts similarity index 90% rename from plugins/kubernetes/src/hooks/GroupedResponses.ts rename to plugins/kubernetes-react/src/hooks/GroupedResponses.ts index 8383c9e1d9..7a81a74337 100644 --- a/plugins/kubernetes/src/hooks/GroupedResponses.ts +++ b/plugins/kubernetes-react/src/hooks/GroupedResponses.ts @@ -14,8 +14,13 @@ * limitations under the License. */ import React from 'react'; -import { GroupedResponses } from '../types/types'; +import { GroupedResponses } from '@backstage/plugin-kubernetes-common'; +/** + * + * + * @public + */ export const GroupedResponsesContext = React.createContext<GroupedResponses>({ pods: [], replicaSets: [], diff --git a/plugins/kubernetes/src/hooks/PodNamesWithErrors.ts b/plugins/kubernetes-react/src/hooks/PodNamesWithErrors.ts similarity index 97% rename from plugins/kubernetes/src/hooks/PodNamesWithErrors.ts rename to plugins/kubernetes-react/src/hooks/PodNamesWithErrors.ts index 7505da3fd2..001a40805f 100644 --- a/plugins/kubernetes/src/hooks/PodNamesWithErrors.ts +++ b/plugins/kubernetes-react/src/hooks/PodNamesWithErrors.ts @@ -15,6 +15,9 @@ */ import React from 'react'; +/** + * @public + */ export const PodNamesWithErrorsContext = React.createContext<Set<string>>( new Set<string>(), ); diff --git a/plugins/kubernetes/src/hooks/PodNamesWithMetrics.ts b/plugins/kubernetes-react/src/hooks/PodNamesWithMetrics.ts similarity index 97% rename from plugins/kubernetes/src/hooks/PodNamesWithMetrics.ts rename to plugins/kubernetes-react/src/hooks/PodNamesWithMetrics.ts index 0df42a8ab0..12da138cfb 100644 --- a/plugins/kubernetes/src/hooks/PodNamesWithMetrics.ts +++ b/plugins/kubernetes-react/src/hooks/PodNamesWithMetrics.ts @@ -16,8 +16,8 @@ import React from 'react'; import { ClientPodStatus } from '@backstage/plugin-kubernetes-common'; -/* - * @deprecated +/** + * @public */ export const PodNamesWithMetricsContext = React.createContext< Map<string, ClientPodStatus> diff --git a/plugins/kubernetes/src/hooks/__mocks__/useIsPodExecTerminalSupported.ts b/plugins/kubernetes-react/src/hooks/__mocks__/useIsPodExecTerminalSupported.ts similarity index 100% rename from plugins/kubernetes/src/hooks/__mocks__/useIsPodExecTerminalSupported.ts rename to plugins/kubernetes-react/src/hooks/__mocks__/useIsPodExecTerminalSupported.ts diff --git a/plugins/kubernetes/src/hooks/auth.test.ts b/plugins/kubernetes-react/src/hooks/auth.test.ts similarity index 100% rename from plugins/kubernetes/src/hooks/auth.test.ts rename to plugins/kubernetes-react/src/hooks/auth.test.ts diff --git a/plugins/kubernetes/src/hooks/auth.ts b/plugins/kubernetes-react/src/hooks/auth.ts similarity index 98% rename from plugins/kubernetes/src/hooks/auth.ts rename to plugins/kubernetes-react/src/hooks/auth.ts index cce0bc27d6..76e08f2783 100644 --- a/plugins/kubernetes/src/hooks/auth.ts +++ b/plugins/kubernetes-react/src/hooks/auth.ts @@ -15,9 +15,9 @@ */ import { Entity } from '@backstage/catalog-model'; -import { KubernetesApi } from '../api/types'; -import { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider/types'; import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; +import { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider'; +import { KubernetesApi } from '../api/types'; export const generateAuth = async ( entity: Entity, diff --git a/plugins/kubernetes/src/hooks/index.ts b/plugins/kubernetes-react/src/hooks/index.ts similarity index 100% rename from plugins/kubernetes/src/hooks/index.ts rename to plugins/kubernetes-react/src/hooks/index.ts diff --git a/plugins/kubernetes/src/hooks/test-utils.tsx b/plugins/kubernetes-react/src/hooks/test-utils.tsx similarity index 100% rename from plugins/kubernetes/src/hooks/test-utils.tsx rename to plugins/kubernetes-react/src/hooks/test-utils.tsx diff --git a/plugins/kubernetes/src/hooks/types.ts b/plugins/kubernetes-react/src/hooks/types.ts similarity index 100% rename from plugins/kubernetes/src/hooks/types.ts rename to plugins/kubernetes-react/src/hooks/types.ts diff --git a/plugins/kubernetes/src/hooks/useCustomResources.test.ts b/plugins/kubernetes-react/src/hooks/useCustomResources.test.ts similarity index 100% rename from plugins/kubernetes/src/hooks/useCustomResources.test.ts rename to plugins/kubernetes-react/src/hooks/useCustomResources.test.ts diff --git a/plugins/kubernetes/src/hooks/useCustomResources.ts b/plugins/kubernetes-react/src/hooks/useCustomResources.ts similarity index 99% rename from plugins/kubernetes/src/hooks/useCustomResources.ts rename to plugins/kubernetes-react/src/hooks/useCustomResources.ts index c53e00d81c..4faeb48894 100644 --- a/plugins/kubernetes/src/hooks/useCustomResources.ts +++ b/plugins/kubernetes-react/src/hooks/useCustomResources.ts @@ -15,8 +15,6 @@ */ import { Entity } from '@backstage/catalog-model'; -import { kubernetesApiRef } from '../api/types'; -import { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types'; import { useCallback } from 'react'; import useInterval from 'react-use/lib/useInterval'; import { @@ -27,6 +25,8 @@ import { useApi } from '@backstage/core-plugin-api'; import { KubernetesObjects } from './useKubernetesObjects'; import { generateAuth } from './auth'; import useAsyncRetry from 'react-use/lib/useAsyncRetry'; +import { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider'; +import { kubernetesApiRef } from '../api/types'; /** * Retrieves the provided custom resources related to the provided entity, refreshes at an interval. diff --git a/plugins/kubernetes/src/hooks/useIsPodExecTerminalSupported.test.ts b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.test.ts similarity index 100% rename from plugins/kubernetes/src/hooks/useIsPodExecTerminalSupported.test.ts rename to plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.test.ts diff --git a/plugins/kubernetes/src/hooks/useIsPodExecTerminalSupported.ts b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.ts similarity index 96% rename from plugins/kubernetes/src/hooks/useIsPodExecTerminalSupported.ts rename to plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.ts index 17f64bf0dd..e881951059 100644 --- a/plugins/kubernetes/src/hooks/useIsPodExecTerminalSupported.ts +++ b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.ts @@ -15,8 +15,7 @@ */ import { useApi } from '@backstage/core-plugin-api'; import useAsync, { AsyncState } from 'react-use/lib/useAsync'; - -import { kubernetesApiRef } from '../api'; +import { kubernetesApiRef } from '../api/types'; /** * Check if conditions for a pod exec call through the proxy endpoint are met diff --git a/plugins/kubernetes/src/hooks/useKubernetesObjects.test.ts b/plugins/kubernetes-react/src/hooks/useKubernetesObjects.test.ts similarity index 100% rename from plugins/kubernetes/src/hooks/useKubernetesObjects.test.ts rename to plugins/kubernetes-react/src/hooks/useKubernetesObjects.test.ts diff --git a/plugins/kubernetes/src/hooks/useKubernetesObjects.ts b/plugins/kubernetes-react/src/hooks/useKubernetesObjects.ts similarity index 97% rename from plugins/kubernetes/src/hooks/useKubernetesObjects.ts rename to plugins/kubernetes-react/src/hooks/useKubernetesObjects.ts index aad2f48fd3..f2b8de3cc6 100644 --- a/plugins/kubernetes/src/hooks/useKubernetesObjects.ts +++ b/plugins/kubernetes-react/src/hooks/useKubernetesObjects.ts @@ -15,21 +15,29 @@ */ import { Entity } from '@backstage/catalog-model'; -import { kubernetesApiRef } from '../api/types'; -import { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types'; import { useCallback } from 'react'; import useInterval from 'react-use/lib/useInterval'; import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; import { useApi } from '@backstage/core-plugin-api'; import { generateAuth } from './auth'; import useAsyncRetry from 'react-use/lib/useAsyncRetry'; +import { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider'; +import { kubernetesApiRef } from '../api/types'; +/** + * + * @public + */ export interface KubernetesObjects { kubernetesObjects?: ObjectsByEntityResponse; loading: boolean; error?: string; } +/** + * + * @public + */ export const useKubernetesObjects = ( entity: Entity, intervalMs: number = 10000, diff --git a/plugins/kubernetes/src/hooks/useMatchingErrors.test.tsx b/plugins/kubernetes-react/src/hooks/useMatchingErrors.test.tsx similarity index 95% rename from plugins/kubernetes/src/hooks/useMatchingErrors.test.tsx rename to plugins/kubernetes-react/src/hooks/useMatchingErrors.test.tsx index 4ed4dbd73c..4d817e838d 100644 --- a/plugins/kubernetes/src/hooks/useMatchingErrors.test.tsx +++ b/plugins/kubernetes-react/src/hooks/useMatchingErrors.test.tsx @@ -16,8 +16,10 @@ import React from 'react'; import { renderHook } from '@testing-library/react-hooks'; import { DetectedErrorsContext, useMatchingErrors } from './useMatchingErrors'; -import { DetectedError } from '../error-detection'; -import { ResourceRef } from '../error-detection/types'; +import { + DetectedError, + ResourceRef, +} from '@backstage/plugin-kubernetes-common'; const genericErrorWithRef = (resourceRef: ResourceRef): DetectedError => { return { diff --git a/plugins/kubernetes/src/hooks/useMatchingErrors.ts b/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts similarity index 95% rename from plugins/kubernetes/src/hooks/useMatchingErrors.ts rename to plugins/kubernetes-react/src/hooks/useMatchingErrors.ts index aa90d52cbb..1975065b7b 100644 --- a/plugins/kubernetes/src/hooks/useMatchingErrors.ts +++ b/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts @@ -14,7 +14,10 @@ * limitations under the License. */ import React, { useContext } from 'react'; -import { DetectedError, ResourceRef } from '../error-detection/types'; +import { + DetectedError, + ResourceRef, +} from '@backstage/plugin-kubernetes-common'; import { TypeMeta } from '@kubernetes-models/base'; import { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; diff --git a/plugins/kubernetes/src/hooks/usePodMetrics.test.tsx b/plugins/kubernetes-react/src/hooks/usePodMetrics.test.tsx similarity index 100% rename from plugins/kubernetes/src/hooks/usePodMetrics.test.tsx rename to plugins/kubernetes-react/src/hooks/usePodMetrics.test.tsx diff --git a/plugins/kubernetes/src/hooks/usePodMetrics.ts b/plugins/kubernetes-react/src/hooks/usePodMetrics.ts similarity index 99% rename from plugins/kubernetes/src/hooks/usePodMetrics.ts rename to plugins/kubernetes-react/src/hooks/usePodMetrics.ts index 4392487cac..6d3c52690f 100644 --- a/plugins/kubernetes/src/hooks/usePodMetrics.ts +++ b/plugins/kubernetes-react/src/hooks/usePodMetrics.ts @@ -26,8 +26,8 @@ export const PodMetricsContext = React.createContext< Map<string, ClientPodStatus[]> >(new Map()); -/* - * @alpha +/** + * @public */ export type PodMetricsMatcher = { metadata?: IObjectMeta; diff --git a/plugins/catalog/src/options.ts b/plugins/kubernetes-react/src/index.ts similarity index 61% rename from plugins/catalog/src/options.ts rename to plugins/kubernetes-react/src/index.ts index 4ea6449a4b..e5c84eab79 100644 --- a/plugins/catalog/src/options.ts +++ b/plugins/kubernetes-react/src/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2023 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,16 +14,16 @@ * limitations under the License. */ -import { usePluginOptions } from '@backstage/core-plugin-api/alpha'; +/** + * Web library for the kubernetes-react plugin. + * + * @packageDocumentation + */ -export type CatalogPluginOptions = { - createButtonTitle: string; -}; +// In this package you might for example export components or hooks +// that are useful to other plugins or modules. -/** @ignore */ -export type CatalogInputPluginOptions = { - createButtonTitle: string; -}; - -export const useCatalogPluginOptions = () => - usePluginOptions<CatalogPluginOptions>(); +export * from './hooks'; +export * from './api'; +export * from './kubernetes-auth-provider'; +export * from './components'; diff --git a/plugins/kubernetes/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts similarity index 98% rename from plugins/kubernetes/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts rename to plugins/kubernetes-react/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts index 401fc1e127..34a83dfed3 100644 --- a/plugins/kubernetes/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts +++ b/plugins/kubernetes-react/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts @@ -17,6 +17,7 @@ import { OAuthApi } from '@backstage/core-plugin-api'; import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { KubernetesAuthProvider } from './types'; +/** @public */ export class AksKubernetesAuthProvider implements KubernetesAuthProvider { constructor(private readonly microsoftAuthApi: OAuthApi) {} diff --git a/plugins/kubernetes/src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts similarity index 99% rename from plugins/kubernetes/src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts rename to plugins/kubernetes-react/src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts index fbce644a89..9d7259b70e 100644 --- a/plugins/kubernetes/src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts +++ b/plugins/kubernetes-react/src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts @@ -18,6 +18,7 @@ import { KubernetesAuthProvider } from './types'; import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { OAuthApi } from '@backstage/core-plugin-api'; +/** @public */ export class GoogleKubernetesAuthProvider implements KubernetesAuthProvider { authProvider: OAuthApi; diff --git a/plugins/kubernetes/src/kubernetes-auth-provider/KubernetesAuthProviders.test.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.test.ts similarity index 100% rename from plugins/kubernetes/src/kubernetes-auth-provider/KubernetesAuthProviders.test.ts rename to plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.test.ts diff --git a/plugins/kubernetes/src/kubernetes-auth-provider/KubernetesAuthProviders.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.ts similarity index 99% rename from plugins/kubernetes/src/kubernetes-auth-provider/KubernetesAuthProviders.ts rename to plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.ts index 84154d5e96..77a7b156d7 100644 --- a/plugins/kubernetes/src/kubernetes-auth-provider/KubernetesAuthProviders.ts +++ b/plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.ts @@ -22,6 +22,7 @@ import { OAuthApi, OpenIdConnectApi } from '@backstage/core-plugin-api'; import { OidcKubernetesAuthProvider } from './OidcKubernetesAuthProvider'; import { AksKubernetesAuthProvider } from './AksKubernetesAuthProvider'; +/** @public */ export class KubernetesAuthProviders implements KubernetesAuthProvidersApi { private readonly kubernetesAuthProviderMap: Map< string, diff --git a/plugins/kubernetes/src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts similarity index 99% rename from plugins/kubernetes/src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts rename to plugins/kubernetes-react/src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts index b2e6c5cbc2..c117200f56 100644 --- a/plugins/kubernetes/src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts +++ b/plugins/kubernetes-react/src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts @@ -19,6 +19,7 @@ import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { OpenIdConnectApi } from '@backstage/core-plugin-api'; import { KubernetesAuthProvider } from './types'; +/** @public */ export class OidcKubernetesAuthProvider implements KubernetesAuthProvider { providerName: string; authProvider: OpenIdConnectApi; diff --git a/plugins/kubernetes/src/kubernetes-auth-provider/ServerSideAuthProvider.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/ServerSideAuthProvider.ts similarity index 100% rename from plugins/kubernetes/src/kubernetes-auth-provider/ServerSideAuthProvider.ts rename to plugins/kubernetes-react/src/kubernetes-auth-provider/ServerSideAuthProvider.ts diff --git a/packages/core-plugin-api/src/plugin-options/index.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/index.ts similarity index 70% rename from packages/core-plugin-api/src/plugin-options/index.ts rename to plugins/kubernetes-react/src/kubernetes-auth-provider/index.ts index 1737a1c836..5ab8b0be43 100644 --- a/packages/core-plugin-api/src/plugin-options/index.ts +++ b/plugins/kubernetes-react/src/kubernetes-auth-provider/index.ts @@ -14,5 +14,9 @@ * limitations under the License. */ -export { usePluginOptions, PluginProvider } from './usePluginOptions'; -export type { PluginOptionsProviderProps } from './usePluginOptions'; +export * from './types'; +export * from './KubernetesAuthProviders'; +export * from './GoogleKubernetesAuthProvider'; +export * from './ServerSideAuthProvider'; +export * from './OidcKubernetesAuthProvider'; +export * from './AksKubernetesAuthProvider'; diff --git a/plugins/kubernetes/src/kubernetes-auth-provider/types.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/types.ts similarity index 96% rename from plugins/kubernetes/src/kubernetes-auth-provider/types.ts rename to plugins/kubernetes-react/src/kubernetes-auth-provider/types.ts index 418758dd31..adf323d1d8 100644 --- a/plugins/kubernetes/src/kubernetes-auth-provider/types.ts +++ b/plugins/kubernetes-react/src/kubernetes-auth-provider/types.ts @@ -17,6 +17,7 @@ import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { createApiRef } from '@backstage/core-plugin-api'; +/** @public */ export interface KubernetesAuthProvider { decorateRequestBodyForAuth( requestBody: KubernetesRequestBody, @@ -24,11 +25,13 @@ export interface KubernetesAuthProvider { getCredentials(): Promise<{ token?: string }>; } +/** @public */ export const kubernetesAuthProvidersApiRef = createApiRef<KubernetesAuthProvidersApi>({ id: 'plugin.kubernetes-auth-providers.service', }); +/** @public */ export interface KubernetesAuthProvidersApi { decorateRequestBodyForAuth( authProvider: string, diff --git a/plugins/kubernetes-react/src/setupTests.ts b/plugins/kubernetes-react/src/setupTests.ts new file mode 100644 index 0000000000..865308e634 --- /dev/null +++ b/plugins/kubernetes-react/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import '@testing-library/jest-dom'; diff --git a/plugins/kubernetes/src/types/index.ts b/plugins/kubernetes-react/src/types/index.ts similarity index 100% rename from plugins/kubernetes/src/types/index.ts rename to plugins/kubernetes-react/src/types/index.ts diff --git a/packages/techdocs-cli-embedded-app/cypress/integration/app.js b/plugins/kubernetes-react/src/types/types.ts similarity index 68% rename from packages/techdocs-cli-embedded-app/cypress/integration/app.js rename to plugins/kubernetes-react/src/types/types.ts index d31f7a7964..7efd1ef3ff 100644 --- a/packages/techdocs-cli-embedded-app/cypress/integration/app.js +++ b/plugins/kubernetes-react/src/types/types.ts @@ -14,9 +14,15 @@ * limitations under the License. */ -describe('App', () => { - it('should render the catalog', () => { - cy.visit('/'); - cy.contains('My Company Service Catalog'); - }); -}); +import type { JsonObject } from '@backstage/types'; + +export interface ClusterLinksFormatterOptions { + dashboardUrl?: URL; + dashboardParameters?: JsonObject; + object: any; + kind: string; +} + +export type ClusterLinksFormatter = ( + options: ClusterLinksFormatterOptions, +) => URL; diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatClusterLink.test.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatClusterLink.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatClusterLink.test.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatClusterLink.test.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatClusterLink.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatClusterLink.ts similarity index 90% rename from plugins/kubernetes/src/utils/clusterLinks/formatClusterLink.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatClusterLink.ts index 6a998bbce2..ae3bdb950f 100644 --- a/plugins/kubernetes/src/utils/clusterLinks/formatClusterLink.ts +++ b/plugins/kubernetes-react/src/utils/clusterLinks/formatClusterLink.ts @@ -17,6 +17,7 @@ import type { JsonObject } from '@backstage/types'; import { defaultFormatterName, clusterLinksFormatters } from './formatters'; +// @Deprecated use import { FormatClusterLinkOptions } from '@backstage/kubernetes-react' export type FormatClusterLinkOptions = { dashboardUrl?: string; dashboardApp?: string; @@ -25,6 +26,7 @@ export type FormatClusterLinkOptions = { kind: string; }; +// @Deprecated use import { formatClusterLink } from '@backstage/kubernetes-react' export function formatClusterLink(options: FormatClusterLinkOptions) { if (!options.dashboardUrl && !options.dashboardParameters) { return undefined; diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/aks.test.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/aks.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/aks.test.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/aks.test.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/aks.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/aks.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/aks.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/aks.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/eks.test.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/eks.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/eks.test.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/eks.test.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/eks.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/eks.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/eks.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/eks.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/gke.test.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/gke.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/gke.test.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/gke.test.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/gke.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/gke.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/gke.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/gke.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/index.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/index.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/index.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/index.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/openshift.test.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/openshift.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/openshift.test.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/openshift.test.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/openshift.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/openshift.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/openshift.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/openshift.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/rancher.test.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/rancher.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/rancher.test.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/rancher.test.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/rancher.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/rancher.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/rancher.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/rancher.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/standard.test.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/standard.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/standard.test.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/standard.test.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/formatters/standard.ts b/plugins/kubernetes-react/src/utils/clusterLinks/formatters/standard.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/formatters/standard.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/formatters/standard.ts diff --git a/plugins/kubernetes/src/utils/clusterLinks/index.ts b/plugins/kubernetes-react/src/utils/clusterLinks/index.ts similarity index 100% rename from plugins/kubernetes/src/utils/clusterLinks/index.ts rename to plugins/kubernetes-react/src/utils/clusterLinks/index.ts diff --git a/plugins/kubernetes/src/utils/crons.test.ts b/plugins/kubernetes-react/src/utils/crons.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/crons.test.ts rename to plugins/kubernetes-react/src/utils/crons.test.ts diff --git a/plugins/kubernetes/src/utils/crons.ts b/plugins/kubernetes-react/src/utils/crons.ts similarity index 100% rename from plugins/kubernetes/src/utils/crons.ts rename to plugins/kubernetes-react/src/utils/crons.ts diff --git a/plugins/kubernetes/src/utils/index.ts b/plugins/kubernetes-react/src/utils/index.ts similarity index 100% rename from plugins/kubernetes/src/utils/index.ts rename to plugins/kubernetes-react/src/utils/index.ts diff --git a/plugins/kubernetes/src/utils/owner.test.ts b/plugins/kubernetes-react/src/utils/owner.test.ts similarity index 100% rename from plugins/kubernetes/src/utils/owner.test.ts rename to plugins/kubernetes-react/src/utils/owner.test.ts diff --git a/plugins/kubernetes/src/utils/owner.ts b/plugins/kubernetes-react/src/utils/owner.ts similarity index 100% rename from plugins/kubernetes/src/utils/owner.ts rename to plugins/kubernetes-react/src/utils/owner.ts diff --git a/plugins/kubernetes/src/utils/pod.test.tsx b/plugins/kubernetes-react/src/utils/pod.test.tsx similarity index 100% rename from plugins/kubernetes/src/utils/pod.test.tsx rename to plugins/kubernetes-react/src/utils/pod.test.tsx diff --git a/plugins/kubernetes/src/utils/pod.tsx b/plugins/kubernetes-react/src/utils/pod.tsx similarity index 100% rename from plugins/kubernetes/src/utils/pod.tsx rename to plugins/kubernetes-react/src/utils/pod.tsx diff --git a/plugins/kubernetes/src/utils/resources.ts b/plugins/kubernetes-react/src/utils/resources.ts similarity index 100% rename from plugins/kubernetes/src/utils/resources.ts rename to plugins/kubernetes-react/src/utils/resources.ts diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 94b59bb6b3..451825ca33 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-kubernetes +## 0.10.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-kubernetes-common@0.6.6 + +## 0.10.3 + +### Patch Changes + +- 0ad36158d980: Loosened the type of the `auth` field in the body of requests to the `retrieveObjectsByServiceId` endpoint. Now any JSON object is allowed, which should make it easier for integrators to write their own custom auth strategies for Kubernetes. +- 7032c214f3b4: Add pod exec terminal to Container Card +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6ddeade58b4c: Avoid eager use of `TextEncoder` in order not to break tests. +- 6a5e04e20e6e: fix logs dialog min height +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.6 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.10.3-next.3 ### Patch Changes diff --git a/plugins/kubernetes/api-report.md b/plugins/kubernetes/api-report.md index 77ec8dd19c..64b56cf786 100644 --- a/plugins/kubernetes/api-report.md +++ b/plugins/kubernetes/api-report.md @@ -5,162 +5,10 @@ ```ts /// <reference types="react" /> -import { ApiRef } from '@backstage/core-plugin-api'; -import { AsyncState } from 'react-use/lib/useAsyncFn'; import { BackstagePlugin } from '@backstage/core-plugin-api'; -import { ClientContainerStatus } from '@backstage/plugin-kubernetes-common'; -import { ClientPodStatus } from '@backstage/plugin-kubernetes-common'; -import { ClusterAttributes } from '@backstage/plugin-kubernetes-common'; -import { ClusterObjects } from '@backstage/plugin-kubernetes-common'; -import { CustomObjectsByEntityRequest } from '@backstage/plugin-kubernetes-common'; -import { CustomResourceMatcher } from '@backstage/plugin-kubernetes-common'; -import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; -import { Event as Event_2 } from 'kubernetes-models/v1'; -import { IContainer } from 'kubernetes-models/v1'; -import { IContainerStatus } from 'kubernetes-models/v1'; -import { IdentityApi } from '@backstage/core-plugin-api'; -import { IIoK8sApimachineryPkgApisMetaV1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; -import { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; -import type { JsonObject } from '@backstage/types'; -import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; -import { OAuthApi } from '@backstage/core-plugin-api'; -import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; -import { OpenIdConnectApi } from '@backstage/core-plugin-api'; -import { Pod } from 'kubernetes-models/v1/Pod'; -import { Pod as Pod_2 } from 'kubernetes-models/v1'; import { default as React_2 } from 'react'; -import * as React_3 from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; -import { TypeMeta } from '@kubernetes-models/base'; -import { V1ConfigMap } from '@kubernetes/client-node'; -import { V1CronJob } from '@kubernetes/client-node'; -import { V1Deployment } from '@kubernetes/client-node'; -import { V1HorizontalPodAutoscaler } from '@kubernetes/client-node'; -import { V1Ingress } from '@kubernetes/client-node'; -import { V1Job } from '@kubernetes/client-node'; -import { V1ObjectMeta } from '@kubernetes/client-node'; -import { V1Pod } from '@kubernetes/client-node'; -import { V1ReplicaSet } from '@kubernetes/client-node'; -import { V1Service } from '@kubernetes/client-node'; -import { V1StatefulSet } from '@kubernetes/client-node'; -import { WorkloadsByEntityRequest } from '@backstage/plugin-kubernetes-common'; - -// Warning: (ae-forgotten-export) The symbol "ClusterProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "Cluster" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const Cluster: ({ - clusterObjects, - podsWithErrors, -}: ClusterProps) => React_2.JSX.Element; - -// Warning: (ae-missing-release-tag) "ClusterContext" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const ClusterContext: React_2.Context<ClusterAttributes>; - -// Warning: (ae-missing-release-tag) "ClusterLinksFormatter" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type ClusterLinksFormatter = ( - options: ClusterLinksFormatterOptions, -) => URL; - -// Warning: (ae-missing-release-tag) "ClusterLinksFormatterOptions" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface ClusterLinksFormatterOptions { - // (undocumented) - dashboardParameters?: JsonObject; - // (undocumented) - dashboardUrl?: URL; - // (undocumented) - kind: string; - // (undocumented) - object: any; -} - -// Warning: (ae-missing-release-tag) "clusterLinksFormatters" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const clusterLinksFormatters: Record<string, ClusterLinksFormatter>; - -// @public -export const ContainerCard: React_2.FC<ContainerCardProps>; - -// @public -export interface ContainerCardProps { - // (undocumented) - containerMetrics?: ClientContainerStatus; - // (undocumented) - containerSpec?: IContainer; - // (undocumented) - containerStatus: IContainerStatus; - // (undocumented) - podScope: PodScope; -} - -// @public -export interface ContainerScope extends PodScope { - // (undocumented) - containerName: string; -} - -// Warning: (ae-forgotten-export) The symbol "CronJobsAccordionsProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "CronJobsAccordions" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const CronJobsAccordions: ({}: CronJobsAccordionsProps) => React_2.JSX.Element; - -// Warning: (ae-forgotten-export) The symbol "CustomResourcesProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "CustomResources" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const CustomResources: ({}: CustomResourcesProps) => React_2.JSX.Element; - -// Warning: (ae-missing-release-tag) "DeploymentResources" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface DeploymentResources { - // (undocumented) - deployments: V1Deployment[]; - // (undocumented) - horizontalPodAutoscalers: V1HorizontalPodAutoscaler[]; - // (undocumented) - pods: V1Pod[]; - // (undocumented) - replicaSets: V1ReplicaSet[]; -} - -// @public -export interface DetectedError { - // (undocumented) - message: string; - // (undocumented) - occurrenceCount: number; - // Warning: (ae-forgotten-export) The symbol "ProposedFix" needs to be exported by the entry point index.d.ts - // - // (undocumented) - proposedFix?: ProposedFix; - // (undocumented) - severity: ErrorSeverity; - // (undocumented) - sourceRef: ResourceRef; - // (undocumented) - type: string; -} - -// @public -export type DetectedErrorsByCluster = Map<string, DetectedError[]>; - -// @public -export const DetectedErrorsContext: React_2.Context<DetectedError[]>; - -// @public -export const detectErrors: ( - objects: ObjectsByEntityResponse, -) => DetectedErrorsByCluster; // Warning: (ae-missing-release-tag) "EntityKubernetesContent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -174,338 +22,11 @@ export type EntityKubernetesContentProps = { refreshIntervalMs?: number; }; -// @public -export const ErrorList: ({ - podAndErrors, -}: ErrorListProps) => React_2.JSX.Element; - -// @public -export interface ErrorListProps { - // (undocumented) - podAndErrors: PodAndErrors[]; -} - -// @public (undocumented) -export type ErrorMatcher = { - metadata?: IIoK8sApimachineryPkgApisMetaV1ObjectMeta; -} & TypeMeta; - -// Warning: (ae-forgotten-export) The symbol "ErrorPanelProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "ErrorPanel" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const ErrorPanel: ({ - entityName, - errorMessage, - clustersWithErrors, -}: ErrorPanelProps) => React_2.JSX.Element; - -// Warning: (ae-forgotten-export) The symbol "ErrorReportingProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "ErrorReporting" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const ErrorReporting: ({ - detectedErrors, -}: ErrorReportingProps) => React_3.JSX.Element; - -// @public -export type ErrorSeverity = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10; - -// @public -export const Events: ({ - involvedObjectName, - namespace, - clusterName, - warningEventsOnly, -}: EventsProps) => React_2.JSX.Element; - -// @public -export const EventsContent: ({ - events, - warningEventsOnly, -}: EventsContentProps) => React_2.JSX.Element; - -// @public -export interface EventsContentProps { - // (undocumented) - events: Event_2[]; - // (undocumented) - warningEventsOnly?: boolean; -} - -// @public -export interface EventsOptions { - // (undocumented) - clusterName: string; - // (undocumented) - involvedObjectName: string; - // (undocumented) - namespace: string; -} - -// @public -export interface EventsProps { - // (undocumented) - clusterName: string; - // (undocumented) - involvedObjectName: string; - // (undocumented) - namespace: string; - // (undocumented) - warningEventsOnly?: boolean; -} - -// @public -export const FixDialog: React_2.FC<FixDialogProps>; - -// @public -export interface FixDialogProps { - // (undocumented) - clusterName: string; - // (undocumented) - error: DetectedError; - // (undocumented) - open?: boolean; - // (undocumented) - pod: Pod; -} - -// Warning: (ae-forgotten-export) The symbol "FormatClusterLinkOptions" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "formatClusterLink" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function formatClusterLink( - options: FormatClusterLinkOptions, -): string | undefined; - -// Warning: (ae-forgotten-export) The symbol "KubernetesAuthProvider" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "GoogleKubernetesAuthProvider" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export class GoogleKubernetesAuthProvider implements KubernetesAuthProvider { - constructor(authProvider: OAuthApi); - // (undocumented) - authProvider: OAuthApi; - // (undocumented) - decorateRequestBodyForAuth( - requestBody: KubernetesRequestBody, - ): Promise<KubernetesRequestBody>; - // (undocumented) - getCredentials(): Promise<{ - token: string; - }>; -} - -// Warning: (ae-missing-release-tag) "GroupedResponses" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface GroupedResponses extends DeploymentResources { - // (undocumented) - configMaps: V1ConfigMap[]; - // (undocumented) - cronJobs: V1CronJob[]; - // (undocumented) - customResources: any[]; - // (undocumented) - ingresses: V1Ingress[]; - // (undocumented) - jobs: V1Job[]; - // (undocumented) - services: V1Service[]; - // (undocumented) - statefulsets: V1StatefulSet[]; -} - -// Warning: (ae-missing-release-tag) "GroupedResponsesContext" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const GroupedResponsesContext: React_2.Context<GroupedResponses>; - -// @public (undocumented) -export const HorizontalPodAutoscalerDrawer: (props: { - hpa: V1HorizontalPodAutoscaler; - expanded?: boolean; - children?: React_2.ReactNode; -}) => React_2.JSX.Element; - -// Warning: (ae-forgotten-export) The symbol "IngressesAccordionsProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "IngressesAccordions" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const IngressesAccordions: ({}: IngressesAccordionsProps) => React_2.JSX.Element; - // Warning: (ae-missing-release-tag) "isKubernetesAvailable" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const isKubernetesAvailable: (entity: Entity) => boolean; -// Warning: (ae-forgotten-export) The symbol "JobsAccordionsProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "JobsAccordions" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const JobsAccordions: ({ - jobs, -}: JobsAccordionsProps) => React_2.JSX.Element; - -// Warning: (ae-missing-release-tag) "KubernetesApi" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KubernetesApi { - // (undocumented) - getClusters(): Promise< - { - name: string; - authProvider: string; - oidcTokenProvider?: string | undefined; - }[] - >; - // (undocumented) - getCustomObjectsByEntity( - request: CustomObjectsByEntityRequest, - ): Promise<ObjectsByEntityResponse>; - // (undocumented) - getObjectsByEntity( - requestBody: KubernetesRequestBody, - ): Promise<ObjectsByEntityResponse>; - // (undocumented) - getWorkloadsByEntity( - request: WorkloadsByEntityRequest, - ): Promise<ObjectsByEntityResponse>; - // (undocumented) - proxy(options: { - clusterName: string; - path: string; - init?: RequestInit; - }): Promise<Response>; -} - -// Warning: (ae-missing-release-tag) "kubernetesApiRef" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const kubernetesApiRef: ApiRef<KubernetesApi>; - -// Warning: (ae-missing-release-tag) "KubernetesAuthProviders" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export class KubernetesAuthProviders implements KubernetesAuthProvidersApi { - constructor(options: { - microsoftAuthApi: OAuthApi; - googleAuthApi: OAuthApi; - oidcProviders?: { - [key: string]: OpenIdConnectApi; - }; - }); - // (undocumented) - decorateRequestBodyForAuth( - authProvider: string, - requestBody: KubernetesRequestBody, - ): Promise<KubernetesRequestBody>; - // (undocumented) - getCredentials(authProvider: string): Promise<{ - token?: string; - }>; -} - -// Warning: (ae-missing-release-tag) "KubernetesAuthProvidersApi" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KubernetesAuthProvidersApi { - // (undocumented) - decorateRequestBodyForAuth( - authProvider: string, - requestBody: KubernetesRequestBody, - ): Promise<KubernetesRequestBody>; - // (undocumented) - getCredentials(authProvider: string): Promise<{ - token?: string; - }>; -} - -// Warning: (ae-missing-release-tag) "kubernetesAuthProvidersApiRef" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const kubernetesAuthProvidersApiRef: ApiRef<KubernetesAuthProvidersApi>; - -// Warning: (ae-missing-release-tag) "KubernetesBackendClient" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export class KubernetesBackendClient implements KubernetesApi { - constructor(options: { - discoveryApi: DiscoveryApi; - identityApi: IdentityApi; - kubernetesAuthProvidersApi: KubernetesAuthProvidersApi; - }); - // (undocumented) - getClusters(): Promise< - { - name: string; - authProvider: string; - }[] - >; - // (undocumented) - getCustomObjectsByEntity( - request: CustomObjectsByEntityRequest, - ): Promise<ObjectsByEntityResponse>; - // (undocumented) - getObjectsByEntity( - requestBody: KubernetesRequestBody, - ): Promise<ObjectsByEntityResponse>; - // (undocumented) - getWorkloadsByEntity( - request: WorkloadsByEntityRequest, - ): Promise<ObjectsByEntityResponse>; - // (undocumented) - proxy(options: { - clusterName: string; - path: string; - init?: RequestInit; - }): Promise<Response>; -} - -// Warning: (ae-forgotten-export) The symbol "KubernetesContentProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "KubernetesContent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const KubernetesContent: ({ - entity, - refreshIntervalMs, -}: KubernetesContentProps) => React_2.JSX.Element; - -// Warning: (ae-forgotten-export) The symbol "KubernetesDrawerProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "KubernetesDrawer" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const KubernetesDrawer: ({ - open, - label, - drawerContentsHeader, - kubernetesObject, - children, -}: KubernetesDrawerProps) => React_2.JSX.Element; - -// Warning: (ae-forgotten-export) The symbol "KubernetesDrawerContentProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "KubernetesDrawerContent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const KubernetesDrawerContent: ({ - children, - header, - kubernetesObject, - close, -}: KubernetesDrawerContentProps) => React_2.JSX.Element; - -// Warning: (ae-missing-release-tag) "KubernetesObjects" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KubernetesObjects { - // (undocumented) - error?: string; - // (undocumented) - kubernetesObjects?: ObjectsByEntityResponse; - // (undocumented) - loading: boolean; -} - // Warning: (ae-missing-release-tag) "kubernetesPlugin" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -513,240 +34,11 @@ const kubernetesPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; export { kubernetesPlugin }; export { kubernetesPlugin as plugin }; -// Warning: (ae-missing-release-tag) "KubernetesProxyApi" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KubernetesProxyApi { - // (undocumented) - getEventsByInvolvedObjectName(request: { - clusterName: string; - involvedObjectName: string; - namespace: string; - }): Promise<Event_2[]>; - // (undocumented) - getPodLogs(request: { - podName: string; - namespace: string; - clusterName: string; - containerName: string; - previous?: boolean; - }): Promise<{ - text: string; - }>; -} - -// Warning: (ae-missing-release-tag) "kubernetesProxyApiRef" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const kubernetesProxyApiRef: ApiRef<KubernetesProxyApi>; - -// @public -export class KubernetesProxyClient { - constructor(options: { kubernetesApi: KubernetesApi }); - // (undocumented) - getEventsByInvolvedObjectName({ - clusterName, - involvedObjectName, - namespace, - }: { - clusterName: string; - involvedObjectName: string; - namespace: string; - }): Promise<Event_2[]>; - // (undocumented) - getPodLogs({ - podName, - namespace, - clusterName, - containerName, - previous, - }: { - podName: string; - namespace: string; - clusterName: string; - containerName: string; - previous?: boolean; - }): Promise<{ - text: string; - }>; -} - -// Warning: (ae-forgotten-export) The symbol "KubernetesDrawerable" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "KubernetesStructuredMetadataTableDrawerProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "KubernetesStructuredMetadataTableDrawer" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const KubernetesStructuredMetadataTableDrawer: < - T extends KubernetesDrawerable, ->({ - object, - renderObject, - kind, - buttonVariant, - expanded, - children, -}: KubernetesStructuredMetadataTableDrawerProps<T>) => React_2.JSX.Element; - -// Warning: (ae-forgotten-export) The symbol "ErrorPanelProps_2" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "LinkErrorPanel" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const LinkErrorPanel: ({ - cluster, - errorMessage, -}: ErrorPanelProps_2) => React_2.JSX.Element; - -// @public -export const PendingPodContent: ({ - pod, -}: PendingPodContentProps) => React_2.JSX.Element; - -// @public -export interface PendingPodContentProps { - // (undocumented) - pod: Pod_2; -} - -// @public -export interface PodAndErrors { - // (undocumented) - clusterName: string; - // (undocumented) - errors: DetectedError[]; - // (undocumented) - pod: Pod_2; -} - -// Warning: (ae-forgotten-export) The symbol "PodDrawerProps" needs to be exported by the entry point index.d.ts -// -// @public -export const PodDrawer: ({ - podAndErrors, - open, -}: PodDrawerProps) => React_2.JSX.Element; - -// @public -export const PodExecTerminal: ( - props: PodExecTerminalProps, -) => React_2.JSX.Element; - -// @public -export const PodExecTerminalDialog: ( - props: PodExecTerminalProps, -) => React_2.JSX.Element; - -// @public -export interface PodExecTerminalProps { - // (undocumented) - clusterName: string; - // (undocumented) - containerName: string; - // (undocumented) - podName: string; - // (undocumented) - podNamespace: string; -} - -// @public -export const PodLogs: React_2.FC<PodLogsProps>; - -// @public -export const PodLogsDialog: ({ - containerScope, -}: PodLogsDialogProps) => React_2.JSX.Element; - -// @public -export interface PodLogsDialogProps { - // (undocumented) - containerScope: ContainerScope; -} - -// @public -export interface PodLogsOptions { - // (undocumented) - containerScope: ContainerScope; - // (undocumented) - previous?: boolean; -} - -// @public -export interface PodLogsProps { - // (undocumented) - containerScope: ContainerScope; - // (undocumented) - previous?: boolean; -} - -// @public -export const PodMetricsContext: React_2.Context<Map<string, ClientPodStatus[]>>; - -// Warning: (ae-missing-release-tag) "PodMetricsMatcher" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type PodMetricsMatcher = { - metadata?: IObjectMeta; -}; - -// Warning: (ae-missing-release-tag) "PodNamesWithErrorsContext" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const PodNamesWithErrorsContext: React_2.Context<Set<string>>; - -// Warning: (ae-missing-release-tag) "PodNamesWithMetricsContext" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const PodNamesWithMetricsContext: React_2.Context< - Map<string, ClientPodStatus> ->; - -// @public -export interface PodScope { - // (undocumented) - clusterName: string; - // (undocumented) - podName: string; - // (undocumented) - podNamespace: string; -} - -// Warning: (ae-forgotten-export) The symbol "PodsTablesProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "PodsTable" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const PodsTable: ({ - pods, - extraColumns, -}: PodsTablesProps) => React_2.JSX.Element; - -// @public -export interface ResourceRef { - // (undocumented) - apiGroup: string; - // (undocumented) - kind: string; - // (undocumented) - name: string; - // (undocumented) - namespace: string; -} - -// Warning: (ae-forgotten-export) The symbol "ResourceUtilizationProps" needs to be exported by the entry point index.d.ts -// -// @public -export const ResourceUtilization: ({ - compressed, - title, - usage, - total, - totalFormatted, -}: ResourceUtilizationProps) => React_2.JSX.Element; - // Warning: (ae-missing-release-tag) "Router" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -754,60 +46,5 @@ export const Router: (props: { refreshIntervalMs?: number; }) => React_2.JSX.Element; -// @public -export class ServerSideKubernetesAuthProvider - implements KubernetesAuthProvider -{ - // (undocumented) - decorateRequestBodyForAuth( - requestBody: KubernetesRequestBody, - ): Promise<KubernetesRequestBody>; - // (undocumented) - getCredentials(): Promise<{}>; -} - -// Warning: (ae-forgotten-export) The symbol "ServicesAccordionsProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "ServicesAccordions" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const ServicesAccordions: ({}: ServicesAccordionsProps) => React_2.JSX.Element; - -// @public -export const useCustomResources: ( - entity: Entity, - customResourceMatchers: CustomResourceMatcher[], - intervalMs?: number, -) => KubernetesObjects; - -// @public -export const useEvents: ({ - involvedObjectName, - namespace, - clusterName, -}: EventsOptions) => AsyncState<Event_2[]>; - -// Warning: (ae-missing-release-tag) "useKubernetesObjects" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const useKubernetesObjects: ( - entity: Entity, - intervalMs?: number, -) => KubernetesObjects; - -// @public -export const useMatchingErrors: (matcher: ErrorMatcher) => DetectedError[]; - -// @public -export const usePodLogs: ({ - containerScope, - previous, -}: PodLogsOptions) => AsyncState<{ - text: string; -}>; - -// @public -export const usePodMetrics: ( - clusterName: string, - matcher: PodMetricsMatcher, -) => ClientPodStatus | undefined; +export * from '@backstage/plugin-kubernetes-react'; ``` diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 4bd55d65a3..fdc792fc52 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.10.3-next.3", + "version": "0.10.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -41,6 +41,7 @@ "@backstage/errors": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", + "@backstage/plugin-kubernetes-react": "workspace:^", "@backstage/theme": "workspace:^", "@backstage/types": "workspace:^", "@kubernetes-models/apimachinery": "^1.1.0", diff --git a/plugins/kubernetes/src/components/KubernetesContent.test.tsx b/plugins/kubernetes/src/KubernetesContent.test.tsx similarity index 91% rename from plugins/kubernetes/src/components/KubernetesContent.test.tsx rename to plugins/kubernetes/src/KubernetesContent.test.tsx index 4c85298dba..7c21c6f5a7 100644 --- a/plugins/kubernetes/src/components/KubernetesContent.test.tsx +++ b/plugins/kubernetes/src/KubernetesContent.test.tsx @@ -18,13 +18,19 @@ import React from 'react'; import { screen } from '@testing-library/react'; import { renderInTestApp } from '@backstage/test-utils'; import { KubernetesContent } from './KubernetesContent'; -import { useKubernetesObjects } from '../hooks'; +import { useKubernetesObjects } from '@backstage/plugin-kubernetes-react'; +import * as oneDeployment from './__fixtures__/1-deployments.json'; +import * as twoDeployments from './__fixtures__/2-deployments.json'; -jest.mock('../hooks'); -import * as oneDeployment from '../__fixtures__/1-deployments.json'; -import * as twoDeployments from '../__fixtures__/2-deployments.json'; +jest.mock('@backstage/plugin-kubernetes-react', () => ({ + ...jest.requireActual('@backstage/plugin-kubernetes-react'), + useKubernetesObjects: jest.fn(), +})); describe('KubernetesContent', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); it('render empty response', async () => { (useKubernetesObjects as any).mockReturnValue({ kubernetesObjects: { diff --git a/plugins/kubernetes/src/components/KubernetesContent.tsx b/plugins/kubernetes/src/KubernetesContent.tsx similarity index 81% rename from plugins/kubernetes/src/components/KubernetesContent.tsx rename to plugins/kubernetes/src/KubernetesContent.tsx index a465422095..9c266b1854 100644 --- a/plugins/kubernetes/src/components/KubernetesContent.tsx +++ b/plugins/kubernetes/src/KubernetesContent.tsx @@ -17,14 +17,23 @@ import React from 'react'; import { Grid, Typography } from '@material-ui/core'; import { Entity } from '@backstage/catalog-model'; -import { ErrorPanel } from './ErrorPanel'; -import { ErrorReporting } from './ErrorReporting'; -import { DetectedError, detectErrors } from '../error-detection'; -import { Cluster } from './Cluster'; -import EmptyStateImage from '../assets/emptystate.svg'; -import { useKubernetesObjects } from '../hooks'; -import { Content, Page, Progress } from '@backstage/core-components'; -import { DetectedErrorsContext } from '../hooks/useMatchingErrors'; +import { + ErrorPanel, + ErrorReporting, + Cluster, + useKubernetesObjects, + DetectedErrorsContext, +} from '@backstage/plugin-kubernetes-react'; +import { + DetectedError, + detectErrors, +} from '@backstage/plugin-kubernetes-common'; +import { + Content, + EmptyState, + Page, + Progress, +} from '@backstage/core-components'; type KubernetesContentProps = { entity: Entity; @@ -98,17 +107,11 @@ export const KubernetesContent = ({ alignItems="center" spacing={2} > - <Grid item xs={4}> - <Typography variant="h5"> - No resources on any known clusters for{' '} - {entity.metadata.name} - </Typography> - </Grid> - <Grid item xs={4}> - <img - src={EmptyStateImage} - alt="EmptyState" - data-testid="emptyStateImg" + <Grid item xs={8}> + <EmptyState + missing="data" + title="No Kubernetes resources" + description={`No resources on any known clusters for ${entity.metadata.name}`} /> </Grid> </Grid> diff --git a/plugins/kubernetes/src/Router.tsx b/plugins/kubernetes/src/Router.tsx index fd3a4bd0ce..bd8fc09edc 100644 --- a/plugins/kubernetes/src/Router.tsx +++ b/plugins/kubernetes/src/Router.tsx @@ -18,7 +18,7 @@ import React from 'react'; import { Entity } from '@backstage/catalog-model'; import { useEntity } from '@backstage/plugin-catalog-react'; import { Route, Routes } from 'react-router-dom'; -import { KubernetesContent } from './components/KubernetesContent'; +import { KubernetesContent } from './KubernetesContent'; import { Button } from '@material-ui/core'; import { MissingAnnotationEmptyState } from '@backstage/core-components'; diff --git a/plugins/kubernetes/src/assets/emptystate.svg b/plugins/kubernetes/src/assets/emptystate.svg deleted file mode 100644 index 8a0490727f..0000000000 --- a/plugins/kubernetes/src/assets/emptystate.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="282" height="173" fill="none" viewBox="0 0 282 173"><path fill="#000" fill-opacity=".05" fill-rule="evenodd" d="M16.4571 45.1637C11.0514 46.1711 7.48574 51.3699 8.49306 56.7756C9.50039 62.1814 14.6992 65.747 20.105 64.7397L27.5528 63.3518C25.4791 65.5835 24.4525 68.7347 25.0535 71.9596C26.0608 77.3653 31.2596 80.931 36.6654 79.9236L89.691 70.0427C89.7016 70.1067 89.7129 70.1708 89.7249 70.2349C90.3258 73.4598 92.4185 76.0298 95.1569 77.3647L91.9031 77.971C86.4974 78.9784 82.9318 84.1772 83.9391 89.583C84.9464 94.9887 90.1452 98.5543 95.551 97.547L250.098 68.7482C255.504 67.7409 259.069 62.5421 258.062 57.1363C257.461 53.9114 255.368 51.3414 252.63 50.0065L257.835 49.0366C263.241 48.0292 266.807 42.8304 265.799 37.4247C264.792 32.0189 259.593 28.4533 254.187 29.4606L161.492 46.7338C161.481 46.6697 161.47 46.6056 161.458 46.5415C160.857 43.3166 158.764 40.7466 156.026 39.4117L165.025 37.7347C170.431 36.7274 173.997 31.5286 172.989 26.1228C171.982 20.7171 166.783 17.1514 161.378 18.1588L16.4571 45.1637ZM24.3031 122.54C23.2958 117.134 26.8614 111.936 32.2672 110.928L190.856 81.3762C196.262 80.3688 201.461 83.9345 202.468 89.3402C203.476 94.746 199.91 99.9448 194.504 100.952L189.963 101.798C190.493 102.057 190.999 102.362 191.474 102.708L246.43 92.4677C251.835 91.4604 257.034 95.026 258.041 100.432C258.642 103.657 257.616 106.808 255.542 109.04L256.649 108.833C262.055 107.826 267.253 111.392 268.261 116.797C269.268 122.203 265.702 127.402 260.297 128.409L95.5591 159.107C90.1534 160.114 84.9545 156.549 83.9472 151.143C82.9399 145.737 86.5055 140.538 91.9113 139.531L103.94 137.29C103.41 137.031 102.904 136.726 102.429 136.38L29.1002 150.044C23.6944 151.051 18.4956 147.486 17.4882 142.08C16.4809 136.674 20.0465 131.475 25.4523 130.468L29.7352 129.67C26.9967 128.335 24.904 125.765 24.3031 122.54Z" clip-rule="evenodd"/><circle cx="188" cy="55" r="6" fill="#69DDC7"/><circle cx="91" cy="92" r="6" fill="#69DDC7"/><path fill="#69DDC7" d="M121 114L95.5 88L86.5 96L121 130L192.5 59L183.5 51L121 114Z"/></svg> diff --git a/plugins/kubernetes/src/components/CronJobsAccordions/index.ts b/plugins/kubernetes/src/components/CronJobsAccordions/index.ts deleted file mode 100644 index e72e3f7e6d..0000000000 --- a/plugins/kubernetes/src/components/CronJobsAccordions/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export { CronJobsAccordions } from './CronJobsAccordions'; diff --git a/plugins/kubernetes/src/components/IngressesAccordions/index.ts b/plugins/kubernetes/src/components/IngressesAccordions/index.ts deleted file mode 100644 index 8e7f103e42..0000000000 --- a/plugins/kubernetes/src/components/IngressesAccordions/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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 { IngressesAccordions } from './IngressesAccordions'; diff --git a/plugins/kubernetes/src/components/ServicesAccordions/index.ts b/plugins/kubernetes/src/components/ServicesAccordions/index.ts deleted file mode 100644 index 04fee9caca..0000000000 --- a/plugins/kubernetes/src/components/ServicesAccordions/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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 { ServicesAccordions } from './ServicesAccordions'; diff --git a/plugins/kubernetes/src/error-detection/index.ts b/plugins/kubernetes/src/error-detection/index.ts deleted file mode 100644 index 3a8789d79d..0000000000 --- a/plugins/kubernetes/src/error-detection/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 type { - DetectedError, - DetectedErrorsByCluster, - ErrorSeverity, - ResourceRef, -} from './types'; -export { detectErrors } from './error-detection'; diff --git a/plugins/kubernetes/src/index.ts b/plugins/kubernetes/src/index.ts index 616caaef62..3651a861fc 100644 --- a/plugins/kubernetes/src/index.ts +++ b/plugins/kubernetes/src/index.ts @@ -27,10 +27,5 @@ export { } from './plugin'; export type { EntityKubernetesContentProps } from './plugin'; export { Router, isKubernetesAvailable } from './Router'; -export * from './api'; -export * from './kubernetes-auth-provider'; -export * from './utils/clusterLinks'; -export * from './components'; -export * from './error-detection'; -export * from './hooks'; -export * from './types'; +// TODO remove this re-export as a breaking change after a couple of releases +export * from '@backstage/plugin-kubernetes-react'; diff --git a/plugins/kubernetes/src/kubernetes-auth-provider/index.ts b/plugins/kubernetes/src/kubernetes-auth-provider/index.ts deleted file mode 100644 index 23197321f6..0000000000 --- a/plugins/kubernetes/src/kubernetes-auth-provider/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * 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 { kubernetesAuthProvidersApiRef } from './types'; -export type { KubernetesAuthProvidersApi } from './types'; -export { KubernetesAuthProviders } from './KubernetesAuthProviders'; -export { GoogleKubernetesAuthProvider } from './GoogleKubernetesAuthProvider'; -export { ServerSideKubernetesAuthProvider } from './ServerSideAuthProvider'; diff --git a/plugins/kubernetes/src/plugin.ts b/plugins/kubernetes/src/plugin.ts index 02c7bfd2d6..ac55dbbf23 100644 --- a/plugins/kubernetes/src/plugin.ts +++ b/plugins/kubernetes/src/plugin.ts @@ -13,10 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { KubernetesBackendClient } from './api/KubernetesBackendClient'; -import { kubernetesApiRef, kubernetesProxyApiRef } from './api/types'; -import { kubernetesAuthProvidersApiRef } from './kubernetes-auth-provider/types'; -import { KubernetesAuthProviders } from './kubernetes-auth-provider/KubernetesAuthProviders'; +import { + KubernetesBackendClient, + kubernetesApiRef, + kubernetesProxyApiRef, + kubernetesAuthProvidersApiRef, + KubernetesAuthProviders, + KubernetesProxyClient, +} from '@backstage/plugin-kubernetes-react'; import { createApiFactory, createPlugin, @@ -30,7 +34,6 @@ import { oneloginAuthApiRef, createRoutableExtension, } from '@backstage/core-plugin-api'; -import { KubernetesProxyClient } from './api'; export const rootCatalogKubernetesRouteRef = createRouteRef({ id: 'kubernetes', diff --git a/plugins/kubernetes/src/types/types.ts b/plugins/kubernetes/src/types/types.ts deleted file mode 100644 index f15c4f335a..0000000000 --- a/plugins/kubernetes/src/types/types.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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 type { JsonObject } from '@backstage/types'; -import { - V1Deployment, - V1Pod, - V1ReplicaSet, - V1HorizontalPodAutoscaler, - V1Service, - V1ConfigMap, - V1Ingress, - V1Job, - V1CronJob, - V1StatefulSet, -} from '@kubernetes/client-node'; - -export interface DeploymentResources { - pods: V1Pod[]; - replicaSets: V1ReplicaSet[]; - deployments: V1Deployment[]; - horizontalPodAutoscalers: V1HorizontalPodAutoscaler[]; -} - -export interface GroupedResponses extends DeploymentResources { - services: V1Service[]; - configMaps: V1ConfigMap[]; - ingresses: V1Ingress[]; - jobs: V1Job[]; - cronJobs: V1CronJob[]; - customResources: any[]; - statefulsets: V1StatefulSet[]; -} - -export interface ClusterLinksFormatterOptions { - dashboardUrl?: URL; - dashboardParameters?: JsonObject; - object: any; - kind: string; -} - -export type ClusterLinksFormatter = ( - options: ClusterLinksFormatterOptions, -) => URL; diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index 96a47eaa53..420f70c1d2 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-lighthouse-backend +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-lighthouse-common@0.1.3 + +## 0.3.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-lighthouse-common@0.1.3 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index dbea5afd41..4946391d4a 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.3.0-next.3", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-common/CHANGELOG.md b/plugins/lighthouse-common/CHANGELOG.md index 8c800bec23..ddeffb94b3 100644 --- a/plugins/lighthouse-common/CHANGELOG.md +++ b/plugins/lighthouse-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-lighthouse-common +## 0.1.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + ## 0.1.3-next.2 ### Patch Changes diff --git a/plugins/lighthouse-common/package.json b/plugins/lighthouse-common/package.json index e58e2bea17..086ee6cccd 100644 --- a/plugins/lighthouse-common/package.json +++ b/plugins/lighthouse-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-common", "description": "Common functionalities for lighthouse, to be shared between lighthouse and lighthouse-backend plugin", - "version": "0.1.3-next.2", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index fabd108fa5..9690efc150 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-lighthouse +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-lighthouse-common@0.1.3 + +## 0.4.9 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-lighthouse-common@0.1.3 + - @backstage/theme@0.4.2 + ## 0.4.9-next.3 ### Patch Changes diff --git a/plugins/lighthouse/api-report.md b/plugins/lighthouse/api-report.md index 9794fe1728..40a4ff514f 100644 --- a/plugins/lighthouse/api-report.md +++ b/plugins/lighthouse/api-report.md @@ -49,7 +49,6 @@ const lighthousePlugin: BackstagePlugin< root: RouteRef<undefined>; entityContent: RouteRef<undefined>; }, - {}, {} >; export { lighthousePlugin }; diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index 2f8b79291c..e23b8ae742 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.4.9-next.3", + "version": "0.4.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md index aabef8ecaf..037bba87c2 100644 --- a/plugins/linguist-backend/CHANGELOG.md +++ b/plugins/linguist-backend/CHANGELOG.md @@ -1,5 +1,59 @@ # @backstage/plugin-linguist-backend +## 0.5.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-linguist-common@0.1.2 + +## 0.5.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- b2de501bda31: When creating the router using `createRouterFromConfig` or using the plugin for the new backend system the `linguist.useSourceLocation` configuration is now optional. +- cfc3ca6ce060: Changes needed to support MySQL +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + ## 0.5.0-next.3 ### Minor Changes diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index 9c2f4dcb5c..e75d9daef2 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist-backend", - "version": "0.5.0-next.3", + "version": "0.5.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-common/CHANGELOG.md b/plugins/linguist-common/CHANGELOG.md index 5e4e40142f..c9eb3c0c28 100644 --- a/plugins/linguist-common/CHANGELOG.md +++ b/plugins/linguist-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-linguist-common +## 0.1.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/linguist-common/package.json b/plugins/linguist-common/package.json index a595fc2cd5..ff2e78affd 100644 --- a/plugins/linguist-common/package.json +++ b/plugins/linguist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-linguist-common", "description": "Common functionalities for the linguist plugin", - "version": "0.1.2-next.0", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md index 6223f36093..eae430348d 100644 --- a/plugins/linguist/CHANGELOG.md +++ b/plugins/linguist/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-linguist +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-linguist-common@0.1.2 + +## 0.1.9 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/theme@0.4.2 + ## 0.1.9-next.3 ### Patch Changes diff --git a/plugins/linguist/api-report.md b/plugins/linguist/api-report.md index 5182ce12f6..71e2460088 100644 --- a/plugins/linguist/api-report.md +++ b/plugins/linguist/api-report.md @@ -16,7 +16,7 @@ export const EntityLinguistCard: () => JSX_2.Element; export const isLinguistAvailable: (entity: Entity) => boolean; // @public (undocumented) -export const linguistPlugin: BackstagePlugin<{}, {}, {}>; +export const linguistPlugin: BackstagePlugin<{}, {}>; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json index 2c399b5b71..a748670653 100644 --- a/plugins/linguist/package.json +++ b/plugins/linguist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist", - "version": "0.1.9-next.3", + "version": "0.1.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md index 3adb362d71..3ada5bb9d1 100644 --- a/plugins/microsoft-calendar/CHANGELOG.md +++ b/plugins/microsoft-calendar/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-microsoft-calendar +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.7 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index d4573f1e40..5f66f361fe 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-microsoft-calendar", - "version": "0.1.7-next.3", + "version": "0.1.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index dd9b498111..b7c866f7f8 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + +## 0.2.17 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + ## 0.2.17-next.3 ### Patch Changes diff --git a/plugins/newrelic-dashboard/api-report.md b/plugins/newrelic-dashboard/api-report.md index 2e9b11a88e..ce7b8d5b7e 100644 --- a/plugins/newrelic-dashboard/api-report.md +++ b/plugins/newrelic-dashboard/api-report.md @@ -31,7 +31,6 @@ export const newRelicDashboardPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 4bc7941cf3..d491e86ab7 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.17-next.3", + "version": "0.2.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index be956aa02c..e896702b4b 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-newrelic +## 0.3.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## 0.3.40 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 55cb7061e072: Fixed bug in NewRelicComponent component where table would not sort correctly for numerical values. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.3.40-next.3 ### Patch Changes diff --git a/plugins/newrelic/api-report.md b/plugins/newrelic/api-report.md index 04fd229465..a77b80c862 100644 --- a/plugins/newrelic/api-report.md +++ b/plugins/newrelic/api-report.md @@ -17,7 +17,6 @@ const newRelicPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; export { newRelicPlugin }; diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 86900596a4..1ab21391da 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.40-next.3", + "version": "0.3.41-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/nomad-backend/CHANGELOG.md b/plugins/nomad-backend/CHANGELOG.md index 48aa8fc484..188bba8900 100644 --- a/plugins/nomad-backend/CHANGELOG.md +++ b/plugins/nomad-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-nomad-backend +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + ## 0.1.5-next.3 ### Patch Changes diff --git a/plugins/nomad-backend/package.json b/plugins/nomad-backend/package.json index bd6af719f6..ac16ab79ec 100644 --- a/plugins/nomad-backend/package.json +++ b/plugins/nomad-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-nomad-backend", - "version": "0.1.5-next.3", + "version": "0.1.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/nomad/CHANGELOG.md b/plugins/nomad/CHANGELOG.md index 7645656f84..cf42bd5820 100644 --- a/plugins/nomad/CHANGELOG.md +++ b/plugins/nomad/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-nomad +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.1.5 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.5-next.3 ### Patch Changes diff --git a/plugins/nomad/api-report.md b/plugins/nomad/api-report.md index c2d06b9892..68cc47c33d 100644 --- a/plugins/nomad/api-report.md +++ b/plugins/nomad/api-report.md @@ -28,7 +28,6 @@ export const nomadPlugin: BackstagePlugin< root: RouteRef<undefined>; entityContent: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/nomad/package.json b/plugins/nomad/package.json index 874b3dfe19..7e7fc1a739 100644 --- a/plugins/nomad/package.json +++ b/plugins/nomad/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-nomad", - "version": "0.1.5-next.3", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md index 24a5db96d8..aa0f193a62 100644 --- a/plugins/octopus-deploy/CHANGELOG.md +++ b/plugins/octopus-deploy/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-octopus-deploy +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.2.6 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/octopus-deploy/api-report.md b/plugins/octopus-deploy/api-report.md index 713d99aa8f..3d65e40c64 100644 --- a/plugins/octopus-deploy/api-report.md +++ b/plugins/octopus-deploy/api-report.md @@ -55,7 +55,7 @@ export type OctopusDeployment = { }; // @public (undocumented) -export const octopusDeployPlugin: BackstagePlugin<{}, {}, {}>; +export const octopusDeployPlugin: BackstagePlugin<{}, {}>; // @public (undocumented) export type OctopusEnvironment = { diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index 20cbd4e5a2..a82e7f74e1 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-octopus-deploy", - "version": "0.2.6-next.3", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/opencost/CHANGELOG.md b/plugins/opencost/CHANGELOG.md index 95b73bfba1..960faf29e7 100644 --- a/plugins/opencost/CHANGELOG.md +++ b/plugins/opencost/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-opencost +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + +## 0.2.0 + +### Minor Changes + +- 1380a689ab56: New OpenCost plugin provides an port of the latest OpenCost UI to Backstage with updated dependencies. The plugin's README covers installation and configuration + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.2.0-next.3 ### Patch Changes diff --git a/plugins/opencost/api-report.md b/plugins/opencost/api-report.md index 079f394618..996bcea6ac 100644 --- a/plugins/opencost/api-report.md +++ b/plugins/opencost/api-report.md @@ -17,7 +17,6 @@ export const openCostPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; ``` diff --git a/plugins/opencost/package.json b/plugins/opencost/package.json index a446e44e93..87b533f153 100644 --- a/plugins/opencost/package.json +++ b/plugins/opencost/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-opencost", - "version": "0.2.0-next.3", + "version": "0.2.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index ec5e0e3129..71e1b94403 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-org-react +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.1.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.1.13-next.3 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 280e27cff6..a5e5a8562b 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.13-next.3", + "version": "0.1.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index d999f54da1..a2e7a2b60a 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-org +## 0.6.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.6.14 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 43a2137bb829: Ensure direct relations are shown for User entities while keeping support for aggregating closest parent group ownership +- dd9329caea1c: Entity relations toggle should by default be aggregated for User entities +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.6.14-next.3 ### Patch Changes diff --git a/plugins/org/api-report.md b/plugins/org/api-report.md index d85df7125c..922b25b610 100644 --- a/plugins/org/api-report.md +++ b/plugins/org/api-report.md @@ -69,8 +69,7 @@ const orgPlugin: BackstagePlugin< {}, { catalogIndex: ExternalRouteRef<undefined, false>; - }, - {} + } >; export { orgPlugin }; export { orgPlugin as plugin }; diff --git a/plugins/org/package.json b/plugins/org/package.json index 5e6aace0fc..7d931c4797 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.14-next.3", + "version": "0.6.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index 2c20696fcd..d9936c4f41 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-pagerduty +## 0.6.6-next.0 + +### Patch Changes + +- b9ce306814: Minor fix to avoid usage of deprecated prop +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-home-react@0.1.4-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.6.5 + +### Patch Changes + +- 3b41afed4d0c: Minor internal tweaks to improve tests +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.6.5-next.3 ### Patch Changes diff --git a/plugins/pagerduty/api-report.md b/plugins/pagerduty/api-report.md index 24c2e103cf..db73259dd5 100644 --- a/plugins/pagerduty/api-report.md +++ b/plugins/pagerduty/api-report.md @@ -177,7 +177,7 @@ export type PagerDutyOnCallsResponse = { }; // @public (undocumented) -const pagerDutyPlugin: BackstagePlugin<{}, {}, {}>; +const pagerDutyPlugin: BackstagePlugin<{}, {}>; export { pagerDutyPlugin }; export { pagerDutyPlugin as plugin }; diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 8750e6e2cc..28682c2f2d 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.6.5-next.3", + "version": "0.6.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx b/plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx index 38bf8c9e43..4ec2d599c7 100644 --- a/plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx +++ b/plugins/pagerduty/src/components/ChangeEvents/ChangeEventEmptyState.tsx @@ -20,7 +20,12 @@ import EmptyStateImage from '../../assets/emptystate.svg'; export const ChangeEventEmptyState = () => { return ( - <Grid container justify="center" direction="column" alignItems="center"> + <Grid + container + justifyContent="center" + direction="column" + alignItems="center" + > <Grid item xs={12}> <Typography variant="h5">No change events to display yet.</Typography> </Grid> diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index 9b529d350f..448a804f23 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-periskop-backend +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.2.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.0-next.3 ### Minor Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index a2b791ac67..ad0bcf0ad2 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.2.0-next.3", + "version": "0.2.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index 7c4b436b2c..a38ca46956 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-periskop +## 0.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.22 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.22-next.3 ### Patch Changes diff --git a/plugins/periskop/api-report.md b/plugins/periskop/api-report.md index 578fb1dc49..607cbbb4d0 100644 --- a/plugins/periskop/api-report.md +++ b/plugins/periskop/api-report.md @@ -120,7 +120,7 @@ export class PeriskopClient implements PeriskopApi { } // @public (undocumented) -export const periskopPlugin: BackstagePlugin<{}, {}, {}>; +export const periskopPlugin: BackstagePlugin<{}, {}>; // @public (undocumented) export interface RequestHeaders { diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 031d909c19..e2d7f6e74d 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.22-next.3", + "version": "0.1.23-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md index 4718e4a2f5..49b6cfd3a0 100644 --- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md +++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/plugin-permission-backend-module-allow-all-policy +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## 0.1.0 + +### Minor Changes + +- 5f7b2153526b: Created package with policy `permissionModuleAllowAllPolicy` + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + ## 0.1.0-next.1 ### Patch Changes diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json index 8e31a61d03..12e60881af 100644 --- a/plugins/permission-backend-module-policy-allow-all/package.json +++ b/plugins/permission-backend-module-policy-allow-all/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-backend-module-allow-all-policy", "description": "Allow all policy backend module for the permission plugin.", - "version": "0.1.0-next.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 9e0965aa9a..978552f3ed 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-permission-backend +## 0.5.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## 0.5.26 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- a8a614ba0d07: Minor `package.json` update. +- 84ad6fccd4d5: Moved `permissionModuleAllowAllPolicy` to `@backstage/plugin-permission-backend-module-allow-all-policy` +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + ## 0.5.26-next.3 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 6022d0ccc0..0833e9e89b 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.26-next.3", + "version": "0.5.28-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index 97a3886f11..f39e4455ec 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-common +## 0.7.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + ## 0.7.8-next.2 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 9c7e6765cf..050b696aef 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-common", "description": "Isomorphic types and client for Backstage permissions and authorization", - "version": "0.7.8-next.2", + "version": "0.7.8", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 7f05726d36..bcdf5ce358 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-permission-node +## 0.7.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + +## 0.7.14 + +### Patch Changes + +- a8a614ba0d07: Minor `package.json` update. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + ## 0.7.14-next.3 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index b1c6513408..3bacf5e3ed 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.14-next.3", + "version": "0.7.16-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index 0894567cbf..0df727d454 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-permission-react +## 0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-common@0.7.8 + +## 0.4.15 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-permission-common@0.7.8 + ## 0.4.15-next.3 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index b2bbe3fe37..7e79128739 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.15-next.3", + "version": "0.4.16-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index 247f0fe628..0af03356ae 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-playlist-backend +## 0.3.9-next.0 + +### Patch Changes + +- 9e46f5ff49: Added support to the playlist plugin for the new backend +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-playlist-common@0.1.10 + +## 0.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-playlist-common@0.1.10 + - @backstage/plugin-permission-node@0.7.14 + ## 0.3.7-next.3 ### Patch Changes diff --git a/plugins/playlist-backend/README.md b/plugins/playlist-backend/README.md index c0055ebdf7..b5c9b8797b 100644 --- a/plugins/playlist-backend/README.md +++ b/plugins/playlist-backend/README.md @@ -85,3 +85,20 @@ export default async function createPlugin(env: PluginEnvironment): Promise<Rout policy: new BackstagePermissionPolicy(), ... ``` + +### New Backend System + +The Playlist backend plugin has support for the [new backend system](https://backstage.io/docs/backend-system/), here's how you can set that up: + +In your `packages/backend/src/index.ts` make the following changes: + +```diff +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + +backend.add(import('@backstage/plugin-playlist-backend')); +// ... other feature additions + +backend.start(); +``` diff --git a/plugins/playlist-backend/api-report.md b/plugins/playlist-backend/api-report.md index b755347205..40b05c25d4 100644 --- a/plugins/playlist-backend/api-report.md +++ b/plugins/playlist-backend/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; import { BackstageIdentityResponse } from '@backstage/plugin-auth-node'; import { ConditionalPolicyDecision } from '@backstage/plugin-permission-common'; import { Conditions } from '@backstage/plugin-permission-node'; @@ -80,6 +81,10 @@ export const playlistConditions: Conditions<{ >; }>; +// @public +const playlistPlugin: () => BackendFeature; +export default playlistPlugin; + // @public (undocumented) export interface RouterOptions { // (undocumented) diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 53a3bff88a..ac2ec35fb9 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.3.7-next.3", + "version": "0.3.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,6 +29,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", diff --git a/plugins/playlist-backend/src/index.ts b/plugins/playlist-backend/src/index.ts index eeccd8913f..9081552e00 100644 --- a/plugins/playlist-backend/src/index.ts +++ b/plugins/playlist-backend/src/index.ts @@ -26,3 +26,4 @@ export { isPlaylistPermission, playlistConditions, } from './permissions'; +export { playlistPlugin as default } from './plugin'; diff --git a/plugins/playlist-backend/src/plugin.ts b/plugins/playlist-backend/src/plugin.ts new file mode 100644 index 0000000000..b4d926c05e --- /dev/null +++ b/plugins/playlist-backend/src/plugin.ts @@ -0,0 +1,53 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { createRouter } from './service'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; + +/** + * Playlist backend plugin + * + * @public + */ +export const playlistPlugin = createBackendPlugin({ + pluginId: 'playlist', + register(env) { + env.registerInit({ + deps: { + http: coreServices.httpRouter, + logger: coreServices.logger, + database: coreServices.database, + identity: coreServices.identity, + discovery: coreServices.discovery, + permissions: coreServices.permissions, + }, + async init({ http, logger, database, identity, discovery, permissions }) { + http.use( + await createRouter({ + logger: loggerToWinstonLogger(logger), + database, + identity, + discovery, + permissions, + }), + ); + }, + }); + }, +}); diff --git a/plugins/playlist-common/CHANGELOG.md b/plugins/playlist-common/CHANGELOG.md index d4da347fd0..b6d6eb8990 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-playlist-common +## 0.1.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + ## 0.1.10-next.2 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 4e0ac59ff2..f31094c5a6 100644 --- a/plugins/playlist-common/package.json +++ b/plugins/playlist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-playlist-common", "description": "Common functionalities for the playlist plugin", - "version": "0.1.10-next.2", + "version": "0.1.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index 3deb9cc5b5..46888d22f0 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-playlist +## 0.1.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-playlist-common@0.1.10 + +## 0.1.16 + +### Patch Changes + +- 79847cb73ed7: Updated latest playlist screen in readme document +- ec4b0f8cd957: change color of delete icon to secondary in playlist table +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 2f3215bbbffe: Fix a bug that led to errors being thrown in guest mode +- 8cec7664e146: Removed `@types/node` dependency +- b5ba33a92750: Limit the use of the same playlist name when adding a playlist +- 3d63e60f3c36: Internal restructure to avoid circular imports +- fdbf215a8d8e: Fix the Ui style of the search bar +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-playlist-common@0.1.10 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + ## 0.1.16-next.3 ### Patch Changes diff --git a/plugins/playlist/api-report.md b/plugins/playlist/api-report.md index cf0ebe8a37..be7605d1e6 100644 --- a/plugins/playlist/api-report.md +++ b/plugins/playlist/api-report.md @@ -101,7 +101,6 @@ export const playlistPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; ``` diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 9a97afcc5d..c472d8cb0c 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.16-next.3", + "version": "0.1.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 6aa151f5d2..96693d55d3 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-proxy-backend +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.4.0 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- 02ba0a2efd2a: Add the route name to an error message that appears when the backend + proxy wasn't well configured. This will help users to understand the + issue and fix the right configuration. +- 03691f0f3270: Add back the legacy proxy config, to get secret redaction +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.3 + ## 0.4.0-next.3 ### Minor Changes diff --git a/plugins/proxy-backend/config.d.ts b/plugins/proxy-backend/config.d.ts index 79e1cfcba6..dd65aa8e75 100644 --- a/plugins/proxy-backend/config.d.ts +++ b/plugins/proxy-backend/config.d.ts @@ -73,5 +73,54 @@ export interface Config { allowedHeaders?: string[]; }; }; + } & { + /** + * This was the legacy way of expressing proxies, and is now deprecated. We + * keep it around in the config schema, to ensure that legacy setups still + * have properly secret-marked values so that they get redacted. + * + * TODO(freben): Remove this in the future (suggestion: after 2024-03-01) + * when people likely have moved off of this format. + */ + [key: string]: + | string + | { + /** + * Target of the proxy. Url string to be parsed with the url module. + */ + target: string; + /** + * Object with extra headers to be added to target requests. + */ + headers?: { + /** @visibility secret */ + Authorization?: string; + /** @visibility secret */ + authorization?: string; + /** @visibility secret */ + 'X-Api-Key'?: string; + /** @visibility secret */ + 'x-api-key'?: string; + [key: string]: string | undefined; + }; + /** + * Changes the origin of the host header to the target URL. Default: true. + */ + changeOrigin?: boolean; + /** + * Rewrite target's url path. Object-keys will be used as RegExp to match paths. + * If pathRewrite is not specified, it is set to a single rewrite that removes the entire prefix and route. + */ + pathRewrite?: { [regexp: string]: string }; + /** + * Limit the forwarded HTTP methods, for example allowedMethods: ['GET'] to enforce read-only access. + */ + allowedMethods?: string[]; + /** + * Limit the forwarded HTTP methods. By default, only the headers that are considered safe for CORS + * and headers that are set by the proxy will be forwarded. + */ + allowedHeaders?: string[]; + }; }; } diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index b87f8a343a..5c2d9e82c5 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.4.0-next.3", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/puppetdb/CHANGELOG.md b/plugins/puppetdb/CHANGELOG.md index e34820799c..c1da915673 100644 --- a/plugins/puppetdb/CHANGELOG.md +++ b/plugins/puppetdb/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-puppetdb +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.7 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/puppetdb/api-report.md b/plugins/puppetdb/api-report.md index c7d1d0ff0e..890980591f 100644 --- a/plugins/puppetdb/api-report.md +++ b/plugins/puppetdb/api-report.md @@ -20,7 +20,7 @@ export const isPuppetDbAvailable: (entity: Entity) => boolean; export const PuppetDbPage: () => JSX_2.Element; // @public -const puppetdbPlugin: BackstagePlugin<{}, {}, {}>; +const puppetdbPlugin: BackstagePlugin<{}, {}>; export { puppetdbPlugin as plugin }; export { puppetdbPlugin }; diff --git a/plugins/puppetdb/package.json b/plugins/puppetdb/package.json index 260cfa73e5..cb8a9898fd 100644 --- a/plugins/puppetdb/package.json +++ b/plugins/puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-puppetdb", "description": "Backstage plugin to visualize resource information and Puppet facts from PuppetDB.", - "version": "0.1.7-next.3", + "version": "0.1.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index 0be471f56e..93b97226df 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-rollbar-backend +## 0.1.50-next.0 + +### Patch Changes + +- 407f4284be: ensure rollbar token is hidden +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + +## 0.1.48 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + ## 0.1.48-next.3 ### Patch Changes diff --git a/plugins/rollbar-backend/config.d.ts b/plugins/rollbar-backend/config.d.ts index 255d06d633..dd32c16483 100644 --- a/plugins/rollbar-backend/config.d.ts +++ b/plugins/rollbar-backend/config.d.ts @@ -20,6 +20,7 @@ export interface Config { /** * The authentication token for accessing the Rollbar API * @see https://explorer.docs.rollbar.com/#section/Authentication + * @visibility secret */ accountToken: string; }; diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 0fd2a33e39..596a1cf096 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.48-next.3", + "version": "0.1.50-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index 2da143b6e0..6bd10a118f 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-rollbar +## 0.4.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.4.24 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.4.24-next.3 ### Patch Changes diff --git a/plugins/rollbar/api-report.md b/plugins/rollbar/api-report.md index 45c672e7bb..c59475466f 100644 --- a/plugins/rollbar/api-report.md +++ b/plugins/rollbar/api-report.md @@ -196,7 +196,6 @@ const rollbarPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; export { rollbarPlugin as plugin }; diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index 644ef562a8..fb3171d2dc 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.24-next.3", + "version": "0.4.25-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 45a597eb45..a2d833056a 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.2.4-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 28961278d5..9160a70062 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", - "version": "0.2.4-next.3", + "version": "0.2.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index cf9d982eb4..ee0b07ee8b 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.2.27 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.2.27-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 2b1239ed74..9ef5c6f3ec 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.27-next.3", + "version": "0.2.29-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -45,7 +45,7 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/mock-fs": "^4.13.0", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0" }, "files": [ diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index 9afd01ea96..fbb987bb11 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.2.6-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 0c94bdf683..71ee372afc 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.2.6-next.3", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index fceecb4de3..bc5965d9be 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.22-next.0 + +### Patch Changes + +- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`. +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.4.20 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.4.20-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 8446140e06..586bc2e7dc 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.20-next.3", + "version": "0.4.22-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,9 +43,9 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/mock-fs": "^4.13.0", - "@types/node": "^16.11.26", + "@types/node": "^18.17.8", "jest-when": "^3.1.0", - "mock-fs": "^5.1.0" + "mock-fs": "^5.2.0" }, "files": [ "dist" diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index ed76583c57..f13f300877 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.1.11-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 3e78bd2009..74e0d7b397 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.1.11-next.3", + "version": "0.1.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index efd43887a8..14d2ef1c08 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + +## 0.2.24 + +### Patch Changes + +- 4fa1c74cbadc: Enables dry-run functionality for the run:yeoman scaffolder action +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 0.2.24-next.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index ab980d9fca..e4e6b2941c 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.24-next.3", + "version": "0.2.26-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 34b62fe21d..a512a87555 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,84 @@ # @backstage/plugin-scaffolder-backend +## 1.17.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-scaffolder-node@0.2.5-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-scaffolder-common@1.4.1 + +## 1.17.0 + +### Minor Changes + +- b5f239b50bcf: Improved the `parseEntityRef` Scaffolder filter by introducing the ability for users to provide default kind and/or namespace values. The filter now takes + 2 arguments, similarly to the original [parseEntityRef](https://github.com/backstage/backstage/blob/v1.17.2/packages/catalog-model/src/entity/ref.ts#L77). +- d5313ede3529: **DEPRECATION**: Deprecated `ScaffolderEntitiesProcessor`, which should now instead be imported from `@backstage/plugin-catalog-backend-module-scaffolder-entity-model`. + + `catalogModuleTemplateKind` was also moved to that package and renamed to `catalogModuleScaffolderEntityModel`, without any deprecation since it was an alpha export. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- a4989552d828: Add examples for `publish:github` and `publish:gitlab` scaffolder actions. +- ded27b83ead2: Add examples for `publish:bitbucket` scaffolder actions. +- 5f1a92b9f19f: Use `DefaultAzureDevOpsCredentialsProvider` to retrieve credentials for Azure DevOps. +- fb57a4694fc6: Fixed the plugin and module ID of the alpha `catalogModuleTemplateKind` export. +- f3c0b95e3ef1: Add examples for `github:actions:dispatch` scaffolder actions. +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-scaffolder-node@0.2.3 + ## 1.17.0-next.3 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index c5dad8c4b3..550ad90b47 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.17.0-next.3", + "version": "1.17.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -113,7 +113,7 @@ "@types/zen-observable": "^0.8.0", "esbuild": "^0.19.0", "jest-when": "^3.1.0", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "msw": "^1.0.0", "supertest": "^6.1.3", "wait-for-expect": "^3.0.2", diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.examples.test.ts index c4c27cc68e..5139469959 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.examples.test.ts @@ -85,8 +85,8 @@ describe('fs:rename examples', () => { const sourceFilePath = resolvePath(workspacePath, sourceFile); const destFilePath = resolvePath(workspacePath, destFile); - const sourceBeforeContent = fs.readFileSync(sourceFilePath, 'utf-8'); - const destBeforeContent = fs.readFileSync(destFilePath, 'utf-8'); + const sourceBeforeContent = await fs.readFile(sourceFilePath, 'utf-8'); + const destBeforeContent = await fs.readFile(destFilePath, 'utf-8'); expect(sourceBeforeContent).not.toEqual(destBeforeContent); @@ -97,7 +97,7 @@ describe('fs:rename examples', () => { }, }); - const destAfterContent = fs.readFileSync(destFilePath, 'utf-8'); + const destAfterContent = await fs.readFile(destFilePath, 'utf-8'); expect(sourceBeforeContent).toEqual(destAfterContent); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.test.ts index b12e4269c2..6804c9f5a9 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.test.ts @@ -148,7 +148,7 @@ describe('fs:rename', () => { it('should throw is trying to override by mistake', async () => { const destFile = 'unit-test-c.js'; const filePath = resolvePath(workspacePath, destFile); - const beforeContent = fs.readFileSync(filePath, 'utf-8'); + const beforeContent = await fs.readFile(filePath, 'utf-8'); await expect( action.handler({ @@ -164,7 +164,7 @@ describe('fs:rename', () => { }), ).rejects.toThrow(/dest already exists/); - const afterContent = fs.readFileSync(filePath, 'utf-8'); + const afterContent = await fs.readFile(filePath, 'utf-8'); expect(beforeContent).toEqual(afterContent); }); @@ -191,8 +191,8 @@ describe('fs:rename', () => { const sourceFilePath = resolvePath(workspacePath, sourceFile); const destFilePath = resolvePath(workspacePath, destFile); - const sourceBeforeContent = fs.readFileSync(sourceFilePath, 'utf-8'); - const destBeforeContent = fs.readFileSync(destFilePath, 'utf-8'); + const sourceBeforeContent = await fs.readFile(sourceFilePath, 'utf-8'); + const destBeforeContent = await fs.readFile(destFilePath, 'utf-8'); expect(sourceBeforeContent).not.toEqual(destBeforeContent); @@ -209,7 +209,7 @@ describe('fs:rename', () => { }, }); - const destAfterContent = fs.readFileSync(destFilePath, 'utf-8'); + const destAfterContent = await fs.readFile(destFilePath, 'utf-8'); expect(sourceBeforeContent).toEqual(destAfterContent); }); diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 0472c868a2..bf11adfc0e 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-common +## 1.4.1 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + ## 1.4.1-next.2 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index cb59a63732..f1a2a45fe0 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-common", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", - "version": "1.4.1-next.2", + "version": "1.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index aa3d9e20f1..e4f43dd69e 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-scaffolder-node +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-scaffolder-common@1.4.1 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + ## 0.2.3-next.3 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 5874309f59..b6d2bde6e9 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.2.3-next.3", + "version": "0.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 573bc7458f..dcb87e1497 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-scaffolder-react +## 1.5.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + - @backstage/plugin-scaffolder-common@1.4.1 + +## 1.5.5 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 27fef07f9229: Updated dependency `use-immer` to `^0.9.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.5.5-next.3 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index c4a2e3c674..eb8d886b9a 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.5.5-next.3", + "version": "1.5.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 22aec393d8..4cb5125f4f 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,59 @@ # @backstage/plugin-scaffolder +## 1.15.1-next.0 + +### Patch Changes + +- b337d78c3b: fixed issue related template editor fails with multiple templates per file. +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-scaffolder-react@1.5.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-scaffolder-common@1.4.1 + +## 1.15.0 + +### Minor Changes + +- 0119c326394a: adding a .zip download to dry run results page, including zip.js as dependency + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6e69c11a3535: Restored functionality to `OwnedEntityPicker` by converting deprecated `ui:options` input to `catalogFilter`. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder-common@1.4.1 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 1.15.0-next.3 ### Minor Changes diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index a776628da5..ddda40d95f 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -561,8 +561,7 @@ export const scaffolderPlugin: BackstagePlugin< }, true >; - }, - {} + } >; // @public @deprecated (undocumented) diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 71e536d431..086ef3cea1 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.15.0-next.3", + "version": "1.15.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx index 315028219b..2a726110b8 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx @@ -123,7 +123,10 @@ export function TemplateEditorForm(props: TemplateEditorFormProps) { setSteps(undefined); return; } - const parsed: JsonValue = yaml.parse(content); + const parsed: JsonValue = yaml + .parseAllDocuments(content) + .filter(c => c) + .map(c => c.toJSON())[0]; if (!isJsonObject(parsed)) { setSteps(undefined); diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index 003809128f..46f3b4c9de 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-search-backend-module-catalog +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 0.1.7 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index bb1955dcdd..11f64cf817 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-catalog", "description": "A module for the search backend that exports catalog modules", - "version": "0.1.7-next.3", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 9a78d60628..f56b1f28da 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,46 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.3.8-next.0 + +### Patch Changes + +- 3963d0b885: Ensure that all relevant config fields are properly marked as secret +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 1.3.6 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/integration-aws-node@0.1.6 + - @backstage/plugin-search-backend-node@1.2.7 + ## 1.3.6-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/config.d.ts b/plugins/search-backend-module-elasticsearch/config.d.ts index d7fdd0cd1b..95f1588fb4 100644 --- a/plugins/search-backend-module-elasticsearch/config.d.ts +++ b/plugins/search-backend-module-elasticsearch/config.d.ts @@ -192,6 +192,9 @@ export interface Config { password: string; } | { + /** + * @visibility secret + */ apiKey: string; }; } diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 88fa047d48..2750e1d2dc 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.3.6-next.3", + "version": "1.3.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index 07ff1c49ac..5260222ed3 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/plugin-search-backend-module-explore +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 0.1.7 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index cbad376fa3..a4a1dcf881 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-explore", "description": "A module for the search backend that exports explore modules", - "version": "0.1.7-next.3", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index bb40f260f6..b49fb7aad9 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 0.5.12 + +### Patch Changes + +- 4ccf9204bc95: Added `indexerBatchSize` option to be able to control the size of the batches being indexed. Also added a debug log entry to list out all the entities in the batch +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.5.12-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index b03c4aaa59..10536678d5 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.12-next.3", + "version": "0.5.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index bc05c65a8f..666fe0a7c3 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-techdocs-node@1.8.2-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 0.1.7 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-techdocs-node@1.8.0 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-search-backend-node@1.2.7 + ## 0.1.7-next.3 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 27b3e7cc0c..075403d512 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", "description": "A module for the search backend that exports techdocs modules", - "version": "0.1.7-next.3", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 6ac94a70f8..bfdf91c150 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-search-backend-node +## 1.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + +## 1.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + ## 1.2.7-next.3 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 86a8ca8f7c..3e87e29ce9 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.2.7-next.3", + "version": "1.2.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 7ecb0c0e0f..af05809517 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-search-backend +## 1.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 1.4.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-search-backend-node@1.2.7 + ## 1.4.3-next.3 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index cb0248798a..c71356dda3 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.4.3-next.3", + "version": "1.4.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index bbb5a5c1c4..0e7f901614 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-search-common +## 1.2.6 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.8 + - @backstage/types@1.1.1 + ## 1.2.6-next.2 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index 28948ce8a0..b59df94990 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-common", "description": "Common functionalities for Search, to be shared between various search-enabled plugins", - "version": "1.2.6-next.2", + "version": "1.2.6", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 4e9c8329c0..7904129b3e 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-search-react +## 1.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + - @backstage/plugin-search-common@1.2.6 + +## 1.7.0 + +### Minor Changes + +- b78f570f44d3: The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: + + ```yaml + search: + query: + pageLimit: 50 + ``` + + Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 45f8a95e1068: Optionally initializes the search context with default settings for search queries only when the config is defined, rather than always overriding it. +- 3d63e60f3c36: Internal restructure to avoid circular imports +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.7.0-next.3 ### Patch Changes diff --git a/plugins/search-react/alpha-api-report.md b/plugins/search-react/alpha-api-report.md new file mode 100644 index 0000000000..d62a0f1f0e --- /dev/null +++ b/plugins/search-react/alpha-api-report.md @@ -0,0 +1,65 @@ +## API Report File for "@backstage/plugin-search-react" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// <reference types="react" /> + +import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { Extension } from '@backstage/frontend-plugin-api'; +import { ListItemProps } from '@material-ui/core'; +import { PortableSchema } from '@backstage/frontend-plugin-api'; +import { SearchDocument } from '@backstage/plugin-search-common'; +import { SearchResult } from '@backstage/plugin-search-common'; + +// @alpha (undocumented) +export type BaseSearchResultListItemProps<T = {}> = T & { + rank?: number; + result?: SearchDocument; +} & Omit<ListItemProps, 'button'>; + +// @alpha (undocumented) +export function createSearchResultListItemExtension< + TConfig extends { + noTrack?: boolean; + }, +>(options: SearchResultItemExtensionOptions<TConfig>): Extension<TConfig>; + +// @alpha (undocumented) +export type SearchResultItemExtensionComponent = < + P extends BaseSearchResultListItemProps, +>( + props: P, +) => JSX.Element | null; + +// @alpha (undocumented) +export const searchResultItemExtensionData: ConfigurableExtensionDataRef< + { + predicate?: SearchResultItemExtensionPredicate | undefined; + component: SearchResultItemExtensionComponent; + }, + {} +>; + +// @alpha (undocumented) +export type SearchResultItemExtensionOptions< + TConfig extends { + noTrack?: boolean; + }, +> = { + id: string; + at?: string; + configSchema?: PortableSchema<TConfig>; + component: (options: { + config: TConfig; + }) => Promise<SearchResultItemExtensionComponent>; + predicate?: SearchResultItemExtensionPredicate; +}; + +// @alpha (undocumented) +export type SearchResultItemExtensionPredicate = ( + result: SearchResult, +) => boolean; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index f47306839a..da4092fcbd 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,13 +1,26 @@ { "name": "@backstage/plugin-search-react", - "version": "1.7.0-next.3", + "version": "1.7.1-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" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.tsx", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.tsx" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "web-library" @@ -34,6 +47,8 @@ "dependencies": { "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", + "@backstage/frontend-app-api": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/theme": "workspace:^", "@backstage/types": "workspace:^", diff --git a/plugins/search-react/src/alpha.test.tsx b/plugins/search-react/src/alpha.test.tsx new file mode 100644 index 0000000000..b61a400832 --- /dev/null +++ b/plugins/search-react/src/alpha.test.tsx @@ -0,0 +1,206 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; + +import { render, screen } from '@testing-library/react'; + +import { + createExtensionInput, + createPageExtension, + createPlugin, + createSchemaFromZod, +} from '@backstage/frontend-plugin-api'; +import { SearchResult } from '@backstage/plugin-search-common'; +import { createApp } from '@backstage/frontend-app-api'; +import { MockConfigApi } from '@backstage/test-utils'; + +import { + BaseSearchResultListItemProps, + createSearchResultListItemExtension, + searchResultItemExtensionData as searchResultListItemExtensionData, +} from './alpha'; + +// TODO: Remove this mock when we have a permanent solution for nav items extensions +// The `GraphiQLIcon` used in "packages/frontend-app-api/src/extensions/CoreNav.tsx" file +// is throwing a "ReferenceError: ref is not defined" error during test +jest.mock('@backstage/plugin-graphiql', () => ({ + ...jest.requireActual('@backstage/plugin-graphiql'), + GraphiQLIcon: () => null, +})); + +describe('createSearchResultListItemExtension', () => { + it('Should use the correct result component', async () => { + type TechDocsSearchReasulListItemProps = BaseSearchResultListItemProps<{ + lineClamp: number; + }>; + const TechDocsSearchResultItemComponent = ( + props: TechDocsSearchReasulListItemProps, + ) => ( + <div> + TechDocs - Rank: {props.rank} - Line clamp: {props.lineClamp} + </div> + ); + + const TechDocsSearchResultItemExtension = + createSearchResultListItemExtension({ + id: 'techdocs', + at: 'plugin.search.page/items', + configSchema: createSchemaFromZod(z => + z.object({ + noTrack: z.boolean().default(true), + lineClamp: z.number().default(5), + }), + ), + predicate: result => result.type === 'techdocs', + component: + async ({ config }) => + props => + <TechDocsSearchResultItemComponent {...props} {...config} />, + }); + + const ExploreSearchResultItemComponent = ( + props: BaseSearchResultListItemProps, + ) => <div>Explore - Rank: {props.rank}</div>; + + const ExploreSearchResultItemExtension = + createSearchResultListItemExtension({ + id: 'explore', + at: 'plugin.search.page/items', + predicate: result => result.type === 'explore', + component: async () => ExploreSearchResultItemComponent, + }); + + const SearchPageExtension = createPageExtension({ + id: 'plugin.search.page', + defaultPath: '/', + inputs: { + items: createExtensionInput({ + item: searchResultListItemExtensionData, + }), + }, + loader: async ({ inputs }) => { + const results = [ + { + type: 'techdocs', + rank: 1, + document: { + title: 'Title1', + text: 'Text1', + location: '/location1', + }, + }, + { + type: 'explore', + rank: 2, + document: { + title: 'Title2', + text: 'Text2', + location: '/location2', + }, + }, + { + type: 'other', + rank: 3, + document: { + title: 'Title3', + text: 'Text3', + location: '/location3', + }, + }, + ]; + + const DefaultResultItem = (props: BaseSearchResultListItemProps) => ( + <div>Default - Rank: {props.rank}</div> + ); + + const getResultItemComponent = (result: SearchResult) => { + const value = inputs.items.find(({ item }) => + item?.predicate?.(result), + ); + return value?.item.component ?? DefaultResultItem; + }; + + const Component = () => { + return ( + <div> + <h1>Search Page</h1> + <ul> + {results.map((result, index) => { + const SearchResultListItem = getResultItemComponent(result); + return ( + <SearchResultListItem + key={index} + rank={result.rank} + result={result.document} + /> + ); + })} + </ul> + </div> + ); + }; + + return <Component />; + }, + }); + + const SearchPlugin = createPlugin({ + id: 'search.plugin', + extensions: [ + SearchPageExtension, + ExploreSearchResultItemExtension, + TechDocsSearchResultItemExtension, + ], + }); + + const app = createApp({ + plugins: [SearchPlugin], + configLoader: async () => + new MockConfigApi({ + app: { + extensions: [ + { + 'plugin.search.result.item.techdocs': { + config: { + lineClamp: 3, + }, + }, + }, + ], + }, + }), + }); + + render(app.createRoot()); + + expect(await screen.findByText(/Search Page/)).toBeInTheDocument(); + + expect( + await screen.findByText(/TechDocs - Rank: 1 - Line clamp: 3/, { + exact: false, + }), + ).toBeInTheDocument(); + + expect( + await screen.findByText(/Explore - Rank: 2/, { exact: false }), + ).toBeInTheDocument(); + + expect( + await screen.findByText(/Default - Rank: 3/, { exact: false }), + ).toBeInTheDocument(); + }); +}); diff --git a/plugins/search-react/src/alpha.tsx b/plugins/search-react/src/alpha.tsx new file mode 100644 index 0000000000..5b44a7bbb5 --- /dev/null +++ b/plugins/search-react/src/alpha.tsx @@ -0,0 +1,132 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { lazy, Suspense } from 'react'; + +import { ListItemProps } from '@material-ui/core'; + +import { + ExtensionBoundary, + PortableSchema, + createExtension, + createExtensionDataRef, + createSchemaFromZod, +} from '@backstage/frontend-plugin-api'; +import { Progress } from '@backstage/core-components'; +import { SearchDocument, SearchResult } from '@backstage/plugin-search-common'; + +import { SearchResultListItemExtension } from './extensions'; + +/** @alpha */ +export type BaseSearchResultListItemProps<T = {}> = T & { + rank?: number; + result?: SearchDocument; +} & Omit<ListItemProps, 'button'>; + +/** @alpha */ +export type SearchResultItemExtensionComponent = < + P extends BaseSearchResultListItemProps, +>( + props: P, +) => JSX.Element | null; + +/** @alpha */ +export type SearchResultItemExtensionPredicate = ( + result: SearchResult, +) => boolean; + +/** @alpha */ +export const searchResultItemExtensionData = createExtensionDataRef<{ + predicate?: SearchResultItemExtensionPredicate; + component: SearchResultItemExtensionComponent; +}>('plugin.search.result.item.data'); + +/** @alpha */ +export type SearchResultItemExtensionOptions< + TConfig extends { noTrack?: boolean }, +> = { + /** + * The extension id. + */ + id: string; + /** + * The extension attachment point (e.g., search modal or page). + */ + at?: string; + /** + * Optional extension config schema. + */ + configSchema?: PortableSchema<TConfig>; + /** + * The extension component. + */ + component: (options: { + config: TConfig; + }) => Promise<SearchResultItemExtensionComponent>; + /** + * When an extension defines a predicate, it returns true if the result should be rendered by that extension. + * Defaults to a predicate that returns true, which means it renders all sorts of results. + */ + predicate?: SearchResultItemExtensionPredicate; +}; + +/** @alpha */ +export function createSearchResultListItemExtension< + TConfig extends { noTrack?: boolean }, +>(options: SearchResultItemExtensionOptions<TConfig>) { + const configSchema = + 'configSchema' in options + ? options.configSchema + : (createSchemaFromZod(z => + z.object({ + noTrack: z.boolean().default(false), + }), + ) as PortableSchema<TConfig>); + return createExtension({ + id: `plugin.search.result.item.${options.id}`, + at: options.at ?? 'plugin.search.page/items', + configSchema, + output: { + item: searchResultItemExtensionData, + }, + factory({ bind, config, source }) { + const LazyComponent = lazy(() => + options + .component({ config }) + .then(component => ({ default: component })), + ) as unknown as SearchResultItemExtensionComponent; + + bind({ + item: { + predicate: options.predicate, + component: props => ( + <ExtensionBoundary source={source}> + <Suspense fallback={<Progress />}> + <SearchResultListItemExtension + rank={props.rank} + result={props.result} + noTrack={config.noTrack} + > + <LazyComponent {...props} /> + </SearchResultListItemExtension> + </Suspense> + </ExtensionBoundary> + ), + }, + }); + }, + }); +} diff --git a/plugins/search-react/src/extensions.tsx b/plugins/search-react/src/extensions.tsx index a29311b1ff..132fad25b5 100644 --- a/plugins/search-react/src/extensions.tsx +++ b/plugins/search-react/src/extensions.tsx @@ -90,7 +90,7 @@ export type SearchResultListItemExtensionProps<Props extends {} = {}> = Props & * Extends children with extension capabilities. * @param props - see {@link SearchResultListItemExtensionProps}. */ -const SearchResultListItemExtension = ( +export const SearchResultListItemExtension = ( props: SearchResultListItemExtensionProps, ) => { const { diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 167e23ae02..0a5b57b7a2 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-search +## 1.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + - @backstage/plugin-search-common@1.2.6 + +## 1.4.0 + +### Minor Changes + +- b78f570f44d3: The SearchPage component can now be configured via app-config.yaml with default query parameters to define how it behaves when it is first loaded or reset. Check out the following example: + + ```yaml + search: + query: + pageLimit: 50 + ``` + + Acceptable values for `pageLimit` are `10`, `25`, `50` or `100`. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + ## 1.4.0-next.3 ### Patch Changes diff --git a/plugins/search/alpha-api-report.md b/plugins/search/alpha-api-report.md new file mode 100644 index 0000000000..5799ff5cd6 --- /dev/null +++ b/plugins/search/alpha-api-report.md @@ -0,0 +1,28 @@ +## API Report File for "@backstage/plugin-search" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { Extension } from '@backstage/frontend-plugin-api'; + +// @alpha (undocumented) +const _default: BackstagePlugin; +export default _default; + +// @alpha (undocumented) +export const SearchApi: Extension<{}>; + +// @alpha (undocumented) +export const SearchNavItem: Extension<{ + title: string; +}>; + +// @alpha (undocumented) +export const SearchPage: Extension<{ + path: string; + noTrack: boolean; +}>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/search/api-report.md b/plugins/search/api-report.md index 616b63bd31..64f596ab11 100644 --- a/plugins/search/api-report.md +++ b/plugins/search/api-report.md @@ -71,7 +71,6 @@ const searchPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; export { searchPlugin as plugin }; diff --git a/plugins/search/package.json b/plugins/search/package.json index 5da89dd9fe..8b90867a5a 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,14 +1,27 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.4.0-next.3", + "version": "1.4.1-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" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.tsx", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.tsx" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "frontend-plugin" @@ -38,6 +51,7 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/plugin-search-react": "workspace:^", diff --git a/plugins/search/src/alpha.tsx b/plugins/search/src/alpha.tsx new file mode 100644 index 0000000000..6d74c85d49 --- /dev/null +++ b/plugins/search/src/alpha.tsx @@ -0,0 +1,247 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; + +import { makeStyles, Theme, Grid, Paper } from '@material-ui/core'; +import SearchIcon from '@material-ui/icons/Search'; + +import { + CatalogIcon, + Content, + DocsIcon, + Header, + Page, + useSidebarPinState, +} from '@backstage/core-components'; +import { + createRouteRef, + useApi, + DiscoveryApi, + IdentityApi, + discoveryApiRef, + identityApiRef, +} from '@backstage/core-plugin-api'; + +import { + createPlugin, + createApiExtension, + createPageExtension, + createExtensionInput, + createNavItemExtension, + createSchemaFromZod, +} from '@backstage/frontend-plugin-api'; + +import { + catalogApiRef, + CATALOG_FILTER_EXISTS, +} from '@backstage/plugin-catalog-react'; + +import { + DefaultResultListItem, + SearchBar, + SearchFilter, + SearchPagination, + SearchResult as SearchResults, + SearchResultPager, + useSearch, + SearchContextProvider, +} from '@backstage/plugin-search-react'; +import { SearchResult } from '@backstage/plugin-search-common'; +import { searchApiRef } from '@backstage/plugin-search-react'; +import { searchResultItemExtensionData } from '@backstage/plugin-search-react/alpha'; + +import { SearchClient } from './apis'; +import { SearchType } from './components/SearchType'; +import { UrlUpdater } from './components/SearchPage/SearchPage'; + +/** @alpha */ +export const SearchApi = createApiExtension({ + factory: { + api: searchApiRef, + deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, + factory: ({ + identityApi, + discoveryApi, + }: { + identityApi: IdentityApi; + discoveryApi: DiscoveryApi; + }) => new SearchClient({ discoveryApi, identityApi }), + }, +}); + +const useSearchPageStyles = makeStyles((theme: Theme) => ({ + filter: { + '& + &': { + marginTop: theme.spacing(2.5), + }, + }, + filters: { + padding: theme.spacing(2), + marginTop: theme.spacing(2), + }, +})); + +const searchRouteRef = createRouteRef({ id: 'plugin.search.page' }); + +/** @alpha */ +export const SearchPage = createPageExtension({ + id: 'plugin.search.page', + routeRef: searchRouteRef, + configSchema: createSchemaFromZod(z => + z.object({ + path: z.string().default('/search'), + noTrack: z.boolean().default(false), + }), + ), + inputs: { + items: createExtensionInput({ + item: searchResultItemExtensionData, + }), + }, + loader: async ({ config, inputs }) => { + const getResultItemComponent = (result: SearchResult) => { + const value = inputs.items.find(({ item }) => item?.predicate?.(result)); + return value?.item.component ?? DefaultResultListItem; + }; + + const Component = () => { + const classes = useSearchPageStyles(); + const { isMobile } = useSidebarPinState(); + const { types } = useSearch(); + const catalogApi = useApi(catalogApiRef); + + return ( + <Page themeId="home"> + {!isMobile && <Header title="Search" />} + <Content> + <Grid container direction="row"> + <Grid item xs={12}> + <SearchBar debounceTime={100} /> + </Grid> + {!isMobile && ( + <Grid item xs={3}> + <SearchType.Accordion + name="Result Type" + defaultValue="software-catalog" + showCounts + types={[ + { + value: 'software-catalog', + name: 'Software Catalog', + icon: <CatalogIcon />, + }, + { + value: 'techdocs', + name: 'Documentation', + icon: <DocsIcon />, + }, + { + value: 'adr', + name: 'Architecture Decision Records', + icon: <DocsIcon />, + }, + ]} + /> + <Paper className={classes.filters}> + {types.includes('techdocs') && ( + <SearchFilter.Select + className={classes.filter} + label="Entity" + name="name" + values={async () => { + // Return a list of entities which are documented. + const { items } = await catalogApi.getEntities({ + fields: ['metadata.name'], + filter: { + 'metadata.annotations.backstage.io/techdocs-ref': + CATALOG_FILTER_EXISTS, + }, + }); + + const names = items.map( + entity => entity.metadata.name, + ); + names.sort(); + return names; + }} + /> + )} + <SearchFilter.Select + className={classes.filter} + label="Kind" + name="kind" + values={['Component', 'Template']} + /> + <SearchFilter.Checkbox + className={classes.filter} + label="Lifecycle" + name="lifecycle" + values={['experimental', 'production']} + /> + </Paper> + </Grid> + )} + <Grid item xs> + <SearchPagination /> + <SearchResults> + {({ results }) => + results.map((result, index) => { + const { noTrack } = config; + const { document, ...rest } = result; + const SearchResultListItem = + getResultItemComponent(result); + return ( + <SearchResultListItem + {...rest} + key={index} + result={document} + noTrack={noTrack} + /> + ); + }) + } + </SearchResults> + <SearchResultPager /> + </Grid> + </Grid> + </Content> + </Page> + ); + }; + + return ( + <SearchContextProvider> + <UrlUpdater /> + <Component /> + </SearchContextProvider> + ); + }, +}); + +/** @alpha */ +export const SearchNavItem = createNavItemExtension({ + id: 'plugin.search.nav.index', + routeRef: searchRouteRef, + title: 'Search', + icon: SearchIcon, +}); + +/** @alpha */ +export default createPlugin({ + id: 'plugin.search', + extensions: [SearchApi, SearchPage, SearchNavItem], +}); diff --git a/plugins/search/src/components/SearchPage/UrlUpdater.tsx b/plugins/search/src/components/SearchPage/UrlUpdater.tsx new file mode 100644 index 0000000000..d44195b6e2 --- /dev/null +++ b/plugins/search/src/components/SearchPage/UrlUpdater.tsx @@ -0,0 +1,85 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useEffect } from 'react'; +import usePrevious from 'react-use/lib/usePrevious'; +import qs from 'qs'; +import { useLocation } from 'react-router-dom'; +import { useSearch } from '@backstage/plugin-search-react'; +import { JsonObject } from '@backstage/types'; + +export const UrlUpdater = () => { + const location = useLocation(); + const { + term, + setTerm, + types, + setTypes, + pageCursor, + setPageCursor, + filters, + setFilters, + } = useSearch(); + + const prevQueryParams = usePrevious(location.search); + + useEffect(() => { + // Only respond to changes to url query params + if (location.search === prevQueryParams) { + return; + } + + const query = + qs.parse(location.search.substring(1), { arrayLimit: 0 }) || {}; + + if (query.filters) { + setFilters(query.filters as JsonObject); + } + + if (query.query) { + setTerm(query.query as string); + } + + if (query.pageCursor) { + setPageCursor(query.pageCursor as string); + } + + if (query.types) { + setTypes(query.types as string[]); + } + }, [prevQueryParams, location, setTerm, setTypes, setPageCursor, setFilters]); + + useEffect(() => { + const newParams = qs.stringify( + { + query: term, + types, + pageCursor, + filters, + }, + { arrayFormat: 'brackets' }, + ); + const newUrl = `${window.location.pathname}?${newParams}`; + + // We directly manipulate window history here in order to not re-render + // infinitely (state => location => state => etc). The intention of this + // code is just to ensure the right query/filters are loaded when a user + // clicks the "back" button after clicking a result. + window.history.replaceState(null, document.title, newUrl); + }, [term, types, pageCursor, filters]); + + return null; +}; diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index 0456807346..5f28cbf0fd 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-sentry +## 0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.5.9 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.5.9-next.3 ### Patch Changes diff --git a/plugins/sentry/api-report.md b/plugins/sentry/api-report.md index 43a5caa0bd..dc5fb69556 100644 --- a/plugins/sentry/api-report.md +++ b/plugins/sentry/api-report.md @@ -138,7 +138,6 @@ const sentryPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; export { sentryPlugin as plugin }; diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index ce0c6d03b9..242e26ff51 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.5.9-next.3", + "version": "0.5.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index 335b4ded55..1e168daa77 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-shortcuts +## 0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## 0.3.14 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.3.14-next.3 ### Patch Changes diff --git a/plugins/shortcuts/api-report.md b/plugins/shortcuts/api-report.md index ae8225d5b5..64d9d15156 100644 --- a/plugins/shortcuts/api-report.md +++ b/plugins/shortcuts/api-report.md @@ -58,7 +58,7 @@ export const Shortcuts: (props: ShortcutsProps) => JSX_2.Element; export const shortcutsApiRef: ApiRef<ShortcutApi>; // @public (undocumented) -export const shortcutsPlugin: BackstagePlugin<{}, {}, {}>; +export const shortcutsPlugin: BackstagePlugin<{}, {}>; // @public export interface ShortcutsProps { diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 835316e26e..994dabbd1d 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.14-next.3", + "version": "0.3.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 7e36170ac3..a7b8b4e171 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-sonarqube-backend +## 0.2.7-next.0 + +### Patch Changes + +- a5d592d0ad: Added support for the [new backend system](https://backstage.io/docs/backend-system/) +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + ## 0.2.5-next.3 ### Patch Changes diff --git a/plugins/sonarqube-backend/README.md b/plugins/sonarqube-backend/README.md index b417fea7c4..1a1e2ae2dd 100644 --- a/plugins/sonarqube-backend/README.md +++ b/plugins/sonarqube-backend/README.md @@ -2,6 +2,20 @@ Welcome to the sonarqube-backend backend plugin! +## New Backend System + +The Sonarqube backend plugin has support for the [new backend system](https://backstage.io/docs/backend-system/), here's how you can set that up: + +In your `packages/backend/src/index.ts` make the following changes: + +```diff + import { createBackend } from '@backstage/backend-defaults'; + const backend = createBackend(); + // ... other feature additions ++ backend.add(import('@backstage/plugin-sonarqube-backend'); + backend.start(); +``` + ## Integrating into a backstage instance This plugin needs to be added to an existing backstage instance. diff --git a/plugins/sonarqube-backend/api-report.md b/plugins/sonarqube-backend/api-report.md index 535db37185..c3c684f9d4 100644 --- a/plugins/sonarqube-backend/api-report.md +++ b/plugins/sonarqube-backend/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; import { Config } from '@backstage/config'; import express from 'express'; import { Logger } from 'winston'; @@ -72,5 +73,9 @@ export interface SonarqubeMeasure { value: string; } +// @public +const sonarqubePlugin: () => BackendFeature; +export default sonarqubePlugin; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index ec5a2ed887..89c96bfcf4 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.2.5-next.3", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,6 +29,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@types/express": "*", diff --git a/plugins/sonarqube-backend/src/index.ts b/plugins/sonarqube-backend/src/index.ts index c91aef09f8..4bb82df34e 100644 --- a/plugins/sonarqube-backend/src/index.ts +++ b/plugins/sonarqube-backend/src/index.ts @@ -16,3 +16,4 @@ export * from './service/router'; export * from './service/sonarqubeInfoProvider'; +export { sonarqubePlugin as default } from './plugin'; diff --git a/packages/app/cypress/support/commands.js b/plugins/sonarqube-backend/src/plugin.test.tsx similarity index 77% rename from packages/app/cypress/support/commands.js rename to plugins/sonarqube-backend/src/plugin.test.tsx index f26d2c999b..9b26a88862 100644 --- a/packages/app/cypress/support/commands.js +++ b/plugins/sonarqube-backend/src/plugin.test.tsx @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -Cypress.Commands.add('enterAsGuest', () => { - cy.visit('/'); - cy.get('button').contains('Enter').click(); +import { sonarqubePlugin } from './plugin'; + +describe('sonarqube', () => { + it('should export the sonarqube plugin', () => { + expect(sonarqubePlugin).toBeDefined(); + }); }); diff --git a/plugins/sonarqube-backend/src/plugin.ts b/plugins/sonarqube-backend/src/plugin.ts new file mode 100644 index 0000000000..fd4fb77fb4 --- /dev/null +++ b/plugins/sonarqube-backend/src/plugin.ts @@ -0,0 +1,57 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { + createBackendPlugin, + coreServices, +} from '@backstage/backend-plugin-api'; +import { DefaultSonarqubeInfoProvider } from './service/sonarqubeInfoProvider'; +import { createRouter } from './service/router'; + +/** + * Sonarqube backend plugin + * + * @public + */ +export const sonarqubePlugin = createBackendPlugin({ + pluginId: 'sonarqube', + register(env) { + env.registerInit({ + deps: { + logger: coreServices.logger, + config: coreServices.rootConfig, + httpRouter: coreServices.httpRouter, + }, + async init({ logger, config, httpRouter }) { + const winstonLogger = loggerToWinstonLogger(logger); + httpRouter.use( + await createRouter({ + /** + * Logger for logging purposes + */ + logger: winstonLogger, + /** + * Info provider to be able to get all necessary information for the APIs + */ + sonarqubeInfoProvider: + DefaultSonarqubeInfoProvider.fromConfig(config), + }), + ); + }, + }); + }, +}); diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index d7a31b9b0c..5fea1d2e9e 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-sonarqube-react +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.4.2 + +## 0.1.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + ## 0.1.8-next.3 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index aadb4b7c70..6e1adb42f9 100644 --- a/plugins/sonarqube-react/package.json +++ b/plugins/sonarqube-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-react", - "version": "0.1.8-next.3", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 3c46ea4bf4..0fa5143c1a 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-sonarqube +## 0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-sonarqube-react@0.1.9-next.0 + +## 0.7.5 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- db92d1244897: Updated dependency `rc-progress` to `3.5.1`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-sonarqube-react@0.1.8 + - @backstage/theme@0.4.2 + ## 0.7.5-next.3 ### Patch Changes diff --git a/plugins/sonarqube/api-report.md b/plugins/sonarqube/api-report.md index 72f2eb1c09..32894b6eeb 100644 --- a/plugins/sonarqube/api-report.md +++ b/plugins/sonarqube/api-report.md @@ -71,5 +71,5 @@ export type SonarQubeContentPageProps = { }; // @public (undocumented) -export const sonarQubePlugin: BackstagePlugin<{}, {}, {}>; +export const sonarQubePlugin: BackstagePlugin<{}, {}>; ``` diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 5ccd9cb66b..780b81468a 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.7.5-next.3", + "version": "0.7.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 61f6e1ca54..76bd4b9ddb 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-splunk-on-call +## 0.4.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.4.13 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.4.13-next.3 ### Patch Changes diff --git a/plugins/splunk-on-call/api-report.md b/plugins/splunk-on-call/api-report.md index 4c054e8a1a..d80ee6f874 100644 --- a/plugins/splunk-on-call/api-report.md +++ b/plugins/splunk-on-call/api-report.md @@ -240,7 +240,6 @@ const splunkOnCallPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; export { splunkOnCallPlugin as plugin }; diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 66966873e2..ab6155e96c 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.13-next.3", + "version": "0.4.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index 29e362e898..6eb8d27731 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-stack-overflow-backend +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-search-common@1.2.6 + ## 0.2.7-next.3 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index a1ae36953d..f090c8d25f 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.2.7-next.3", + "version": "0.2.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index 8cb485fe7a..12cf74570e 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-stack-overflow +## 0.1.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-home-react@0.1.4-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/theme@0.4.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.1.20 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/theme@0.4.2 + ## 0.1.20-next.3 ### Patch Changes diff --git a/plugins/stack-overflow/api-report.md b/plugins/stack-overflow/api-report.md index 4277aaac24..293c2ac226 100644 --- a/plugins/stack-overflow/api-report.md +++ b/plugins/stack-overflow/api-report.md @@ -32,7 +32,7 @@ export const stackOverflowApiRef: ApiRef<StackOverflowApi>; export const StackOverflowIcon: () => React_2.JSX.Element; // @public -export const stackOverflowPlugin: BackstagePlugin<{}, {}, {}>; +export const stackOverflowPlugin: BackstagePlugin<{}, {}>; // @public export type StackOverflowQuestion = { diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 31af9b9f19..7be47012e8 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.20-next.3", + "version": "0.1.21-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md index 3f868aedab..c8056438d7 100644 --- a/plugins/stackstorm/CHANGELOG.md +++ b/plugins/stackstorm/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-stackstorm +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.6 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + ## 0.1.6-next.3 ### Patch Changes diff --git a/plugins/stackstorm/api-report.md b/plugins/stackstorm/api-report.md index f6279be1bd..14f09c3202 100644 --- a/plugins/stackstorm/api-report.md +++ b/plugins/stackstorm/api-report.md @@ -25,7 +25,6 @@ export const stackstormPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; ``` diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json index 2b34f99b21..a65e8692e2 100644 --- a/plugins/stackstorm/package.json +++ b/plugins/stackstorm/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-stackstorm", "description": "A Backstage plugin that integrates towards StackStorm", - "version": "0.1.6-next.3", + "version": "0.1.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 1ee3a75337..a884f1dfc7 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/plugin-tech-insights-node@0.4.11-next.0 + +## 0.1.35 + +### Patch Changes + +- 51b801f743b2: Handle extracting facts from 'not' conditions too +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/plugin-tech-insights-node@0.4.9 + ## 0.1.35-next.3 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index a4c3fd5d15..8823de7697 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.35-next.3", + "version": "0.1.37-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index f1d5f12e59..fe3f4ce37c 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-tech-insights-backend +## 0.5.19-next.0 + +### Patch Changes + +- cc7dddfa7f: Increase the maximum allowed length of an entity filter for tech insights fact schemas. +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/plugin-tech-insights-node@0.4.11-next.0 + +## 0.5.17 + +### Patch Changes + +- cfc3ca6ce060: Changes needed to support MySQL +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-node@0.4.9 + ## 0.5.17-next.3 ### Patch Changes diff --git a/plugins/tech-insights-backend/migrations/20230925145017_increase_filter_fact_schemas_size.js b/plugins/tech-insights-backend/migrations/20230925145017_increase_filter_fact_schemas_size.js new file mode 100644 index 0000000000..848fb25777 --- /dev/null +++ b/plugins/tech-insights-backend/migrations/20230925145017_increase_filter_fact_schemas_size.js @@ -0,0 +1,37 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const factSchemasTable = 'fact_schemas'; + +/** + * @param { import("knex").Knex } knex + * @returns { Promise<void> } + */ +exports.up = async function up(knex) { + await knex.schema.alterTable(factSchemasTable, table => { + table.text('entityFilter').alter(); + }); +}; + +/** + * @param { import("knex").Knex } knex + * @returns { Promise<void> } + */ +exports.down = async function down() { + await knex.schema.alterTable(factSchemasTable, table => { + table.string('entityFilter').alter(); + }); +}; diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 379d87ca42..2b5a427eef 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.17-next.3", + "version": "0.5.19-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-common/CHANGELOG.md b/plugins/tech-insights-common/CHANGELOG.md index ad2e56bddd..15e8949b5c 100644 --- a/plugins/tech-insights-common/CHANGELOG.md +++ b/plugins/tech-insights-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-tech-insights-common +## 0.2.12 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/types@1.1.1 + ## 0.2.12-next.0 ### Patch Changes diff --git a/plugins/tech-insights-common/package.json b/plugins/tech-insights-common/package.json index 9448b111c3..cef4b5c627 100644 --- a/plugins/tech-insights-common/package.json +++ b/plugins/tech-insights-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-common", - "version": "0.2.12-next.0", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index af4274cd76..2a29e65bf2 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-tech-insights-node +## 0.4.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## 0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/types@1.1.1 + ## 0.4.9-next.3 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index b012c51298..80befca1d1 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.4.9-next.3", + "version": "0.4.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index 065efabf54..83bd2f6d1c 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-tech-insights +## 0.3.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## 0.3.16 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-tech-insights-common@0.2.12 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + ## 0.3.16-next.3 ### Patch Changes diff --git a/plugins/tech-insights/api-report.md b/plugins/tech-insights/api-report.md index 14fe512ba0..92f66c14b3 100644 --- a/plugins/tech-insights/api-report.md +++ b/plugins/tech-insights/api-report.md @@ -125,7 +125,6 @@ export const techInsightsPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index c75f52e06c..a0f74ff425 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.16-next.3", + "version": "0.3.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index f37b791962..48369b1e49 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-tech-radar +## 0.6.9-next.0 + +### Patch Changes + +- c09d2fa1d6: Added experimental support for the declarative integration. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/frontend-plugin-api@0.1.1-next.0 + - @backstage/theme@0.4.2 + +## 0.6.8 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- b45d0ac68191: Add names to blip entry links in the radar to improve accessibility +- 80b4d0b34f14: Fixed the width of the tech radar dialog so that the content fits +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 6d35e9ea2afa: Add description property for Rings which will be shown in the footer. +- 8cec7664e146: Removed `@types/node` dependency +- c357f62052af: Fixed `RadarTimeline` text formatting. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + ## 0.6.8-next.3 ### Patch Changes diff --git a/plugins/tech-radar/alpha-api-report.md b/plugins/tech-radar/alpha-api-report.md new file mode 100644 index 0000000000..c54f692982 --- /dev/null +++ b/plugins/tech-radar/alpha-api-report.md @@ -0,0 +1,24 @@ +## API Report File for "@backstage/plugin-tech-radar" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { Extension } from '@backstage/frontend-plugin-api'; + +// @alpha (undocumented) +const _default: BackstagePlugin; +export default _default; + +// @alpha (undocumented) +export const TechRadarPage: Extension<{ + height: number; + width: number; + title: string; + path: string; + subtitle: string; + pageTitle: string; +}>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/tech-radar/api-report.md b/plugins/tech-radar/api-report.md index f55f0ee39e..178fc202cd 100644 --- a/plugins/tech-radar/api-report.md +++ b/plugins/tech-radar/api-report.md @@ -106,7 +106,6 @@ const techRadarPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; export { techRadarPlugin as plugin }; diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 1b048f49cd..7505fa0813 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,14 +1,12 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.6.8-next.3", + "version": "0.6.9-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" + "access": "public" }, "backstage": { "role": "frontend-plugin" @@ -22,6 +20,21 @@ "keywords": [ "backstage" ], + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.tsx", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.tsx" + ], + "package.json": [ + "package.json" + ] + } + }, "sideEffects": false, "scripts": { "build": "backstage-cli package build", @@ -35,6 +48,7 @@ "dependencies": { "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", diff --git a/plugins/tech-radar/src/alpha.tsx b/plugins/tech-radar/src/alpha.tsx new file mode 100644 index 0000000000..6a2ec882ba --- /dev/null +++ b/plugins/tech-radar/src/alpha.tsx @@ -0,0 +1,62 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createApiFactory, createRouteRef } from '@backstage/core-plugin-api'; +import { + createApiExtension, + createPageExtension, + createPlugin, + createSchemaFromZod, +} from '@backstage/frontend-plugin-api'; +import React from 'react'; +import { techRadarApiRef } from './api'; +import { SampleTechRadarApi } from './sample'; + +const techRadarRouteRef = createRouteRef({ id: 'plugin.techradar.page' }); + +/** @alpha */ +export const TechRadarPage = createPageExtension({ + id: 'plugin.techradar.page', + defaultPath: '/tech-radar', + routeRef: techRadarRouteRef, + configSchema: createSchemaFromZod(z => + z.object({ + title: z.string().default('Tech Radar'), + subtitle: z + .string() + .default('Pick the recommended technologies for your projects'), + pageTitle: z.string().default('Company Radar'), + path: z.string().default('/tech-radar'), + width: z.number().default(1500), + height: z.number().default(800), + }), + ), + loader: ({ config }) => + import('./components').then(m => <m.RadarPage {...config} />), +}); + +const sampleTechRadarApi = createApiExtension({ + api: techRadarApiRef, + factory() { + return createApiFactory(techRadarApiRef, new SampleTechRadarApi()); + }, +}); + +/** @alpha */ +export default createPlugin({ + id: 'tech-radar', + extensions: [TechRadarPage, sampleTechRadarApi], +}); diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 05f7d05b40..812543f3c8 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/test-utils@1.4.4-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/theme@0.4.2 + +## 1.0.21 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog@1.13.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/core-components@0.13.5 + - @backstage/test-utils@1.4.3 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + ## 1.0.21-next.3 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 98dfaa5e33..0a88a3d99f 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.21-next.3", + "version": "1.0.22-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index edfdef0aae..7566b7baff 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,64 @@ # @backstage/plugin-techdocs-backend +## 1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/plugin-techdocs-node@1.8.2-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 1.7.0 + +### Minor Changes + +- 5985d458ee30: Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- 60af8017dd84: Expand techdocs.publisher.type with `googleGcs`,`awsS3`,`azureBlobStorage` and `openStackSwift` +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- a8a614ba0d07: Minor `package.json` update. +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-techdocs-node@1.8.0 + ## 1.7.0-next.3 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index c55254e533..935990c305 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.7.0-next.3", + "version": "1.7.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 85643f7302..3f79ff32b8 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/theme@0.4.2 + +## 1.1.0 + +### Minor Changes + +- 86c19906fe4b: Enable zoom icon for techdocs images inside lightbox + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/integration@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + ## 1.1.0-next.3 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/api-report.md b/plugins/techdocs-module-addons-contrib/api-report.md index c242bb02f2..48e6b2bcdc 100644 --- a/plugins/techdocs-module-addons-contrib/api-report.md +++ b/plugins/techdocs-module-addons-contrib/api-report.md @@ -34,7 +34,7 @@ export type ReportIssueTemplateBuilder = (options: { }) => ReportIssueTemplate; // @public -export const techdocsModuleAddonsContribPlugin: BackstagePlugin<{}, {}, {}>; +export const techdocsModuleAddonsContribPlugin: BackstagePlugin<{}, {}>; // @public export const TextSize: () => JSX.Element | null; diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 4915d7bf04..933f18eb48 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.1.0-next.3", + "version": "1.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 06d4b405cb..dca68479be 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-techdocs-node +## 1.8.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/integration-aws-node@0.1.6 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-search-common@1.2.6 + +## 1.8.0 + +### Minor Changes + +- 5985d458ee30: Add a `techdocs.publisher.azureBlobStorage.connectionString` app-config setting, which can be leveraged for improved Azurite support. +- 10a86bd4ae12: Add optional config and cli option for techdocs to specify default mkdocs plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/integration-aws-node@0.1.6 + ## 1.8.0-next.3 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 7778555012..35feb3b0b4 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.8.0-next.3", + "version": "1.8.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { @@ -63,7 +63,7 @@ "js-yaml": "^4.0.0", "json5": "^2.1.3", "mime-types": "^2.1.27", - "mock-fs": "^5.1.0", + "mock-fs": "^5.2.0", "p-limit": "^3.1.0", "recursive-readdir": "^2.2.2", "winston": "^3.2.1" diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index e20e20ea5b..4d422d7125 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -393,7 +393,7 @@ describe('helpers', () => { await patchIndexPreBuild({ inputDir: '/', logger: mockLogger }); - expect(fs.readFileSync('/docs/index.md', 'utf-8')).toEqual( + await expect(fs.readFile('/docs/index.md', 'utf-8')).resolves.toEqual( 'index.md content', ); expect(warn).not.toHaveBeenCalledWith(); @@ -407,7 +407,7 @@ describe('helpers', () => { await patchIndexPreBuild({ inputDir: '/', logger: mockLogger }); - expect(fs.readFileSync('/docs/index.md', 'utf-8')).toEqual( + await expect(fs.readFile('/docs/index.md', 'utf-8')).resolves.toEqual( 'docs/README.md content', ); expect(warn.mock.calls).toEqual([ @@ -422,7 +422,7 @@ describe('helpers', () => { await patchIndexPreBuild({ inputDir: '/', logger: mockLogger }); - expect(fs.readFileSync('/docs/index.md', 'utf-8')).toEqual( + await expect(fs.readFile('/docs/index.md', 'utf-8')).resolves.toEqual( 'main README.md content', ); expect(warn.mock.calls).toEqual([ @@ -437,7 +437,7 @@ describe('helpers', () => { await patchIndexPreBuild({ inputDir: '/', logger: mockLogger }); - expect(() => fs.readFileSync('/docs/index.md', 'utf-8')).toThrow(); + await expect(fs.readFile('/docs/index.md', 'utf-8')).rejects.toThrow(); const paths = [ path.normalize('docs/index.md'), path.normalize('docs/README.md'), @@ -483,7 +483,7 @@ describe('helpers', () => { await expect( createOrUpdateMetadata(filePath, mockLogger), - ).rejects.toThrow('Unexpected token d in JSON at position 0'); + ).rejects.toThrow('Unexpected token'); }); it('should add build timestamp to the metadata json', async () => { @@ -520,7 +520,7 @@ describe('helpers', () => { const filePath = path.join(rootDir, 'invalid_techdocs_metadata.json'); await expect(storeEtagMetadata(filePath, 'etag123abc')).rejects.toThrow( - 'Unexpected token d in JSON at position 0', + 'Unexpected token', ); }); diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 41422e0f0f..f14e5b5a60 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-techdocs-react +## 1.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/version-bridge@1.0.5 + +## 1.1.11 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/version-bridge@1.0.5 + +## 1.1.10 + +Skipped due to publishing issues. + ## 1.1.10-next.3 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 8d0031be90..79ef7241f0 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.10-next.3", + "version": "1.1.12-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 5cdf098ec9..e2256c8f15 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-techdocs +## 1.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-search-common@1.2.6 + +## 1.7.0 + +### Minor Changes + +- e44f45ac4515: This change allows a new annotation of `backstage.io/techdocs-entity` this ref allows you to reference another entity for its TechDocs. This allows you have a single TechDoc for all items in a system, for example you might have a frontend and a backend in the same repo. This would allow you to have TechDocs build under a `System` entity while referencing the system e.g.: `backstage.io/techdocs-entity: system:default/example` that will show the systems docs in both the TechDocs button and the TechDocs tab without needing to do duplicate builds and filling the TechDocs page with garbage. + +### Patch Changes + +- 88c9525a36f3: Fixed bug in styles that caused next and previous links in footer to overlap page content. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/integration-react@1.1.19 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/theme@0.4.2 + ## 1.7.0-next.3 ### Patch Changes diff --git a/plugins/techdocs/api-report.md b/plugins/techdocs/api-report.md index 3207a16f87..f351996654 100644 --- a/plugins/techdocs/api-report.md +++ b/plugins/techdocs/api-report.md @@ -79,6 +79,7 @@ export const DocsTable: { columns: { createNameColumn(): TableColumn<DocsTableRow>; createOwnerColumn(): TableColumn<DocsTableRow>; + createKindColumn(): TableColumn<DocsTableRow>; createTypeColumn(): TableColumn<DocsTableRow>; }; actions: { @@ -142,6 +143,7 @@ export const EntityListDocsTable: { columns: { createNameColumn(): TableColumn<DocsTableRow>; createOwnerColumn(): TableColumn<DocsTableRow>; + createKindColumn(): TableColumn<DocsTableRow>; createTypeColumn(): TableColumn<DocsTableRow>; }; actions: { @@ -318,7 +320,6 @@ const techdocsPlugin: BackstagePlugin< }>; entityContent: RouteRef<undefined>; }, - {}, {} >; export { techdocsPlugin as plugin }; diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index d61fb856d3..7a34577f01 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.7.0-next.3", + "version": "1.7.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs/src/home/components/Tables/DocsTable.tsx b/plugins/techdocs/src/home/components/Tables/DocsTable.tsx index 5e5b41ee3e..03ba442578 100644 --- a/plugins/techdocs/src/home/components/Tables/DocsTable.tsx +++ b/plugins/techdocs/src/home/components/Tables/DocsTable.tsx @@ -17,16 +17,16 @@ import React from 'react'; import useCopyToClipboard from 'react-use/lib/useCopyToClipboard'; -import { useRouteRef, useApi, configApiRef } from '@backstage/core-plugin-api'; +import { configApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; import { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model'; import { - humanizeEntityRef, getEntityRelations, + humanizeEntityRef, } from '@backstage/plugin-catalog-react'; import { rootDocsRouteRef } from '../../../routes'; import { - LinkButton, EmptyState, + LinkButton, Table, TableColumn, TableOptions, @@ -87,6 +87,7 @@ export const DocsTable = (props: DocsTableProps) => { const defaultColumns: TableColumn<DocsTableRow>[] = [ columnFactories.createNameColumn(), columnFactories.createOwnerColumn(), + columnFactories.createKindColumn(), columnFactories.createTypeColumn(), ]; diff --git a/plugins/techdocs/src/home/components/Tables/columns.tsx b/plugins/techdocs/src/home/components/Tables/columns.tsx index 774cfc5e8a..bc85bb7a63 100644 --- a/plugins/techdocs/src/home/components/Tables/columns.tsx +++ b/plugins/techdocs/src/home/components/Tables/columns.tsx @@ -57,6 +57,12 @@ export const columnFactories = { ), }; }, + createKindColumn(): TableColumn<DocsTableRow> { + return { + title: 'Kind', + field: 'entity.kind', + }; + }, createTypeColumn(): TableColumn<DocsTableRow> { return { title: 'Type', diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index 9084bf6c85..e7afb9ecd0 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-todo-backend +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.7.1-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/plugin-catalog-node@1.4.6-next.0 + +## 0.3.1 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/integration@1.7.0 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/backend-openapi-utils@0.0.4 + +## 0.3.0 + +Skipped due to publishing issues. + ## 0.3.0-next.3 ### Minor Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index f82d28ef1f..1d4f396de1 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.3.0-next.3", + "version": "0.3.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index 9837d02444..7e9e8c6933 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-todo +## 0.2.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.27 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.26 + +Skipped due to publishing issues. + ## 0.2.26-next.3 ### Patch Changes diff --git a/plugins/todo/api-report.md b/plugins/todo/api-report.md index ae4c4f3645..215d1730bc 100644 --- a/plugins/todo/api-report.md +++ b/plugins/todo/api-report.md @@ -85,7 +85,6 @@ export const todoPlugin: BackstagePlugin< { entityContent: RouteRef<undefined>; }, - {}, {} >; ``` diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 6d83aaa9c1..fa1d1d9e62 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.26-next.3", + "version": "0.2.28-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 4b705834f5..9af11fffbf 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,51 @@ # @backstage/plugin-user-settings-backend +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.2.1 + +### Minor Changes + +- 71114ac50e02: **BREAKING**: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## 0.2.0 + +Skipped due to publishing issues. + ## 0.2.0-next.3 ### Minor Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 59b6c8e8bf..0feaba734e 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.2.0-next.3", + "version": "0.2.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 8e6c68d270..9e81589e7d 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-user-settings +## 0.7.11-next.0 + +### Patch Changes + +- d1b637d005: Fixed a bug where the theme icons would not be colored according to their active state. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## 0.7.10 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- ce77b23423cb: conditionally rendering the user email in user profile card +- e03f3ee2be94: changed auto theme tooltip title to camel case +- 8cec7664e146: Removed `@types/node` dependency +- 6e30769cc627: Introduced experimental support for internationalization. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## 0.7.9 + +Skipped due to publishing issues. + ## 0.7.9-next.3 ### Patch Changes diff --git a/plugins/user-settings/api-report.md b/plugins/user-settings/api-report.md index cdb576c45c..b92677f8ce 100644 --- a/plugins/user-settings/api-report.md +++ b/plugins/user-settings/api-report.md @@ -112,7 +112,6 @@ const userSettingsPlugin: BackstagePlugin< { settingsPage: RouteRef<undefined>; }, - {}, {} >; export { userSettingsPlugin as plugin }; diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 8903065ae4..d2c9f440e6 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.7.9-next.3", + "version": "0.7.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/src/components/General/UserSettingsThemeToggle.tsx b/plugins/user-settings/src/components/General/UserSettingsThemeToggle.tsx index 7279fcb96a..ca57de3a78 100644 --- a/plugins/user-settings/src/components/General/UserSettingsThemeToggle.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsThemeToggle.tsx @@ -141,8 +141,8 @@ export const UserSettingsThemeToggle = () => { onChange={handleSetTheme} > {themeIds.map(theme => { - const themeIcon = themeIds.find(it => it.id === theme.id)?.icon; const themeId = theme.id; + const themeIcon = theme.icon; const themeTitle = theme.title || (themeId === 'light' || themeId === 'dark' @@ -156,7 +156,11 @@ export const UserSettingsThemeToggle = () => { > <> {themeTitle}  - <ThemeIcon id={themeId} icon={themeIcon} activeId={themeId} /> + <ThemeIcon + id={themeId} + icon={themeIcon} + activeId={activeThemeId} + /> </> </TooltipToggleButton> ); diff --git a/plugins/user-settings/src/translation.ts b/plugins/user-settings/src/translation.ts index 79b817c828..42fd8311e2 100644 --- a/plugins/user-settings/src/translation.ts +++ b/plugins/user-settings/src/translation.ts @@ -30,5 +30,5 @@ export const userSettingsTranslationRef = createTranslationRef({ select_theme: 'Select {{theme}}', select_theme_auto: 'Select Auto Theme', select_lng: 'Select language {{language}}', - } as const, + }, }); diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index 9590c20875..fcb259e047 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-vault-backend +## 0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/errors@1.2.2 + +## 0.3.8 + +### Patch Changes + +- 858a18800870: Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + +## 0.3.7 + +Skipped due to publishing issues. + ## 0.3.7-next.3 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 4fbd790b45..f8de4e2845 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.3.7-next.3", + "version": "0.3.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index a8e194ff96..940345da8d 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-vault +## 0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.19 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 858a18800870: Added ability to override vault secret engine value on catalog entity level using annotation `vault.io/secrets-engine` +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.18 + +Skipped due to publishing issues. + ## 0.1.18-next.3 ### Patch Changes diff --git a/plugins/vault/api-report.md b/plugins/vault/api-report.md index da13e2092d..59bcb1c527 100644 --- a/plugins/vault/api-report.md +++ b/plugins/vault/api-report.md @@ -33,7 +33,7 @@ export interface VaultApi { export const vaultApiRef: ApiRef<VaultApi>; // @public -export const vaultPlugin: BackstagePlugin<{}, {}, {}>; +export const vaultPlugin: BackstagePlugin<{}, {}>; // @public export type VaultSecret = { diff --git a/plugins/vault/package.json b/plugins/vault/package.json index b1a0909740..d571efe444 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.18-next.3", + "version": "0.1.20-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/src/components/EntityVaultCard/EntityVaultCard.test.tsx b/plugins/vault/src/components/EntityVaultCard/EntityVaultCard.test.tsx index f46aa1e4c2..9450ddc41d 100644 --- a/plugins/vault/src/components/EntityVaultCard/EntityVaultCard.test.tsx +++ b/plugins/vault/src/components/EntityVaultCard/EntityVaultCard.test.tsx @@ -46,7 +46,7 @@ describe('EntityVaultCard', () => { </EntityProvider>, ); expect( - rendered.getByText(/Add the annotation to your component YAML/), + rendered.getByText(/Add the annotation to your Component YAML/), ).toBeInTheDocument(); }); }); diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index ecf1aaf933..c296cc3e0b 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-xcmetrics +## 0.2.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.43 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- 814feeed7343: Update to handle invalid luxon values +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.2.42 + +Skipped due to publishing issues. + ## 0.2.42-next.3 ### Patch Changes diff --git a/plugins/xcmetrics/api-report.md b/plugins/xcmetrics/api-report.md index 4cbac0683c..94a2d4afcd 100644 --- a/plugins/xcmetrics/api-report.md +++ b/plugins/xcmetrics/api-report.md @@ -17,7 +17,6 @@ export const xcmetricsPlugin: BackstagePlugin< { root: RouteRef<undefined>; }, - {}, {} >; ``` diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 2adb3f0cbd..b63915c1f0 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.42-next.3", + "version": "0.2.44-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/scripts/verify-lockfile-duplicates.js b/scripts/verify-lockfile-duplicates.js index a8d344b741..ddf99f4fd6 100644 --- a/scripts/verify-lockfile-duplicates.js +++ b/scripts/verify-lockfile-duplicates.js @@ -36,7 +36,7 @@ async function findLockFiles() { if (!files.length) { // List all lock files that are in the root or in an immediate subdirectory - files = ['yarn.lock', 'cypress/yarn.lock', 'microsite/yarn.lock']; + files = ['yarn.lock', 'microsite/yarn.lock']; } return files.map(file => ({ diff --git a/storybook/yarn.lock b/storybook/yarn.lock index a868c78ce4..e0f77cd510 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2840,91 +2840,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-darwin-arm64@npm:1.3.84" +"@swc/core-darwin-arm64@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-darwin-arm64@npm:1.3.90" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-darwin-x64@npm:1.3.84" +"@swc/core-darwin-x64@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-darwin-x64@npm:1.3.90" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.84" +"@swc/core-linux-arm-gnueabihf@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.90" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.84" +"@swc/core-linux-arm64-gnu@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.90" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.84" +"@swc/core-linux-arm64-musl@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.90" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.84" +"@swc/core-linux-x64-gnu@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.90" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-x64-musl@npm:1.3.84" +"@swc/core-linux-x64-musl@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-x64-musl@npm:1.3.90" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.84" +"@swc/core-win32-arm64-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.90" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.84" +"@swc/core-win32-ia32-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.90" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.84" +"@swc/core-win32-x64-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.90" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.84 - resolution: "@swc/core@npm:1.3.84" + version: 1.3.90 + resolution: "@swc/core@npm:1.3.90" dependencies: - "@swc/core-darwin-arm64": 1.3.84 - "@swc/core-darwin-x64": 1.3.84 - "@swc/core-linux-arm-gnueabihf": 1.3.84 - "@swc/core-linux-arm64-gnu": 1.3.84 - "@swc/core-linux-arm64-musl": 1.3.84 - "@swc/core-linux-x64-gnu": 1.3.84 - "@swc/core-linux-x64-musl": 1.3.84 - "@swc/core-win32-arm64-msvc": 1.3.84 - "@swc/core-win32-ia32-msvc": 1.3.84 - "@swc/core-win32-x64-msvc": 1.3.84 - "@swc/types": ^0.1.4 + "@swc/core-darwin-arm64": 1.3.90 + "@swc/core-darwin-x64": 1.3.90 + "@swc/core-linux-arm-gnueabihf": 1.3.90 + "@swc/core-linux-arm64-gnu": 1.3.90 + "@swc/core-linux-arm64-musl": 1.3.90 + "@swc/core-linux-x64-gnu": 1.3.90 + "@swc/core-linux-x64-musl": 1.3.90 + "@swc/core-win32-arm64-msvc": 1.3.90 + "@swc/core-win32-ia32-msvc": 1.3.90 + "@swc/core-win32-x64-msvc": 1.3.90 + "@swc/counter": ^0.1.1 + "@swc/types": ^0.1.5 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -2951,14 +2952,21 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: dee45823923c29dde579ed1121c4392c937826d575c87f62399ba7a0b27cacfeb05da97b65cf49a721a50127bb1e22ca5c07defa784ec2a47fed33e3498ef1b9 + checksum: f8ced5187068dc73445c135065c6492f0ac559d0f7720c2482aa9663c87bd015f3d2abef6ee7b2f817280a5e8dd0946c59cce7e1499180644fbc948a9e3823ab languageName: node linkType: hard -"@swc/types@npm:^0.1.4": - version: 0.1.4 - resolution: "@swc/types@npm:0.1.4" - checksum: 9b09de7dca8e4b19bfb43f9e332c771855158cb761d26000807fe858447ecbc5342a6c257b26d9aa5497f7138fc58913693e2bee222e5042e0e8f57c2979ae66 +"@swc/counter@npm:^0.1.1": + version: 0.1.1 + resolution: "@swc/counter@npm:0.1.1" + checksum: bb974babd493ba01c0d4a95ab610c3fc15fbf609c08cb0342798e485f57ecc0950abbf84e07124e63c5fe610b492d9a8dd03701d3b9ef7329d9e8bf3cc44980f + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.5": + version: 0.1.5 + resolution: "@swc/types@npm:0.1.5" + checksum: 6aee11f62d3d805a64848e0bd5f0e0e615f958e327a9e1260056c368d7d28764d89e38bd8005a536c9bf18afbcd303edd84099d60df34a2975d62540f61df13b languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index d0c50c3999..5a115047db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -103,8 +103,8 @@ __metadata: linkType: hard "@apollo/client@npm:^3.0.0": - version: 3.8.3 - resolution: "@apollo/client@npm:3.8.3" + version: 3.8.4 + resolution: "@apollo/client@npm:3.8.4" dependencies: "@graphql-typed-document-node/core": ^3.1.1 "@wry/context": ^0.7.3 @@ -134,7 +134,7 @@ __metadata: optional: true subscriptions-transport-ws: optional: true - checksum: cdecd5d613c0f941d00fc1904b9ecdeb502fc157c10400430231adb47d8f67727c78eed1b7489aed91cce6e20e32fc44e16b6c2d5424a42d7c100dcef65b942b + checksum: 509e37cdce7462cacda0a86c413ce471cd8f618625fb8ac3a60d6347d12f37a4fc60e12fc3fc1a375799caa21e56ff58d709e13ef5e13ab15e4dfc828a527848 languageName: node linkType: hard @@ -3305,12 +3305,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.6, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.10, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.22.11 - resolution: "@babel/runtime@npm:7.22.11" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.15, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": + version: 7.22.15 + resolution: "@babel/runtime@npm:7.22.15" dependencies: regenerator-runtime: ^0.14.0 - checksum: a5cd6683a8fcdb8065cb1677f221e22f6c67ec8f15ad1d273b180b93ab3bd86c66da2c48f500d4e72d8d2cfa85ff4872a3f350e5aa3855630036af5da765c001 + checksum: 793296df1e41599a935a3d77ec01eb6088410d3fd4dbe4e92f06c6b7bb2f8355024e6d78621a3a35f44e0e23b0b59107f23d585384df4f3123256a1e1492040e languageName: node linkType: hard @@ -3497,7 +3497,7 @@ __metadata: luxon: ^3.0.0 minimatch: ^5.0.0 minimist: ^1.2.5 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 morgan: ^1.10.0 msw: ^1.0.0 mysql2: ^2.2.5 @@ -3661,18 +3661,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-client@npm:^1.4.3": - version: 1.4.3 - resolution: "@backstage/catalog-client@npm:1.4.3" - dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/errors": ^1.2.1 - cross-fetch: ^3.1.5 - checksum: 0115c630e3c0438ffbbc3a87f7bd1ff557f2c1c2f5d072dd587bff153931ece83cbce64a8ca3fb26a017c2634a3399145d14e94c319df5c6e1889a2c3b915829 - languageName: node - linkType: hard - -"@backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": +"@backstage/catalog-client@^1.4.4, @backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": version: 0.0.0-use.local resolution: "@backstage/catalog-client@workspace:packages/catalog-client" dependencies: @@ -3684,22 +3673,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@npm:^1.1.5, @backstage/catalog-model@npm:^1.4.1": - version: 1.4.1 - resolution: "@backstage/catalog-model@npm:1.4.1" - dependencies: - "@backstage/config": ^1.0.8 - "@backstage/errors": ^1.2.1 - "@backstage/types": ^1.1.0 - ajv: ^8.10.0 - json-schema: ^0.4.0 - lodash: ^4.17.21 - uuid: ^8.0.0 - checksum: 5fd839bf8f10dc8ccd25a2714513440fb3cd982a8c6963adbffc5cefa732456b832f039a44d0ac9103b25327a311810b1e33b12117775df4a7cec0a21c9743b4 - languageName: node - linkType: hard - -"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@^1.1.5, @backstage/catalog-model@^1.4.2, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": version: 0.0.0-use.local resolution: "@backstage/catalog-model@workspace:packages/catalog-model" dependencies: @@ -3722,7 +3696,7 @@ __metadata: resolution: "@backstage/cli-common@workspace:packages/cli-common" dependencies: "@backstage/cli": "workspace:^" - "@types/node": ^16.0.0 + "@types/node": ^18.17.8 languageName: unknown linkType: soft @@ -3799,7 +3773,7 @@ __metadata: "@types/jest": ^29.0.0 "@types/minimatch": ^5.0.0 "@types/mock-fs": ^4.13.0 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/npm-packlist": ^3.0.0 "@types/recursive-readdir": ^2.2.0 "@types/rollup-plugin-peer-deps-external": ^2.2.0 @@ -3821,6 +3795,7 @@ __metadata: cross-fetch: ^3.1.5 cross-spawn: ^7.0.3 css-loader: ^6.5.1 + ctrlc-windows: ^2.1.0 del: ^7.0.0 diff: ^5.0.0 esbuild: ^0.19.0 @@ -3852,7 +3827,7 @@ __metadata: lodash: ^4.17.21 mini-css-extract-plugin: ^2.4.2 minimatch: ^5.1.1 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 msw: ^1.0.0 node-fetch: ^2.6.7 node-libs-browser: ^2.2.1 @@ -3904,7 +3879,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/cli-common": "workspace:^" "@types/jscodeshift": ^0.11.0 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 chalk: ^4.0.0 commander: ^9.1.0 jscodeshift: ^0.15.0 @@ -3937,7 +3912,7 @@ __metadata: json-schema-traverse: ^1.0.0 lodash: ^4.17.21 minimist: ^1.2.5 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 msw: ^1.0.0 node-fetch: ^2.6.7 typescript-json-schema: ^0.55.0 @@ -3947,17 +3922,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@npm:^1.0.6, @backstage/config@npm:^1.0.7, @backstage/config@npm:^1.0.8": - version: 1.0.8 - resolution: "@backstage/config@npm:1.0.8" - dependencies: - "@backstage/types": ^1.1.0 - lodash: ^4.17.21 - checksum: 78c38207d52de65bf83c1b9281c83fc89e0cda9869c680c39e69bffed5200e5d35035cd850816b57fd979a2ea24132f96ee938b1cddacaf96a43d0385930da9a - languageName: node - linkType: hard - -"@backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@^1.0.6, @backstage/config@^1.0.7, @backstage/config@^1.1.0, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -4055,15 +4020,15 @@ __metadata: languageName: node linkType: hard -"@backstage/core-components@npm:^0.13.4": - version: 0.13.4 - resolution: "@backstage/core-components@npm:0.13.4" +"@backstage/core-components@npm:^0.13.5": + version: 0.13.5 + resolution: "@backstage/core-components@npm:0.13.5" dependencies: - "@backstage/config": ^1.0.8 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/errors": ^1.2.1 - "@backstage/theme": ^0.4.1 - "@backstage/version-bridge": ^1.0.4 + "@backstage/config": ^1.1.0 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/errors": ^1.2.2 + "@backstage/theme": ^0.4.2 + "@backstage/version-bridge": ^1.0.5 "@date-io/core": ^1.3.13 "@material-table/core": ^3.1.0 "@material-ui/core": ^4.12.2 @@ -4087,9 +4052,10 @@ __metadata: pluralize: ^8.0.0 prop-types: ^15.7.2 qs: ^6.9.4 - rc-progress: 3.4.2 + rc-progress: 3.5.1 react-helmet: 6.1.0 react-hook-form: ^7.12.2 + react-idle-timer: 5.6.2 react-markdown: ^8.0.0 react-sparklines: ^1.7.0 react-syntax-highlighter: ^15.4.5 @@ -4104,7 +4070,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: cb3f1f0c91a37c401e3e5dc1304414e02205d5eb6e9fd8a8de8f1f7796f105b44f7926d61c95d2331fe2887612b9c44483683c7df6ffcf826e438fd1beffcd74 + checksum: f1c9290fd1358561c9a1098200cdf1d2dc16117aebf4010759f122b0a638acb50a89faa24988ad4a854ace59a74606329550c59fc98ab6281feb4b4f5bfe52c0 languageName: node linkType: hard @@ -4112,11 +4078,13 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/core-components@workspace:packages/core-components" dependencies: + "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/core-app-api": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/plugin-catalog-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@backstage/version-bridge": "workspace:^" @@ -4148,6 +4116,7 @@ __metadata: "@types/zen-observable": ^0.8.0 ansi-regex: ^6.0.1 classnames: ^2.2.6 + cross-fetch: ^3.1.5 d3-selection: ^3.0.0 d3-shape: ^3.0.0 d3-zoom: ^3.0.0 @@ -4164,6 +4133,7 @@ __metadata: rc-progress: 3.5.1 react-helmet: 6.1.0 react-hook-form: ^7.12.2 + react-idle-timer: 5.6.2 react-markdown: ^8.0.0 react-sparklines: ^1.7.0 react-syntax-highlighter: ^15.4.5 @@ -4181,22 +4151,23 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.3.0, @backstage/core-plugin-api@npm:^1.5.0, @backstage/core-plugin-api@npm:^1.5.3": - version: 1.5.3 - resolution: "@backstage/core-plugin-api@npm:1.5.3" +"@backstage/core-plugin-api@npm:^1.3.0, @backstage/core-plugin-api@npm:^1.5.0, @backstage/core-plugin-api@npm:^1.6.0": + version: 1.6.0 + resolution: "@backstage/core-plugin-api@npm:1.6.0" dependencies: - "@backstage/config": ^1.0.8 - "@backstage/types": ^1.1.0 - "@backstage/version-bridge": ^1.0.4 + "@backstage/config": ^1.1.0 + "@backstage/types": ^1.1.1 + "@backstage/version-bridge": ^1.0.5 "@types/react": ^16.13.1 || ^17.0.0 history: ^5.0.0 + i18next: ^22.4.15 prop-types: ^15.7.2 zen-observable: ^0.10.0 peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: d272b5af4f22cf8f2b91fb85d0fc860cc70220a596e4f03544a996493b045fd09663fc1d79044916ffd86303bfdd47795398dd86d66987d8514bade3dcbaad37 + checksum: 540deb91d3c143ce1c3736359c3301af64fbd6eccbaae61bfc96f4e180654e7eb025bb1d4ff5be62b7ea3d6dac7ed617e4dba0c176cfdbf865400fde0f987ddb languageName: node linkType: hard @@ -4239,14 +4210,14 @@ __metadata: "@types/command-exists": ^1.2.0 "@types/fs-extra": ^9.0.1 "@types/inquirer": ^8.1.3 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/recursive-readdir": ^2.2.0 chalk: ^4.0.0 commander: ^9.1.0 fs-extra: 10.1.0 handlebars: ^4.7.3 inquirer: ^8.2.0 - mock-fs: ^5.1.1 + mock-fs: ^5.2.0 nodemon: ^3.0.1 ora: ^5.3.0 recursive-readdir: ^2.2.2 @@ -4286,18 +4257,24 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@npm:^1.1.5, @backstage/errors@npm:^1.2.1": - version: 1.2.1 - resolution: "@backstage/errors@npm:1.2.1" +"@backstage/e2e-test-utils@workspace:*, @backstage/e2e-test-utils@workspace:packages/e2e-test-utils": + version: 0.0.0-use.local + resolution: "@backstage/e2e-test-utils@workspace:packages/e2e-test-utils" dependencies: - "@backstage/types": ^1.1.0 - cross-fetch: ^3.1.5 - serialize-error: ^8.0.1 - checksum: 67f7f9939af47e178c27d1a96282f4921b4ba8108917bb10e68dba1644a5f643cb87251346989dd402b333593cb7e658129256d80781b962add28f2a3efca0ea - languageName: node - linkType: hard + "@backstage/cli": "workspace:^" + "@backstage/cli-node": "workspace:^" + "@manypkg/get-packages": ^1.1.3 + "@types/fs-extra": ^9.0.1 + fs-extra: ^10.1.0 + peerDependencies: + "@playwright/test": ^1.32.3 + peerDependenciesMeta: + "@playwright/test": + optional: true + languageName: unknown + linkType: soft -"@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@^1.1.5, @backstage/errors@^1.2.2, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4330,9 +4307,13 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/frontend-plugin-api": "workspace:^" "@backstage/plugin-graphiql": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/theme": "workspace:^" "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.4 + "@material-ui/icons": ^4.11.3 "@testing-library/jest-dom": ^5.10.1 + "@testing-library/react": ^12.1.3 "@types/react": ^16.13.1 || ^17.0.0 lodash: ^4.17.21 peerDependencies: @@ -4381,24 +4362,25 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.1.18": - version: 1.1.18 - resolution: "@backstage/integration-react@npm:1.1.18" +"@backstage/integration-react@npm:^1.1.19": + version: 1.1.19 + resolution: "@backstage/integration-react@npm:1.1.19" dependencies: - "@backstage/config": ^1.0.8 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/integration": ^1.6.2 - "@backstage/theme": ^0.4.1 + "@backstage/config": ^1.1.0 + "@backstage/core-components": ^0.13.5 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/integration": ^1.7.0 + "@backstage/theme": ^0.4.2 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@types/react": ^16.13.1 || ^17.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: ec2ea86510947f4ecb59838fb540f7318e1e13f859b16340fa52e33d7e014e8796528fcd2e5a37a7c525d48c7df0533954565b561c89575f7075d933ba1ed340 + checksum: 8ef2b46bf91b71351aa4b114de147d130e0298d8849cf2fa358ac1559c2026ffbfad10b15f6fa4bf94c7bbb4f4419766c6c66b77d2859fe184a43351f1f5df81 languageName: node linkType: hard @@ -4431,20 +4413,20 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@npm:^1.6.2": - version: 1.6.2 - resolution: "@backstage/integration@npm:1.6.2" +"@backstage/integration@npm:^1.7.0": + version: 1.7.0 + resolution: "@backstage/integration@npm:1.7.0" dependencies: "@azure/identity": ^3.2.1 - "@backstage/config": ^1.0.8 - "@backstage/errors": ^1.2.1 + "@backstage/config": ^1.1.0 + "@backstage/errors": ^1.2.2 "@octokit/auth-app": ^4.0.0 "@octokit/rest": ^19.0.3 cross-fetch: ^3.1.5 git-url-parse: ^13.0.0 lodash: ^4.17.21 luxon: ^3.0.0 - checksum: 5ae6a3def92ee9feb114fecea8a36337df592f49f23875fa619b0eba223f287ed7bbe993c15cac99c2b45c3150e10bb2e1bb4389b34a09de5377365ab13e9ae7 + checksum: f02516b7bdb7adb0516b49b90802e588f09c43b4db66bcce68314518c46b9c6fb8ca76ac7a55d4a80cdd414bb6876475b42eb6256b2efda9824ad3667ffa8f54 languageName: node linkType: hard @@ -4520,6 +4502,7 @@ __metadata: "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" "@backstage/integration-react": "workspace:^" "@backstage/plugin-adr-common": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" @@ -4846,7 +4829,7 @@ __metadata: knex: ^2.0.0 lodash: ^4.17.21 luxon: ^3.0.0 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 msw: ^1.0.0 node-fetch: ^2.6.7 supertest: ^6.1.3 @@ -5782,18 +5765,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@npm:^1.0.10, @backstage/plugin-catalog-common@npm:^1.0.15": - version: 1.0.15 - resolution: "@backstage/plugin-catalog-common@npm:1.0.15" - dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/plugin-permission-common": ^0.7.7 - "@backstage/plugin-search-common": ^1.2.5 - checksum: b5d371605e9436b99b0a2b22cbb049f65d42ab4736108bddafea9294b25adb466a2f3baeb360d428f40f7c63503663c1648089f440c9cfaff3cb70647e5a4e0e - languageName: node - linkType: hard - -"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@^1.0.10, @backstage/plugin-catalog-common@^1.0.16, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common" dependencies: @@ -5930,22 +5902,22 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.2.4, @backstage/plugin-catalog-react@npm:^1.8.3": - version: 1.8.3 - resolution: "@backstage/plugin-catalog-react@npm:1.8.3" +"@backstage/plugin-catalog-react@npm:^1.2.4, @backstage/plugin-catalog-react@npm:^1.8.4": + version: 1.8.4 + resolution: "@backstage/plugin-catalog-react@npm:1.8.4" dependencies: - "@backstage/catalog-client": ^1.4.3 - "@backstage/catalog-model": ^1.4.1 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/errors": ^1.2.1 - "@backstage/integration": ^1.6.2 - "@backstage/plugin-catalog-common": ^1.0.15 - "@backstage/plugin-permission-common": ^0.7.7 - "@backstage/plugin-permission-react": ^0.4.14 - "@backstage/theme": ^0.4.1 - "@backstage/types": ^1.1.0 - "@backstage/version-bridge": ^1.0.4 + "@backstage/catalog-client": ^1.4.4 + "@backstage/catalog-model": ^1.4.2 + "@backstage/core-components": ^0.13.5 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/errors": ^1.2.2 + "@backstage/integration": ^1.7.0 + "@backstage/plugin-catalog-common": ^1.0.16 + "@backstage/plugin-permission-common": ^0.7.8 + "@backstage/plugin-permission-react": ^0.4.15 + "@backstage/theme": ^0.4.2 + "@backstage/types": ^1.1.1 + "@backstage/version-bridge": ^1.0.5 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 @@ -5963,7 +5935,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 8d334dc8eb35399fb4fde7eb218589cc3bedf6f65665a0f379a578ca892ab4a06a83a6e0de2c392e16d12981a91c903efdaa78f577639dd8f73604c61541f60e + checksum: 6434741a60e4f53604a958c121d283d3d8b2756e1013d3a9b32659ae41b58359cbc3bee0791a95a35c847f43a76de9f9d2ea1f8e5fa6697adfc9115b5042a57e languageName: node linkType: hard @@ -6056,6 +6028,7 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" "@backstage/integration-react": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" @@ -6400,7 +6373,7 @@ __metadata: "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 - "@types/pluralize": ^0.0.30 + "@types/pluralize": ^0.0.31 "@types/react": ^16.13.1 || ^17.0.0 "@types/recharts": ^1.8.14 "@types/regression": ^2.0.0 @@ -6840,6 +6813,7 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-explore-common": "workspace:^" @@ -7328,20 +7302,21 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home-react@npm:^0.1.2": - version: 0.1.2 - resolution: "@backstage/plugin-home-react@npm:0.1.2" +"@backstage/plugin-home-react@npm:^0.1.3": + version: 0.1.3 + resolution: "@backstage/plugin-home-react@npm:0.1.3" dependencies: - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 + "@backstage/core-components": ^0.13.5 + "@backstage/core-plugin-api": ^1.6.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@rjsf/utils": 5.7.3 + "@rjsf/utils": 5.13.0 + "@types/react": ^16.13.1 || ^17.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: fafec93fe81f7a2e4a3bc018cc740b8c93b4be3bb0f9216ec8f510390cf70302d912734be9bec72ae9319b9fce39fb72c1467b97fb23ba54c597253912114bb5 + checksum: e87c9fd44c65aa1a768555812f32f42b1d2dc7ab1097c283cae37105d1f17a7b1b198c85d39d72258551015161f317c8e4538a652f6e8ebe9800c3a365f6ebc3 languageName: node linkType: hard @@ -7373,35 +7348,35 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home@npm:^0.5.7": - version: 0.5.7 - resolution: "@backstage/plugin-home@npm:0.5.7" +"@backstage/plugin-home@npm:^0.5.8": + version: 0.5.8 + resolution: "@backstage/plugin-home@npm:0.5.8" dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/config": ^1.0.8 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/plugin-catalog-react": ^1.8.3 - "@backstage/plugin-home-react": ^0.1.2 - "@backstage/theme": ^0.4.1 + "@backstage/catalog-model": ^1.4.2 + "@backstage/config": ^1.1.0 + "@backstage/core-components": ^0.13.5 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/plugin-catalog-react": ^1.8.4 + "@backstage/plugin-home-react": ^0.1.3 + "@backstage/theme": ^0.4.2 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 - "@rjsf/core-v5": "npm:@rjsf/core@5.7.3" - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.7.3" - "@rjsf/utils": 5.7.3 - "@rjsf/validator-ajv8": 5.7.3 + "@rjsf/core-v5": "npm:@rjsf/core@5.13.0" + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.13.0" + "@rjsf/utils": 5.13.0 + "@rjsf/validator-ajv8": 5.13.0 "@types/react": ^16.13.1 || ^17.0.0 lodash: ^4.17.21 react-grid-layout: ^1.3.4 react-resizable: ^3.0.4 react-use: ^17.2.4 - zod: ~3.21.4 + zod: ^3.21.4 peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 9d6d77fc07507b5b861fa650eaba318af693f9c972eb33513b499eda4abba242ae75621403a59ae9a0ba1370c25229405081af208a3bd52455942cfa17aa89fe + checksum: 4f895b3a7e7f61149ba7b8fd6ec998d1f83b6e5262073893c5863fe79c46e5e2f52b43346f310733e04815aaebd82b8a13d34616e8d0848f60f87b1fb3193d60 languageName: node linkType: hard @@ -7643,7 +7618,6 @@ __metadata: "@types/luxon": ^3.0.0 compression: ^1.7.4 cors: ^2.8.5 - cross-fetch: ^3.1.5 express: ^4.17.1 express-promise-router: ^4.1.0 fs-extra: 10.1.0 @@ -7669,8 +7643,56 @@ __metadata: dependencies: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/core-app-api": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/errors": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/types": "workspace:^" "@kubernetes/client-node": 0.18.1 + kubernetes-models: ^4.3.1 + lodash: ^4.17.21 + luxon: ^3.0.0 + msw: ^1.3.1 + languageName: unknown + linkType: soft + +"@backstage/plugin-kubernetes-react@workspace:^, @backstage/plugin-kubernetes-react@workspace:plugins/kubernetes-react": + version: 0.0.0-use.local + resolution: "@backstage/plugin-kubernetes-react@workspace:plugins/kubernetes-react" + dependencies: + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/core-app-api": "workspace:^" + "@backstage/core-components": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/plugin-kubernetes-common": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/types": "workspace:^" + "@kubernetes-models/apimachinery": ^1.1.0 + "@kubernetes-models/base": ^4.0.1 + "@kubernetes/client-node": ^0.19.0 + "@material-ui/core": ^4.9.13 + "@material-ui/icons": ^4.11.3 + "@material-ui/lab": ^4.0.0-alpha.61 + "@testing-library/jest-dom": ^5.10.1 + "@testing-library/react": ^12.1.3 + "@testing-library/react-hooks": ^8.0.1 + "@types/react": ^16.13.1 || ^17.0.0 + cronstrue: ^2.32.0 + jest-websocket-mock: ^2.5.0 + js-yaml: ^4.1.0 + kubernetes-models: ^4.3.1 + lodash: ^4.17.21 + luxon: ^3.0.0 + msw: ^1.3.1 + react-use: ^17.4.0 + xterm: ^5.3.0 + xterm-addon-attach: ^0.9.0 + xterm-addon-fit: ^0.8.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 languageName: unknown linkType: soft @@ -7688,6 +7710,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-kubernetes-common": "workspace:^" + "@backstage/plugin-kubernetes-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@backstage/types": "workspace:^" @@ -8263,21 +8286,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@npm:^0.7.7": - version: 0.7.7 - resolution: "@backstage/plugin-permission-common@npm:0.7.7" - dependencies: - "@backstage/config": ^1.0.8 - "@backstage/errors": ^1.2.1 - "@backstage/types": ^1.1.0 - cross-fetch: ^3.1.5 - uuid: ^8.0.0 - zod: ^3.21.4 - checksum: cf529acd946f667c291ed4f77947ef79737580b5396ec5cdcf4bc954238c54fe29503af8dfec0aca97ad4e378edb44e23936df6fd186bfa0f1d61f34997c4588 - languageName: node - linkType: hard - -"@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": +"@backstage/plugin-permission-common@^0.7.8, @backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-common@workspace:plugins/permission-common" dependencies: @@ -8315,13 +8324,13 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@npm:^0.4.14": - version: 0.4.14 - resolution: "@backstage/plugin-permission-react@npm:0.4.14" +"@backstage/plugin-permission-react@npm:^0.4.15": + version: 0.4.15 + resolution: "@backstage/plugin-permission-react@npm:0.4.15" dependencies: - "@backstage/config": ^1.0.8 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/plugin-permission-common": ^0.7.7 + "@backstage/config": ^1.1.0 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/plugin-permission-common": ^0.7.8 "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 react-use: ^17.2.4 @@ -8330,7 +8339,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: a41c652a133a5ffd54342f0dd9cf9db72be9b174bd20e04ad75a513ff9a61b00d84a2ddabcbf381473fae5e19ba76c33b121b16bfd60684758fda3b1b653955e + checksum: 5f11264a7d46bee0924b9a00133e756e38d3cce5ce842104546963e08b8bfc6445e28ac4b2b75878fd5407631353e964e5f0b399bc958a76aaa732741b80a52a languageName: node linkType: hard @@ -8361,6 +8370,7 @@ __metadata: resolution: "@backstage/plugin-playlist-backend@workspace:plugins/playlist-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-client": "workspace:^" "@backstage/catalog-model": "workspace:^" @@ -8593,7 +8603,7 @@ __metadata: "@types/mock-fs": ^4.13.0 command-exists: ^1.2.9 fs-extra: 10.1.0 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 msw: ^1.0.0 winston: ^3.2.1 yn: ^4.0.0 @@ -8630,11 +8640,11 @@ __metadata: "@types/command-exists": ^1.2.0 "@types/fs-extra": ^9.0.1 "@types/mock-fs": ^4.13.0 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 command-exists: ^1.2.9 fs-extra: ^10.0.1 jest-when: ^3.1.0 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 languageName: unknown linkType: soft @@ -8719,7 +8729,7 @@ __metadata: libsodium-wrappers: ^0.7.11 lodash: ^4.17.21 luxon: ^3.0.0 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 morgan: ^1.10.0 msw: ^1.0.0 node-fetch: ^2.6.7 @@ -9058,16 +9068,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-search-common@npm:^1.2.5": - version: 1.2.5 - resolution: "@backstage/plugin-search-common@npm:1.2.5" - dependencies: - "@backstage/plugin-permission-common": ^0.7.7 - "@backstage/types": ^1.1.0 - checksum: cd995f9dddf42c1e5ec94c4bb34103d58bce60174fc122c3db93f13f314064188b8903b0402c5ce21493d41660ab0221cb9e35ec97cdf3c28c3756e2c17edfe0 - languageName: node - linkType: hard - "@backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common": version: 0.0.0-use.local resolution: "@backstage/plugin-search-common@workspace:plugins/search-common" @@ -9086,6 +9086,8 @@ __metadata: "@backstage/core-app-api": "workspace:^" "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" + "@backstage/frontend-app-api": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" @@ -9122,6 +9124,7 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/plugin-search-react": "workspace:^" @@ -9218,11 +9221,12 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-sonarqube-backend@workspace:plugins/sonarqube-backend": +"@backstage/plugin-sonarqube-backend@workspace:^, @backstage/plugin-sonarqube-backend@workspace:plugins/sonarqube-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-sonarqube-backend@workspace:plugins/sonarqube-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -9522,6 +9526,7 @@ __metadata: "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 @@ -9687,7 +9692,7 @@ __metadata: js-yaml: ^4.0.0 json5: ^2.1.3 mime-types: ^2.1.27 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 p-limit: ^3.1.0 recursive-readdir: ^2.2.2 supertest: ^6.1.3 @@ -10015,7 +10020,7 @@ __metadata: "@stoplight/types": ^13.14.0 "@types/is-glob": ^4.0.2 "@types/mock-fs": ^4.13.0 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 chalk: ^4.0.0 codeowners-utils: ^1.0.2 commander: ^9.1.0 @@ -10025,7 +10030,7 @@ __metadata: js-yaml: ^4.1.0 lodash: ^4.17.21 minimatch: ^5.1.1 - mock-fs: ^5.1.0 + mock-fs: ^5.2.0 p-limit: ^3.0.2 ts-node: ^10.0.0 yaml-diff-patch: ^2.0.0 @@ -10057,51 +10062,21 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 - "@testing-library/react": ^12.1.3 - "@testing-library/user-event": ^14.0.0 "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 i18next: ^22.4.15 msw: ^1.0.0 zen-observable: ^0.10.0 peerDependencies: - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 + "@testing-library/react": ^12.1.3 || ^13.0.0 || ^14.0.0 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft -"@backstage/theme@npm:^0.2.16, @backstage/theme@npm:^0.2.18": - version: 0.2.19 - resolution: "@backstage/theme@npm:0.2.19" - dependencies: - "@material-ui/core": ^4.12.2 - peerDependencies: - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - checksum: 93ca110a3f953d6d98b4a5f2163beaa1bd1f95adb66a593e85eb523a7012acf654b6148db54008a6434805a4bd9016d67e5c6a317bc56940ee6800aecbb97d6f - languageName: node - linkType: hard - -"@backstage/theme@npm:^0.4.1": - version: 0.4.1 - resolution: "@backstage/theme@npm:0.4.1" - dependencies: - "@emotion/react": ^11.10.5 - "@emotion/styled": ^11.10.5 - "@mui/material": ^5.12.2 - peerDependencies: - "@material-ui/core": ^4.12.2 - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - checksum: eba5b177632205be97f3ef535e91a90673a89791242d7e6c07947c959459676b41fd4f912493a198955a9dc5d55b2314f81d6e7191795e16df34e940382a340d - languageName: node - linkType: hard - -"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@^0.4.2, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -10118,14 +10093,19 @@ __metadata: languageName: unknown linkType: soft -"@backstage/types@npm:^1.0.2, @backstage/types@npm:^1.1.0": - version: 1.1.0 - resolution: "@backstage/types@npm:1.1.0" - checksum: e93c3d10f151db087f611b1e25fb7a5ed5ec82cb3040c7bc3b04c058c6d8f889505310019707bf17a2bb3aa545e199de3f779914262a9eeaea73ff6ecc8e1dc8 +"@backstage/theme@npm:^0.2.16, @backstage/theme@npm:^0.2.18": + version: 0.2.19 + resolution: "@backstage/theme@npm:0.2.19" + dependencies: + "@material-ui/core": ^4.12.2 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + checksum: 93ca110a3f953d6d98b4a5f2163beaa1bd1f95adb66a593e85eb523a7012acf654b6148db54008a6434805a4bd9016d67e5c6a317bc56940ee6800aecbb97d6f languageName: node linkType: hard -"@backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/types@^1.0.2, @backstage/types@^1.1.1, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -10136,20 +10116,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@npm:^1.0.3, @backstage/version-bridge@npm:^1.0.4": - version: 1.0.4 - resolution: "@backstage/version-bridge@npm:1.0.4" - dependencies: - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: ae2511afcc9aded46d78b5b1788a4da6502f8fd21ebd305f748eab489bf09b87bebfdafa9926214777e80afd0fe36aa561060b675272becb0389c5f3c8fce007 - languageName: node - linkType: hard - -"@backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.3, @backstage/version-bridge@^1.0.5, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": version: 0.0.0-use.local resolution: "@backstage/version-bridge@workspace:packages/version-bridge" dependencies: @@ -10452,16 +10419,16 @@ __metadata: linkType: hard "@codemirror/language@npm:^6.0.0": - version: 6.9.0 - resolution: "@codemirror/language@npm:6.9.0" + version: 6.9.1 + resolution: "@codemirror/language@npm:6.9.1" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 + "@lezer/common": ^1.1.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 style-mod: ^4.0.0 - checksum: 9a897fb0f569159eeafb7dce83061b425af7244bbeae2649e0e677488548b2a02eaf0c13c0c5b4d59da55e8866e6f4dc7abe3dfaa09c13749a2fa2c0dbc0c565 + checksum: 62265f1042d2edfd3a091c408d9d0071f23889099b2f6ce8275fa910118bd2c45b8c4b29228c7be6e6d5f0e0812a522de902bc75ba8d8b2e62e42ade1692a49a languageName: node linkType: hard @@ -10516,13 +10483,13 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0": - version: 6.18.1 - resolution: "@codemirror/view@npm:6.18.1" + version: 6.21.0 + resolution: "@codemirror/view@npm:6.21.0" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.1.0 w3c-keyname: ^2.2.4 - checksum: 12e350169a12a3cca059712769f81306c95b59accce8ec3c5e6deb1f2fc570baac6f64768aa04f6337bca8448d66520417ec8a4c1c456d40324758695ed9fe90 + checksum: da49d5541b137a812e1837709130b9a4502fac71b87c45d45384116a7a2b1dab556c283abb673946ba9d044a640ab9058727b85de9b7b576c44848dfbf0ed7bb languageName: node linkType: hard @@ -10542,42 +10509,6 @@ __metadata: languageName: node linkType: hard -"@cypress/request@npm:^2.88.10": - version: 2.88.10 - resolution: "@cypress/request@npm:2.88.10" - dependencies: - aws-sign2: ~0.7.0 - aws4: ^1.8.0 - caseless: ~0.12.0 - combined-stream: ~1.0.6 - extend: ~3.0.2 - forever-agent: ~0.6.1 - form-data: ~2.3.2 - http-signature: ~1.3.6 - is-typedarray: ~1.0.0 - isstream: ~0.1.2 - json-stringify-safe: ~5.0.1 - mime-types: ~2.1.19 - performance-now: ^2.1.0 - qs: ~6.5.2 - safe-buffer: ^5.1.2 - tough-cookie: ~2.5.0 - tunnel-agent: ^0.6.0 - uuid: ^8.3.2 - checksum: 69c3e3b332e9be4866a900f6bcca5d274d8cea6c99707fbcce061de8dbab11c9b1e39f4c017f6e83e6e682717781d4f6106fd6b7cf9546580fcfac353b6676cf - languageName: node - linkType: hard - -"@cypress/xvfb@npm:^1.2.4": - version: 1.2.4 - resolution: "@cypress/xvfb@npm:1.2.4" - dependencies: - debug: ^3.1.0 - lodash.once: ^4.1.1 - checksum: 7bdcdaeb1bb692ec9d9bf8ec52538aa0bead6764753f4a067a171a511807a43fab016f7285a56bef6a606c2467ff3f1365e1ad2d2d583b81beed849ee1573fd1 - languageName: node - linkType: hard - "@dabh/diagnostics@npm:^2.0.2": version: 2.0.2 resolution: "@dabh/diagnostics@npm:2.0.2" @@ -10864,9 +10795,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/android-arm64@npm:0.19.3" +"@esbuild/android-arm64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/android-arm64@npm:0.19.4" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -10885,9 +10816,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/android-arm@npm:0.19.3" +"@esbuild/android-arm@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/android-arm@npm:0.19.4" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -10899,9 +10830,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/android-x64@npm:0.19.3" +"@esbuild/android-x64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/android-x64@npm:0.19.4" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -10913,9 +10844,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/darwin-arm64@npm:0.19.3" +"@esbuild/darwin-arm64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/darwin-arm64@npm:0.19.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -10927,9 +10858,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/darwin-x64@npm:0.19.3" +"@esbuild/darwin-x64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/darwin-x64@npm:0.19.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -10941,9 +10872,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/freebsd-arm64@npm:0.19.3" +"@esbuild/freebsd-arm64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/freebsd-arm64@npm:0.19.4" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -10955,9 +10886,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/freebsd-x64@npm:0.19.3" +"@esbuild/freebsd-x64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/freebsd-x64@npm:0.19.4" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -10969,9 +10900,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-arm64@npm:0.19.3" +"@esbuild/linux-arm64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-arm64@npm:0.19.4" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -10983,9 +10914,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-arm@npm:0.19.3" +"@esbuild/linux-arm@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-arm@npm:0.19.4" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -10997,9 +10928,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-ia32@npm:0.19.3" +"@esbuild/linux-ia32@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-ia32@npm:0.19.4" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -11018,9 +10949,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-loong64@npm:0.19.3" +"@esbuild/linux-loong64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-loong64@npm:0.19.4" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -11032,9 +10963,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-mips64el@npm:0.19.3" +"@esbuild/linux-mips64el@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-mips64el@npm:0.19.4" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -11046,9 +10977,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-ppc64@npm:0.19.3" +"@esbuild/linux-ppc64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-ppc64@npm:0.19.4" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -11060,9 +10991,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-riscv64@npm:0.19.3" +"@esbuild/linux-riscv64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-riscv64@npm:0.19.4" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -11074,9 +11005,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-s390x@npm:0.19.3" +"@esbuild/linux-s390x@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-s390x@npm:0.19.4" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -11088,9 +11019,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/linux-x64@npm:0.19.3" +"@esbuild/linux-x64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/linux-x64@npm:0.19.4" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -11102,9 +11033,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/netbsd-x64@npm:0.19.3" +"@esbuild/netbsd-x64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/netbsd-x64@npm:0.19.4" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -11116,9 +11047,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/openbsd-x64@npm:0.19.3" +"@esbuild/openbsd-x64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/openbsd-x64@npm:0.19.4" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -11130,9 +11061,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/sunos-x64@npm:0.19.3" +"@esbuild/sunos-x64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/sunos-x64@npm:0.19.4" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -11144,9 +11075,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/win32-arm64@npm:0.19.3" +"@esbuild/win32-arm64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/win32-arm64@npm:0.19.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -11158,9 +11089,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/win32-ia32@npm:0.19.3" +"@esbuild/win32-ia32@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/win32-ia32@npm:0.19.4" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -11172,9 +11103,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.3": - version: 0.19.3 - resolution: "@esbuild/win32-x64@npm:0.19.3" +"@esbuild/win32-x64@npm:0.19.4": + version: 0.19.4 + resolution: "@esbuild/win32-x64@npm:0.19.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -11271,41 +11202,41 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.4.1": - version: 1.4.1 - resolution: "@floating-ui/core@npm:1.4.1" +"@floating-ui/core@npm:^1.4.2": + version: 1.5.0 + resolution: "@floating-ui/core@npm:1.5.0" dependencies: - "@floating-ui/utils": ^0.1.1 - checksum: be4ab864fe17eeba5e205bd554c264b9a4895a57c573661bbf638357fa3108677fed7ba3269ec15b4da90e29274c9b626d5a15414e8d1fe691e210d02a03695c + "@floating-ui/utils": ^0.1.3 + checksum: 54b4fe26b3c228746ac5589f97303abf158b80aa5f8b99027259decd68d1c2030c4c637648ebd33dfe78a4212699453bc2bd7537fd5a594d3bd3e63d362f666f languageName: node linkType: hard -"@floating-ui/dom@npm:^1.3.0": - version: 1.5.1 - resolution: "@floating-ui/dom@npm:1.5.1" +"@floating-ui/dom@npm:^1.5.1": + version: 1.5.3 + resolution: "@floating-ui/dom@npm:1.5.3" dependencies: - "@floating-ui/core": ^1.4.1 - "@floating-ui/utils": ^0.1.1 - checksum: ddb509030978536ba7b321cf8c764ae9d0142a3b1fefb7e6bc050a5de7e825e12131fa5089009edabf7c125fb274886da211a5220fe17a71d875a7a96eb1386c + "@floating-ui/core": ^1.4.2 + "@floating-ui/utils": ^0.1.3 + checksum: 00053742064aac70957f0bd5c1542caafb3bfe9716588bfe1d409fef72a67ed5e60450d08eb492a77f78c22ed1ce4f7955873cc72bf9f9caf2b0f43ae3561c21 languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.1": - version: 2.0.1 - resolution: "@floating-ui/react-dom@npm:2.0.1" +"@floating-ui/react-dom@npm:^2.0.2": + version: 2.0.2 + resolution: "@floating-ui/react-dom@npm:2.0.2" dependencies: - "@floating-ui/dom": ^1.3.0 + "@floating-ui/dom": ^1.5.1 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 00fef2cf69ac2b15952e47505fd9e23f6cc5c20a26adc707862932826d1682f3c30f83c9887abfc93574fdca2d34dd2fc00271527318b1db403549cd6bc9eb00 + checksum: 4797e1f7a19c1e531ed0d578ccdcbe58970743e5a480ba30424857fc953063f36d481f8c5d69248a8f1d521b739e94bf5e1ffb35506400dea3d914f166ed2f7f languageName: node linkType: hard -"@floating-ui/utils@npm:^0.1.1": - version: 0.1.1 - resolution: "@floating-ui/utils@npm:0.1.1" - checksum: 548acdda7902f45b0afbe34e2e7f4cbff0696b95bad8c039f80936519de24ef2ec20e79902825b7815294b37f51a7c52ee86288b0688869a57cc229a164d86b4 +"@floating-ui/utils@npm:^0.1.3": + version: 0.1.4 + resolution: "@floating-ui/utils@npm:0.1.4" + checksum: e6195ded5b3a6fd38411a833605184c31f24609b08feab2615e90ccc063bf4d3965383d817642fc7e8ca5ab6a54c29c71103e874f3afb0518595c8bd3390ba16 languageName: node linkType: hard @@ -11318,30 +11249,6 @@ __metadata: languageName: node linkType: hard -"@frsource/base64@npm:1.0.17": - version: 1.0.17 - resolution: "@frsource/base64@npm:1.0.17" - checksum: a01689ef785516ff0b7460f55792685fc782f8507518768396acb9283270d50a8149774f3acd5fa690ccd5a48b5ec4ace90a491458ffdd9e9f591c6b23eb5da5 - languageName: node - linkType: hard - -"@frsource/cypress-plugin-visual-regression-diff@npm:^3.2.8": - version: 3.3.10 - resolution: "@frsource/cypress-plugin-visual-regression-diff@npm:3.3.10" - dependencies: - "@frsource/base64": 1.0.17 - glob: 8.1.0 - meta-png: 1.0.6 - move-file: 2.1.0 - pixelmatch: 5.3.0 - pngjs: 7.0.0 - sharp: 0.32.1 - peerDependencies: - cypress: ">=4.5.0" - checksum: 879954ecba8829fd870379a1f4150a511fceab4c5a5c3df8abbab54e655e6560d52d925109364ea7f2d3484467ed5e9c3e4cfaf0058c12bbfbfc21d76ed79b40 - languageName: node - linkType: hard - "@gar/promisify@npm:^1.0.1, @gar/promisify@npm:^1.1.3": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" @@ -12285,22 +12192,6 @@ __metadata: languageName: node linkType: hard -"@hapi/hoek@npm:^9.0.0": - version: 9.0.4 - resolution: "@hapi/hoek@npm:9.0.4" - checksum: a5503ebaad5407e0c99d0656b0bbc3e9ccac9eddc9b9f66e0358a2da9a9dd173c63c9f7c5e46504a05e1fc41d853e9a19617e258d4fcbe1a4be7f9e61da83920 - languageName: node - linkType: hard - -"@hapi/topo@npm:^5.0.0": - version: 5.0.0 - resolution: "@hapi/topo@npm:5.0.0" - dependencies: - "@hapi/hoek": ^9.0.0 - checksum: 8aa81f71696f88d7daeab4547e120e43c6ab78081a4f215eec5103dd858f3122a703512cdacc43aa7e27d99607345165acfeb2ee69e556e63afd50c5c57a36c3 - languageName: node - linkType: hard - "@humanwhocodes/config-array@npm:^0.11.11": version: 0.11.11 resolution: "@humanwhocodes/config-array@npm:0.11.11" @@ -12348,20 +12239,6 @@ __metadata: languageName: node linkType: hard -"@internal/plugin-catalog-customized@workspace:^, @internal/plugin-catalog-customized@workspace:plugins/catalog-customized": - version: 0.0.0-use.local - resolution: "@internal/plugin-catalog-customized@workspace:plugins/catalog-customized" - dependencies: - "@backstage/plugin-catalog": "workspace:^" - "@backstage/plugin-catalog-react": "workspace:^" - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@internal/plugin-todo-list-backend@workspace:plugins/example-todo-list-backend": version: 0.0.0-use.local resolution: "@internal/plugin-todo-list-backend@workspace:plugins/example-todo-list-backend" @@ -12888,11 +12765,11 @@ __metadata: linkType: hard "@keyv/redis@npm:^2.5.3": - version: 2.7.0 - resolution: "@keyv/redis@npm:2.7.0" + version: 2.7.1 + resolution: "@keyv/redis@npm:2.7.1" dependencies: ioredis: ^5.3.2 - checksum: 2bf16d99f54fa5177c375eb170f46076715e6a17fd65840d10638e441af8a4dd065927a18b45abb9531746ddab54f865884347c80f7e188c981a40f8245269ab + checksum: 917547d9f6a3af2d0c355c9c78cac9392a8f3d7f2cc379d42ae158189da346cf0c831708cbb530496fda91dfeb4be2bad207ce154ef2205c2b8ce48b2e43a0fc languageName: node linkType: hard @@ -12958,6 +12835,32 @@ __metadata: languageName: node linkType: hard +"@kubernetes/client-node@npm:^0.19.0": + version: 0.19.0 + resolution: "@kubernetes/client-node@npm:0.19.0" + dependencies: + "@types/js-yaml": ^4.0.1 + "@types/node": ^20.1.1 + "@types/request": ^2.47.1 + "@types/ws": ^8.5.3 + byline: ^5.0.0 + isomorphic-ws: ^5.0.0 + js-yaml: ^4.1.0 + jsonpath-plus: ^7.2.0 + openid-client: ^5.3.0 + request: ^2.88.0 + rfc4648: ^1.3.0 + stream-buffers: ^3.0.2 + tar: ^6.1.11 + tslib: ^2.4.1 + ws: ^8.11.0 + dependenciesMeta: + openid-client: + optional: true + checksum: d29ccfb562ac51a81f74de570eb832d150be6b73ba887ae1be682df9a34c3ab846d4d4ba74f0a9f0e0ce4da573f949ba712115e1d0513148cdf683a22d729e7f + languageName: node + linkType: hard + "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.3 resolution: "@leichtgewicht/ip-codec@npm:2.0.3" @@ -12965,10 +12868,10 @@ __metadata: languageName: node linkType: hard -"@lezer/common@npm:^1.0.0": - version: 1.0.0 - resolution: "@lezer/common@npm:1.0.0" - checksum: 0ba652b39f9ff073a6a8a3376a74279f2c2d2ccdd4d2bb57c7b607341dbdbf64baf9c23a196314f09349d175623bc73a6a0b6a0eeb2cc63f3a1190fd631f7c31 +"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.1.0": + version: 1.1.0 + resolution: "@lezer/common@npm:1.1.0" + checksum: 93c208a44d1c0bdf7407853ba7c4ddcedf1c52d1b82170813d83b9bd6301aa23587405ac54332fe39ce8bc37f706936ab237ceb4d3d535d1dead650153b6474c languageName: node linkType: hard @@ -13131,7 +13034,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/icons@npm:^4.11.2, @material-ui/icons@npm:^4.9.1": +"@material-ui/icons@npm:^4.11.2, @material-ui/icons@npm:^4.11.3, @material-ui/icons@npm:^4.9.1": version: 4.11.3 resolution: "@material-ui/icons@npm:4.11.3" dependencies: @@ -13190,7 +13093,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/lab@npm:4.0.0-alpha.61, @material-ui/lab@npm:^4.0.0-alpha.57, @material-ui/lab@npm:^4.0.0-alpha.60": +"@material-ui/lab@npm:4.0.0-alpha.61, @material-ui/lab@npm:^4.0.0-alpha.57, @material-ui/lab@npm:^4.0.0-alpha.60, @material-ui/lab@npm:^4.0.0-alpha.61": version: 4.0.0-alpha.61 resolution: "@material-ui/lab@npm:4.0.0-alpha.61" dependencies: @@ -13459,19 +13362,17 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.14": - version: 5.0.0-beta.14 - resolution: "@mui/base@npm:5.0.0-beta.14" +"@mui/base@npm:5.0.0-beta.17": + version: 5.0.0-beta.17 + resolution: "@mui/base@npm:5.0.0-beta.17" dependencies: - "@babel/runtime": ^7.22.10 - "@emotion/is-prop-valid": ^1.2.1 - "@floating-ui/react-dom": ^2.0.1 + "@babel/runtime": ^7.22.15 + "@floating-ui/react-dom": ^2.0.2 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.8 + "@mui/utils": ^5.14.11 "@popperjs/core": ^2.11.8 clsx: ^2.0.0 prop-types: ^15.8.1 - react-is: ^18.2.0 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -13479,27 +13380,27 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 3e5c980edb285d4fbf1f9f6c08b237a502e6c444222e0165e98e4e25787de7663d6905536b8e8a7a0888571daaa75fcad01534c8f8ea8ba30451cad82d1b85cc + checksum: 96ffb85864fc796783514e089c0011ebcc5174705082dc98197ab035dfb287427069c0338e662a4680951849dfbe7a5231f4f6f2aee710af05c07e8578f93310 languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/core-downloads-tracker@npm:5.14.8" - checksum: b8322994d7c05426008c3426f7ce4bb0a1dfd633429af704cc9e164655007fc446ba21bf6b00af8fa1b9a9cb4c1757d72c7554e13cceadc575af7d44344da38c +"@mui/core-downloads-tracker@npm:^5.14.11": + version: 5.14.11 + resolution: "@mui/core-downloads-tracker@npm:5.14.11" + checksum: f3e7594c93d4cf5e3649336eef2b57842c171f3deb6890c03be7eccb88d3ac276aac1ab3ad409d124d16468314018778e2dbb92a62ac34c7f44b2813c47f29fb languageName: node linkType: hard "@mui/material@npm:^5.12.2": - version: 5.14.8 - resolution: "@mui/material@npm:5.14.8" + version: 5.14.11 + resolution: "@mui/material@npm:5.14.11" dependencies: - "@babel/runtime": ^7.22.10 - "@mui/base": 5.0.0-beta.14 - "@mui/core-downloads-tracker": ^5.14.8 - "@mui/system": ^5.14.8 + "@babel/runtime": ^7.22.15 + "@mui/base": 5.0.0-beta.17 + "@mui/core-downloads-tracker": ^5.14.11 + "@mui/system": ^5.14.11 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.8 + "@mui/utils": ^5.14.11 "@types/react-transition-group": ^4.4.6 clsx: ^2.0.0 csstype: ^3.1.2 @@ -13519,16 +13420,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 2db4eceb6a2b51e2f429082206b5c4194f894bc6831cf5348d301b910e5e2b1a62565cad00a244100434899307c20134832ab2e85dd56bef4dd210d87496e136 + checksum: 350d642773d4b19d5b9deac956203dafe89cd005ba8cd6017d1ab0e97ba45ca230050249f34a17f0f00efe466162d47487f160159bebe3e52af1b34dd28579d0 languageName: node linkType: hard -"@mui/private-theming@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/private-theming@npm:5.14.8" +"@mui/private-theming@npm:^5.14.11": + version: 5.14.11 + resolution: "@mui/private-theming@npm:5.14.11" dependencies: - "@babel/runtime": ^7.22.10 - "@mui/utils": ^5.14.8 + "@babel/runtime": ^7.22.15 + "@mui/utils": ^5.14.11 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -13536,15 +13437,15 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 3d8c4b768ee81d03c739acfa7d99450423b9267a1a2219171f247b1823350426452514f0cc646f4d48f113db396b5488c48132fe54a5db8646e101514b764d96 + checksum: a5d461ae9679b1f3b79f529c51c055e03d84421812bb12110d735fbc5528ae188900488b32aa1b860cb978ac6dd0cb9f54a10e2ff214e853e969ef5c1ed87e84 languageName: node linkType: hard -"@mui/styled-engine@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/styled-engine@npm:5.14.8" +"@mui/styled-engine@npm:^5.14.11": + version: 5.14.11 + resolution: "@mui/styled-engine@npm:5.14.11" dependencies: - "@babel/runtime": ^7.22.10 + "@babel/runtime": ^7.22.15 "@emotion/cache": ^11.11.0 csstype: ^3.1.2 prop-types: ^15.8.1 @@ -13557,19 +13458,19 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 12d626a42fa15cc315172775a076cf6f71afc999123bd290cbda3855de8c607f8fbf0a3daa7a391e67a83ad824c6e7eb21e57121a448a527b3bf9b494a7bd852 + checksum: 0a593f967ab56c32c611eae4a83bc23c4ab3a8931e76a6e553ed18230c2f4e9e912d519fe2f0a24970ff154c198634903f134eb54f00ceebde138a73b953622f languageName: node linkType: hard -"@mui/system@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/system@npm:5.14.8" +"@mui/system@npm:^5.14.11": + version: 5.14.11 + resolution: "@mui/system@npm:5.14.11" dependencies: - "@babel/runtime": ^7.22.10 - "@mui/private-theming": ^5.14.8 - "@mui/styled-engine": ^5.14.8 + "@babel/runtime": ^7.22.15 + "@mui/private-theming": ^5.14.11 + "@mui/styled-engine": ^5.14.11 "@mui/types": ^7.2.4 - "@mui/utils": ^5.14.8 + "@mui/utils": ^5.14.11 clsx: ^2.0.0 csstype: ^3.1.2 prop-types: ^15.8.1 @@ -13585,7 +13486,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: d630b4253caa971ad0bcb35cef1165ff689bfcadb806eb3b26eddce4d6c1bcdeb9781ccaea87f9950bff308ac302514766880f63c4bbdcdf28619f66d974797c + checksum: c3d0e1a09a9638663a6467452a7725593e9de6f9620e199add1080db42a7affaca39f52a1b6a52fb75d708f3e30336946babb2a8d1d43fab81c6a1fe3e420b21 languageName: node linkType: hard @@ -13601,18 +13502,21 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.14.8": - version: 5.14.8 - resolution: "@mui/utils@npm:5.14.8" +"@mui/utils@npm:^5.14.11": + version: 5.14.11 + resolution: "@mui/utils@npm:5.14.11" dependencies: - "@babel/runtime": ^7.22.10 + "@babel/runtime": ^7.22.15 "@types/prop-types": ^15.7.5 - "@types/react-is": ^18.2.1 prop-types: ^15.8.1 react-is: ^18.2.0 peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 - checksum: 2fb29c9d7908a47276b4f4a31a7e76d5a7d437afe95d2c0d6cd9c07f04beea89857f763c4f5c546fe243539d9986181815bfded42e516077122ed373d11a7ebf + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 84e640dea3589ea7edb7d8f33748d83d561d4ef413c4d3e2216ddf9c0842d8b04d162e3fa5ea59f03846934f17fb446ed8464e318dd4e2e299e3b44b06637d76 languageName: node linkType: hard @@ -14542,6 +14446,17 @@ __metadata: languageName: node linkType: hard +"@playwright/test@npm:^1.32.3": + version: 1.38.1 + resolution: "@playwright/test@npm:1.38.1" + dependencies: + playwright: 1.38.1 + bin: + playwright: cli.js + checksum: c5ec0b23261fe1ef163b6234f69263bc10e7e5a3fb676c7773ffc70b87459a7ab225f57c03b9de649475771638a04c2e00d9b2739304a4dcf5d3edf20a7a4a82 + languageName: node + linkType: hard + "@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.7": version: 0.5.11 resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.11" @@ -14737,22 +14652,6 @@ __metadata: languageName: node linkType: hard -"@rjsf/core-v5@npm:@rjsf/core@5.7.3": - version: 5.7.3 - resolution: "@rjsf/core@npm:5.7.3" - dependencies: - lodash: ^4.17.21 - lodash-es: ^4.17.21 - markdown-to-jsx: ^7.2.0 - nanoid: ^3.3.6 - prop-types: ^15.8.1 - peerDependencies: - "@rjsf/utils": 5.7.x - react: ^16.14.0 || >=17 - checksum: bdae474fd0a6d4d8fd625ef74384a90624860841e1426b516358365a960d5627a98a1a159a6ddc59cc84659dd768ac7bba126d459c83c4f1d78acd8ad8d98f19 - languageName: node - linkType: hard - "@rjsf/core@npm:^3.2.1": version: 3.2.1 resolution: "@rjsf/core@npm:3.2.1" @@ -14785,19 +14684,6 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.7.3": - version: 5.7.3 - resolution: "@rjsf/material-ui@npm:5.7.3" - peerDependencies: - "@material-ui/core": ^4.12.3 - "@material-ui/icons": ^4.11.2 - "@rjsf/core": 5.7.x - "@rjsf/utils": 5.7.x - react: ^16.14.0 || >=17 - checksum: 96ff2a0227b6810efd8b9e36e7e956f1e753c9cecd78215e79e9487af6276da70ee25b8c9d4678241afb85cf5ade31c3591d39659cdeda3cd52ccb6a1ada1d17 - languageName: node - linkType: hard - "@rjsf/material-ui@npm:^3.2.1": version: 3.2.1 resolution: "@rjsf/material-ui@npm:3.2.1" @@ -14825,21 +14711,6 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:5.7.3": - version: 5.7.3 - resolution: "@rjsf/utils@npm:5.7.3" - dependencies: - json-schema-merge-allof: ^0.8.1 - jsonpointer: ^5.0.1 - lodash: ^4.17.21 - lodash-es: ^4.17.21 - react-is: ^18.2.0 - peerDependencies: - react: ^16.14.0 || >=17 - checksum: 30ceab80a98a33076eef3c680d079ca90bb7023d40524776fa6cce79f0dc21a5eeaec63fa786e3775b60ccee27f993d030b340d6704c3c4d23515f9d046d4354 - languageName: node - linkType: hard - "@rjsf/validator-ajv8@npm:5.13.0": version: 5.13.0 resolution: "@rjsf/validator-ajv8@npm:5.13.0" @@ -14854,29 +14725,15 @@ __metadata: languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.7.3": - version: 5.7.3 - resolution: "@rjsf/validator-ajv8@npm:5.7.3" - dependencies: - ajv: ^8.12.0 - ajv-formats: ^2.1.1 - lodash: ^4.17.21 - lodash-es: ^4.17.21 - peerDependencies: - "@rjsf/utils": 5.7.x - checksum: 0b2ab4bf718c761a8b990f4a3894ad10af2f3d473c425dd4fdf2f1bec6d15a363ac9a012215f0cc4d9fecb0a6cf12bc4e13fd20fa782975e5c0b1e254ef8939e - languageName: node - linkType: hard - "@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": - version: 2.1.14 - resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.14" + version: 2.1.15 + resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.15" dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/plugin-catalog-react": ^1.8.3 - "@backstage/theme": ^0.4.1 + "@backstage/catalog-model": ^1.4.2 + "@backstage/core-components": ^0.13.5 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/plugin-catalog-react": ^1.8.4 + "@backstage/theme": ^0.4.2 "@material-ui/core": ^4.12.1 "@material-ui/icons": ^4.11.2 "@material-ui/lab": 4.0.0-alpha.57 @@ -14888,20 +14745,20 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 938fa38d6199a1c5199eb47851ddc0edb2f0d3064fa189baf104ff820096700cb95843c499353efc77b10c1fc721aa2a32b0146c1d3df1bea31f5af61dfd250b + checksum: 421a3e444b6c5945748d0842bc777efc9fe0e968dad3c59cdc0cbbcd841752bcf47d757f2fc307fa1245da884adfeb3e478cd23b2bb318f621e05ffa7c6ec21b languageName: node linkType: hard "@roadiehq/backstage-plugin-github-insights@npm:^2.0.5": - version: 2.3.20 - resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.20" + version: 2.3.21 + resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.21" dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/integration-react": ^1.1.18 - "@backstage/plugin-catalog-react": ^1.8.3 - "@backstage/theme": ^0.4.1 + "@backstage/catalog-model": ^1.4.2 + "@backstage/core-components": ^0.13.5 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/integration-react": ^1.1.19 + "@backstage/plugin-catalog-react": ^1.8.4 + "@backstage/theme": ^0.4.2 "@date-io/core": 2.10.7 "@material-ui/core": ^4.11.0 "@material-ui/icons": ^4.9.1 @@ -14916,19 +14773,19 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 187483c88f7a34757cb9cc6b9bac343bfd1853e634957f71049fe448b03a1e631456f1bc31be3aa91c41976a812ae24e522fc374faf33507e3db80fc1e54cdd2 + checksum: edb0ecee1778e0bacd1eff395aa723fef35338253a7f8e91ab93b5755b9ebac27e49e1768ee13163ade74edf0b0f620ab31b693674c746c3c1e35e1185f46636 languageName: node linkType: hard "@roadiehq/backstage-plugin-github-pull-requests@npm:^2.2.7": - version: 2.5.15 - resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.15" + version: 2.5.16 + resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.16" dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/plugin-catalog-react": ^1.8.3 - "@backstage/plugin-home": ^0.5.7 + "@backstage/catalog-model": ^1.4.2 + "@backstage/core-components": ^0.13.5 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/plugin-catalog-react": ^1.8.4 + "@backstage/plugin-home": ^0.5.8 "@material-ui/core": ^4.11.0 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.60 @@ -14945,19 +14802,19 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 3332a560f8741536ab12ff1e14567e739aa6f60767d8eb0a2e5b9873b54947b0cdaac7c44cb5bb3156dc8b2a7d88d33ee20191c8920bfe8f67b87857dfda2780 + checksum: cb35e64d4df6f81829cd238e3b06b84453ad9231a30a0a4698ebb9d408445af0bfeb59d27bcc5d818013735f2f4d44a89ff9824258ff1565274c524c3ae905cc languageName: node linkType: hard "@roadiehq/backstage-plugin-travis-ci@npm:^2.0.5": - version: 2.1.14 - resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.14" + version: 2.1.15 + resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.15" dependencies: - "@backstage/catalog-model": ^1.4.1 - "@backstage/core-components": ^0.13.4 - "@backstage/core-plugin-api": ^1.5.3 - "@backstage/plugin-catalog-react": ^1.8.3 - "@backstage/theme": ^0.4.1 + "@backstage/catalog-model": ^1.4.2 + "@backstage/core-components": ^0.13.5 + "@backstage/core-plugin-api": ^1.6.0 + "@backstage/plugin-catalog-react": ^1.8.4 + "@backstage/theme": ^0.4.2 "@material-ui/core": ^4.11.3 "@material-ui/icons": ^4.11.2 "@material-ui/lab": 4.0.0-alpha.57 @@ -14971,7 +14828,7 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: f6e297460aa2dccd3ac5b639838a253017229ecf6ec03541702ccb33f93ec15327894e35f7dfa565bc58c137abfd94129a858d43b2b861283370a003b2685dda + checksum: f285fa074049bb1d03adc3e04467a3700c3651550fc3304038c9169438e1bd3e12790309be9a86cfb76a97f53925165d6b91ab4d81985ce5bb2faa97e5b10b00 languageName: node linkType: hard @@ -15158,29 +15015,6 @@ __metadata: languageName: node linkType: hard -"@sideway/address@npm:^4.1.3": - version: 4.1.4 - resolution: "@sideway/address@npm:4.1.4" - dependencies: - "@hapi/hoek": ^9.0.0 - checksum: b9fca2a93ac2c975ba12e0a6d97853832fb1f4fb02393015e012b47fa916a75ca95102d77214b2a29a2784740df2407951af8c5dde054824c65577fd293c4cdb - languageName: node - linkType: hard - -"@sideway/formula@npm:^3.0.0": - version: 3.0.1 - resolution: "@sideway/formula@npm:3.0.1" - checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a - languageName: node - linkType: hard - -"@sideway/pinpoint@npm:^2.0.0": - version: 2.0.0 - resolution: "@sideway/pinpoint@npm:2.0.0" - checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 - languageName: node - linkType: hard - "@sinclair/typebox@npm:^0.24.1": version: 0.24.42 resolution: "@sinclair/typebox@npm:0.24.42" @@ -16656,91 +16490,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-darwin-arm64@npm:1.3.84" +"@swc/core-darwin-arm64@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-darwin-arm64@npm:1.3.90" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-darwin-x64@npm:1.3.84" +"@swc/core-darwin-x64@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-darwin-x64@npm:1.3.90" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.84" +"@swc/core-linux-arm-gnueabihf@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.90" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.84" +"@swc/core-linux-arm64-gnu@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.90" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.84" +"@swc/core-linux-arm64-musl@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.90" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.84" +"@swc/core-linux-x64-gnu@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.90" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-linux-x64-musl@npm:1.3.84" +"@swc/core-linux-x64-musl@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-linux-x64-musl@npm:1.3.90" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.84" +"@swc/core-win32-arm64-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.90" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.84" +"@swc/core-win32-ia32-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.90" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.84": - version: 1.3.84 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.84" +"@swc/core-win32-x64-msvc@npm:1.3.90": + version: 1.3.90 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.90" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.84 - resolution: "@swc/core@npm:1.3.84" + version: 1.3.90 + resolution: "@swc/core@npm:1.3.90" dependencies: - "@swc/core-darwin-arm64": 1.3.84 - "@swc/core-darwin-x64": 1.3.84 - "@swc/core-linux-arm-gnueabihf": 1.3.84 - "@swc/core-linux-arm64-gnu": 1.3.84 - "@swc/core-linux-arm64-musl": 1.3.84 - "@swc/core-linux-x64-gnu": 1.3.84 - "@swc/core-linux-x64-musl": 1.3.84 - "@swc/core-win32-arm64-msvc": 1.3.84 - "@swc/core-win32-ia32-msvc": 1.3.84 - "@swc/core-win32-x64-msvc": 1.3.84 - "@swc/types": ^0.1.4 + "@swc/core-darwin-arm64": 1.3.90 + "@swc/core-darwin-x64": 1.3.90 + "@swc/core-linux-arm-gnueabihf": 1.3.90 + "@swc/core-linux-arm64-gnu": 1.3.90 + "@swc/core-linux-arm64-musl": 1.3.90 + "@swc/core-linux-x64-gnu": 1.3.90 + "@swc/core-linux-x64-musl": 1.3.90 + "@swc/core-win32-arm64-msvc": 1.3.90 + "@swc/core-win32-ia32-msvc": 1.3.90 + "@swc/core-win32-x64-msvc": 1.3.90 + "@swc/counter": ^0.1.1 + "@swc/types": ^0.1.5 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -16767,7 +16602,14 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: dee45823923c29dde579ed1121c4392c937826d575c87f62399ba7a0b27cacfeb05da97b65cf49a721a50127bb1e22ca5c07defa784ec2a47fed33e3498ef1b9 + checksum: f8ced5187068dc73445c135065c6492f0ac559d0f7720c2482aa9663c87bd015f3d2abef6ee7b2f817280a5e8dd0946c59cce7e1499180644fbc948a9e3823ab + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.1": + version: 0.1.1 + resolution: "@swc/counter@npm:0.1.1" + checksum: bb974babd493ba01c0d4a95ab610c3fc15fbf609c08cb0342798e485f57ecc0950abbf84e07124e63c5fe610b492d9a8dd03701d3b9ef7329d9e8bf3cc44980f languageName: node linkType: hard @@ -16792,10 +16634,10 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:^0.1.4": - version: 0.1.4 - resolution: "@swc/types@npm:0.1.4" - checksum: 9b09de7dca8e4b19bfb43f9e332c771855158cb761d26000807fe858447ecbc5342a6c257b26d9aa5497f7138fc58913693e2bee222e5042e0e8f57c2979ae66 +"@swc/types@npm:^0.1.5": + version: 0.1.5 + resolution: "@swc/types@npm:0.1.5" + checksum: 6aee11f62d3d805a64848e0bd5f0e0e615f958e327a9e1260056c368d7d28764d89e38bd8005a536c9bf18afbcd303edd84099d60df34a2975d62540f61df13b languageName: node linkType: hard @@ -16844,16 +16686,14 @@ __metadata: "@backstage/cli-common": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-techdocs-node": "workspace:^" - "@frsource/cypress-plugin-visual-regression-diff": ^3.2.8 "@types/commander": ^2.12.2 "@types/dockerode": ^3.3.0 "@types/fs-extra": ^9.0.6 "@types/http-proxy": ^1.17.4 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/serve-handler": ^6.1.0 "@types/webpack-env": ^1.15.3 commander: ^9.1.0 - cypress: ^10.0.0 dockerode: ^3.3.1 find-process: ^1.4.5 fs-extra: ^10.0.1 @@ -16870,19 +16710,7 @@ __metadata: languageName: unknown linkType: soft -"@testing-library/cypress@npm:^9.0.0": - version: 9.0.0 - resolution: "@testing-library/cypress@npm:9.0.0" - dependencies: - "@babel/runtime": ^7.14.6 - "@testing-library/dom": ^8.1.0 - peerDependencies: - cypress: ^12.0.0 - checksum: fbd24e8f0b8a60279b336de5f6bc0e7ad6fb31316eacab5128dacc7fccde1eb40935b90f2c3bddc7d814115fe3965c6dbf011785448cd15b5a5b0bc40ef5bb4c - languageName: node - linkType: hard - -"@testing-library/dom@npm:^8.0.0, @testing-library/dom@npm:^8.1.0": +"@testing-library/dom@npm:^8.0.0": version: 8.20.1 resolution: "@testing-library/dom@npm:8.20.1" dependencies: @@ -17050,11 +16878,11 @@ __metadata: linkType: hard "@types/archiver@npm:^5.1.0, @types/archiver@npm:^5.3.1": - version: 5.3.2 - resolution: "@types/archiver@npm:5.3.2" + version: 5.3.3 + resolution: "@types/archiver@npm:5.3.3" dependencies: "@types/readdir-glob": "*" - checksum: 9db5b4fdc1740fa07d08340ed827598cc6eda97406ac18a06a158670c7124d4120650a3b9cd660e9e39b42f033cf8f052566da32681e8ad91163473df88a3c4c + checksum: e660465ac9a622570ddbad86a306c7234c3272cb28eafe9c3ad7229f06e499dfadae9f0cb0caf41443318eea559b75ef662ea276ae64f19695e72018dae37ee7 languageName: node linkType: hard @@ -17080,11 +16908,11 @@ __metadata: linkType: hard "@types/aws4@npm:^1.5.1": - version: 1.11.3 - resolution: "@types/aws4@npm:1.11.3" + version: 1.11.4 + resolution: "@types/aws4@npm:1.11.4" dependencies: "@types/node": "*" - checksum: 4c10ca4d7de26e031e81fd67387df51323ebea81c441330a5a733f4bace854d61b8e880ea8fbe3678f2e6e081d510cbc6b623864646519fbb4ab130a8b138a46 + checksum: 8b2576843488b31fdb080369eaff6af539ded60feab4eeeb429481ec0c209c0a7a8d7011747eb71e1b2bc86a455b105dd91fe86add5c2aa1584b6f4821fbf0e7 languageName: node linkType: hard @@ -17130,34 +16958,34 @@ __metadata: linkType: hard "@types/base64-stream@npm:^1.0.2": - version: 1.0.2 - resolution: "@types/base64-stream@npm:1.0.2" + version: 1.0.3 + resolution: "@types/base64-stream@npm:1.0.3" dependencies: "@types/node": "*" - checksum: 4cba1a7dedfb8bef8517a8c9ba47672835342e075de50e9cd00ea52985cb882afa85170756a6983796326c026f62253bbcf4401a25c5ca461b4783194ace2bb5 + checksum: 4c0328ad7540d57e0f7ddf0135941adc0d1902e6b0f5d6f93537b417d82ae8f996389e14269c67e7c29f9eb6fc717f2f47ffa3f7e35f9a8096e84c3ee7b9853f languageName: node linkType: hard "@types/body-parser-xml@npm:^2.0.2": - version: 2.0.2 - resolution: "@types/body-parser-xml@npm:2.0.2" + version: 2.0.3 + resolution: "@types/body-parser-xml@npm:2.0.3" dependencies: "@types/body-parser": "*" "@types/connect": "*" "@types/express-serve-static-core": "*" "@types/node": "*" "@types/xml2js": "*" - checksum: ddac93399bc85b7402193004954215b9152374cd3e0e54e6f500ea71e8bf962ff091300a265551832c863e63539af1a2d9483838073ff43362d0bdf867802a50 + checksum: 96b8067706b5709b88a2fa20563742363c7b81bf17007bcbbd54536e83d29ca2cfe104a742bd14070a99a2772026b8d595e283cf6a4b87f7ca47390a5a95dc31 languageName: node linkType: hard "@types/body-parser@npm:*, @types/body-parser@npm:^1.19.0": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" + version: 1.19.3 + resolution: "@types/body-parser@npm:1.19.3" dependencies: "@types/connect": "*" "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + checksum: 932fa71437c275023799123680ef26ffd90efd37f51a1abe405e6ae6e5b4ad9511b7a3a8f5a12877ed1444a02b6286c0a137a98e914b3c61932390c83643cc2c languageName: node linkType: hard @@ -17379,9 +17207,9 @@ __metadata: linkType: hard "@types/d3-force@npm:^3.0.0": - version: 3.0.5 - resolution: "@types/d3-force@npm:3.0.5" - checksum: 09aa0e999841f69b34296fa92273b5b251c50f74c1b7ec2bdef7a3a7fd2d756467e4ede7cc0dcfc4151c04bde0f3feaa48d9b669c38620fb51cee2d7faa01e24 + version: 3.0.6 + resolution: "@types/d3-force@npm:3.0.6" + checksum: 092d7a4efc1bef06de4a087e1bdb609e21588429ba2ce978785bb13e1ed7371dd08692408379d9582e03ed945c6cf117dff3b3ed1dd2141d94aac9e12994498d languageName: node linkType: hard @@ -17418,27 +17246,27 @@ __metadata: linkType: hard "@types/d3-selection@npm:*, @types/d3-selection@npm:^3.0.1": - version: 3.0.6 - resolution: "@types/d3-selection@npm:3.0.6" - checksum: 01f9f3a41b98280947109911bcc6ebffff5c8c3e617695979c04ef9beef445a8cdc48a9fbdb3c9cff45a7345e83e8a5d6b346d7ceedca6ebc11dfd9717dbff6b + version: 3.0.7 + resolution: "@types/d3-selection@npm:3.0.7" + checksum: 715a0c7a78732650ae70b3487b3b6432b063482c1937bcd52c8b7a201563103170fdaa1f8c0ace882062521ac009f07fefb41198c8c43c5d3c518f8368c459d6 languageName: node linkType: hard "@types/d3-shape@npm:^1": - version: 1.3.8 - resolution: "@types/d3-shape@npm:1.3.8" + version: 1.3.9 + resolution: "@types/d3-shape@npm:1.3.9" dependencies: "@types/d3-path": ^1 - checksum: a7f78a3f0be1215b512efb636ba381768ab4104ef9b72b7fcc2ab9810e7d6fc2ee062f3103ef99236f4462deabac60d2fd96375315ec7ad33278757918c94592 + checksum: a4df0c09df4f97a017fbb229a096af6e25fe84e331dfb8c9b1f248a7f3df6f07c871879fabb31050cbec78f34127397a8134a16f2a2359ff681ec846cf886754 languageName: node linkType: hard "@types/d3-shape@npm:^3.0.1, @types/d3-shape@npm:^3.1.0": - version: 3.1.2 - resolution: "@types/d3-shape@npm:3.1.2" + version: 3.1.3 + resolution: "@types/d3-shape@npm:3.1.3" dependencies: "@types/d3-path": "*" - checksum: 17399a78872aa89cab600cb7977405136a72798dbbb59a4b3684012c2a2ffb9b62720cceaaedc412088b7da086518a6722c909e03cb81e3e238569722feb60f9 + checksum: ad17781ab4ce4b796954b86de7e14566c731726d39a1db7d73eaf50668a71e996d715450a0ff9f2720755e1b8643c3e88d47d45101a75c9d4ddbef51a636f6a0 languageName: node linkType: hard @@ -17457,19 +17285,19 @@ __metadata: linkType: hard "@types/d3-zoom@npm:^3.0.1": - version: 3.0.4 - resolution: "@types/d3-zoom@npm:3.0.4" + version: 3.0.5 + resolution: "@types/d3-zoom@npm:3.0.5" dependencies: "@types/d3-interpolate": "*" "@types/d3-selection": "*" - checksum: 6330b8411822b979ab0fd5a7a7755295377b4dfc61fd8f925d97e5b388e3dd604b455c0009b0eda3320c14c4ea367f740a04991a71d35befdca5f75218492a68 + checksum: acff15a30b2b81a99b46692c7aacc110c635a272e8d7e87af6aa5a01ebe9ebcafcaf475399d79ec73461a5ef037041dade49a6371d7587b759710123539b81b0 languageName: node linkType: hard "@types/dagre@npm:^0.7.44": - version: 0.7.49 - resolution: "@types/dagre@npm:0.7.49" - checksum: cb27683074f8c89c073d0b7b549692b67ddae7225a2b6f9586d75c11598f7bd32d9246ecb184017a55592e7daaf63e4d33dcbc56ca4c3999cf34352460ddf772 + version: 0.7.50 + resolution: "@types/dagre@npm:0.7.50" + checksum: a128048b5202c501a4595bbc17288aafbef90f3535e79385ddaf0842237e69aa5998dbc12bc2867244eefe3fb6c5026d9785bfdedea46d813f006066e06e8f44 languageName: node linkType: hard @@ -17483,9 +17311,9 @@ __metadata: linkType: hard "@types/diff@npm:^5.0.0": - version: 5.0.3 - resolution: "@types/diff@npm:5.0.3" - checksum: d8a7d4de12f1aba0bd0c17b0b0d1e45c83824d3d6cc65763fbad371cd8315361a7e16fbae3f260a83bfdf30cebe1c876b42cec4518698055bc430fb09db1cbc8 + version: 5.0.5 + resolution: "@types/diff@npm:5.0.5" + checksum: 5f093341d5488cd33079400d4b2ff463dfd4f589bf0a54fbb25f7c87a7bdc16bd1e6125f252c081fa9a3ad44fc78b156c0a5f38bd8128edceb40ba084e051885 languageName: node linkType: hard @@ -17500,12 +17328,12 @@ __metadata: linkType: hard "@types/dockerode@npm:^3.3.0, @types/dockerode@npm:^3.3.8": - version: 3.3.19 - resolution: "@types/dockerode@npm:3.3.19" + version: 3.3.20 + resolution: "@types/dockerode@npm:3.3.20" dependencies: "@types/docker-modem": "*" "@types/node": "*" - checksum: 96d6cd3811a778d12382432413c3b0a935912c175ca939c77aaa0db2630c205daf14d5fa52e458a6fd44355c444f4fa1bd821e0364d4d0b6388061b5fe889431 + checksum: cb2d7a923cfec9d92b69694e613f0becbea627d4d9d919ab349f28ea81d8f5fa71aa437d89b4bc5291a5edb7a07c643ccff2139e2d7ab92a58235d0b05d2a48d languageName: node linkType: hard @@ -17562,9 +17390,9 @@ __metadata: linkType: hard "@types/event-source-polyfill@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/event-source-polyfill@npm:1.0.1" - checksum: 37f3ccc40e2fc43230047c3323f8bfc55f6ed40aee8c61af7f6b702a923be5615362cf3241f5a536f9c64932309a2184a0181bb48e105a94b968b8321cae1c60 + version: 1.0.2 + resolution: "@types/event-source-polyfill@npm:1.0.2" + checksum: f0813edfee0af768e6e0994b48f9f618df7a5d9023c383a8f35e9e805dec560222dc40fc583d5f1404977febb7353c27c1d0606c67d948a2d18634c18ae437a9 languageName: node linkType: hard @@ -17576,35 +17404,35 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.30, @types/express-serve-static-core@npm:^4.17.33, @types/express-serve-static-core@npm:^4.17.5": - version: 4.17.36 - resolution: "@types/express-serve-static-core@npm:4.17.36" + version: 4.17.37 + resolution: "@types/express-serve-static-core@npm:4.17.37" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" "@types/send": "*" - checksum: 410b13cbd663f18c0f8729e7f2ff54d960d96de76ebbae7cadb612972f85cc66c54051e00d32f11aa230c0a683d81a6d6fc7f7e4e383a95c0801494c517f36e1 + checksum: 2dab1380e45eb44e56ecc1be1c42c4b897364d2f2a08e03ca28fbcb1e6866e390217385435813711c046f9acd684424d088855dc32825d5cbecf72c60ecd037f languageName: node linkType: hard "@types/express-session@npm:^1.17.2": - version: 1.17.7 - resolution: "@types/express-session@npm:1.17.7" + version: 1.17.8 + resolution: "@types/express-session@npm:1.17.8" dependencies: "@types/express": "*" - checksum: 4764eafaf4e26842e891e83fa9fee30b92cc3724d91987aac3a658322f9a69fb544dae24fc3aba6e15fe9575ed862760ebecd7ff97a947afb695284967434a65 + checksum: e1af8797b321ce05e0732c58aa982f00ab34b6edb337c289092e66c789ae1bbb4ca14d2caa0e0ff02522047402bcff828873b035e2785fb92f2381a0eb34240c languageName: node linkType: hard "@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.17, @types/express@npm:^4.17.6": - version: 4.17.17 - resolution: "@types/express@npm:4.17.17" + version: 4.17.18 + resolution: "@types/express@npm:4.17.18" dependencies: "@types/body-parser": "*" "@types/express-serve-static-core": ^4.17.33 "@types/qs": "*" "@types/serve-static": "*" - checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da + checksum: 8c178da4f0edff1f006d871fbdc3f849620986ff10bad252f3dfd45b57554e26aaa28c602285df028930d5216e257a06fbaf795070f8bb42f7d87e3b689cba50 languageName: node linkType: hard @@ -17642,9 +17470,9 @@ __metadata: linkType: hard "@types/google-protobuf@npm:^3.7.2": - version: 3.15.6 - resolution: "@types/google-protobuf@npm:3.15.6" - checksum: e8f7cd9d263093cd0a72eb10ff0bb8221e28aa8b9f601eddbe19b286932aae96fbc9ccb1f3a744525e7811fa87a6aeefd431858b6e2034f14a2dc68710a86d54 + version: 3.15.7 + resolution: "@types/google-protobuf@npm:3.15.7" + checksum: d369f1442ec943150dfc1e8af6fbc5ae2402cf3ef44953e3f4d447c203affe64d6c5d614de59561df0e03f23151df85c456d58a7e5b26a7f3ccec5899b1c22be languageName: node linkType: hard @@ -17700,9 +17528,9 @@ __metadata: linkType: hard "@types/http-errors@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/http-errors@npm:2.0.1" - checksum: 3bb0c50b0a652e679a84c30cd0340d696c32ef6558518268c238840346c077f899315daaf1c26c09c57ddd5dc80510f2a7f46acd52bf949e339e35ed3ee9654f + version: 2.0.2 + resolution: "@types/http-errors@npm:2.0.2" + checksum: d7f14045240ac4b563725130942b8e5c8080bfabc724c8ff3f166ea928ff7ae02c5194763bc8f6aaf21897e8a44049b0492493b9de3e058247e58fdfe0f86692 languageName: node linkType: hard @@ -17718,11 +17546,11 @@ __metadata: linkType: hard "@types/http-proxy@npm:*, @types/http-proxy@npm:^1.17.4, @types/http-proxy@npm:^1.17.8": - version: 1.17.11 - resolution: "@types/http-proxy@npm:1.17.11" + version: 1.17.12 + resolution: "@types/http-proxy@npm:1.17.12" dependencies: "@types/node": "*" - checksum: 38ef4f8c91c7a5b664cf6dd4d90de7863f88549a9f8ef997f2f1184e4f8cf2e7b9b63c04f0b7b962f34a09983073a31a9856de5aae5159b2ddbb905a4c44dc9f + checksum: 89700c8e3c8f2c59c87c8db8e7a070c97a3b30a4a38223aca6b8b817e6f2ca931f5a500e16ecadc1ebcfed2676cc60e073d8f887e621d84420298728ec6fd000 languageName: node linkType: hard @@ -17785,20 +17613,20 @@ __metadata: linkType: hard "@types/jenkins@npm:^0.23.1": - version: 0.23.3 - resolution: "@types/jenkins@npm:0.23.3" + version: 0.23.4 + resolution: "@types/jenkins@npm:0.23.4" dependencies: "@types/node": "*" - checksum: bfe05038e2a170ebaf92b9dedef436450b2cfd107551bda8e02f1af69db14c2108d6da797c869305cf402dc174af4da0130c156a3812deb315b32e7eb9a50136 + checksum: 378af85d2f7c3da13cb04098837224551d5d048e6a7b87e78aea8c5e4385f8a1b2cdabd592bb7a6eaa0d46a27eb840c3aa3baa35f1f0449f7f03b8eb527c8562 languageName: node linkType: hard "@types/jest-when@npm:^3.5.0": - version: 3.5.2 - resolution: "@types/jest-when@npm:3.5.2" + version: 3.5.3 + resolution: "@types/jest-when@npm:3.5.3" dependencies: "@types/jest": "*" - checksum: 106230dd71ee266bbd7620ab339a7305054e56ba7638f0eff9f222e67a959df0ad68a7f0108156c50f7005881bae59cd5c38b3760c101d060cdb3dac9cd77ee2 + checksum: 5dc2661ad570b80b8f97d7dabc50a0229f21818eefc73024b88a70216c2666f56bd97769fef565263d7242878f8187531bb14427dcb06709e9b98a1671668e9d languageName: node linkType: hard @@ -17823,11 +17651,11 @@ __metadata: linkType: hard "@types/jquery@npm:^3.3.34": - version: 3.5.18 - resolution: "@types/jquery@npm:3.5.18" + version: 3.5.20 + resolution: "@types/jquery@npm:3.5.20" dependencies: "@types/sizzle": "*" - checksum: 6576bc9a6d35671ceb464e8f937b7eb916227b38b4edf8769a0bc628cfbb9f211b61ccd4158d42aa31591f2c6766b7095430f820d374f70245258ac6cec3e439 + checksum: 9bd69faea3d60f52d3029a87b890003042a9dcf4f538c23ac2c11b3bd0e0ccd86b281d5ba3028d1b02df67c69266b8dc0ef0a35696ae174515ecf34523a0287b languageName: node linkType: hard @@ -17846,19 +17674,19 @@ __metadata: linkType: hard "@types/js-yaml@npm:^4.0.0, @types/js-yaml@npm:^4.0.1": - version: 4.0.5 - resolution: "@types/js-yaml@npm:4.0.5" - checksum: 7dcac8c50fec31643cc9d6444b5503239a861414cdfaa7ae9a38bc22597c4d850c4b8cec3d82d73b3fbca408348ce223b0408d598b32e094470dfffc6d486b4d + version: 4.0.6 + resolution: "@types/js-yaml@npm:4.0.6" + checksum: d4439ec2cc830d355c2a1d7508f49888931b2cfe59d786d27621edd530bf06314b1dceeaa759e21f9b035a0ff623a0ca306752ebb73df9485c02abe045bd962c languageName: node linkType: hard "@types/jscodeshift@npm:^0.11.0": - version: 0.11.6 - resolution: "@types/jscodeshift@npm:0.11.6" + version: 0.11.7 + resolution: "@types/jscodeshift@npm:0.11.7" dependencies: ast-types: ^0.14.1 recast: ^0.20.3 - checksum: 418d34488f74e711b37fcfce5129df3494d7fd30e852b3e80ff659ef0b1a4a83911e62883a10d7e1111316b569fa91a5a6a6d22fee86c2d69db829e25b534b27 + checksum: c6b81d537dca08c24db76e5e75d6056ef7c5b7651aebc319277321e2f2421984cc237ac71593dec374e49f9eae28c22150a37de3a572f141d55382c193091899 languageName: node linkType: hard @@ -17874,18 +17702,18 @@ __metadata: linkType: hard "@types/json-schema-merge-allof@npm:^0.6.0": - version: 0.6.1 - resolution: "@types/json-schema-merge-allof@npm:0.6.1" + version: 0.6.2 + resolution: "@types/json-schema-merge-allof@npm:0.6.2" dependencies: "@types/json-schema": "*" - checksum: 4d3648e9bf6f554f09c28955ea44b9d98c25e17e1aeb0fa3d62ea06729ec0ef16ca1b2bf1b7e12d86a6a3ea72a8eac50f34adca50984bcb9007a67b2fe9eb82b + checksum: 2be8f35eb47cb6f2344c15625010edd0983d258b0eba76e4193a1e80a3b3334bcb7efe1060594a8420cdcb092201e5ad3d78442f7af2edc548661c19c9a65440 languageName: node linkType: hard "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.12 - resolution: "@types/json-schema@npm:7.0.12" - checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 + version: 7.0.13 + resolution: "@types/json-schema@npm:7.0.13" + checksum: 345df21a678fa72fb389f35f33de77833d09d4a142bb2bcb27c18690efa4cf70fc2876e43843cefb3fbdb9fcb12cd3e970a90936df30f53bbee899865ff605ab languageName: node linkType: hard @@ -17973,9 +17801,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.151, @types/lodash@npm:^4.14.173, @types/lodash@npm:^4.14.175": - version: 4.14.198 - resolution: "@types/lodash@npm:4.14.198" - checksum: b290e4480707151bcec738bca40527915defe52a0d8e26c83685c674163a265e1a88cb2ee56b0fb587a89819d0cd5df86ada836aec3e9c2e4bf516e7d348d524 + version: 4.14.199 + resolution: "@types/lodash@npm:4.14.199" + checksum: e68d1fcbbfce953ed87b296a628573f62939227bcda0c934954e862b421e8a34c5e71cad6fea27b9980567909e6a4698f09025692958e36d64ea9ed99ec6fb2e languageName: node linkType: hard @@ -18011,9 +17839,9 @@ __metadata: linkType: hard "@types/marked@npm:^4.0.0": - version: 4.3.1 - resolution: "@types/marked@npm:4.3.1" - checksum: eb6891b925d53ea53057f088b28f9232016499e62639cbb4a67f7d34f288ec6a8e40aae4836dbd06bd0fc3c541fca1175cd50d9e8d405547b6be7b7781e6a2a5 + version: 4.3.2 + resolution: "@types/marked@npm:4.3.2" + checksum: c1107079d6c368dd60a668a41aa2101d006cad404b6eb4af6723d419dc869b278928fb769825f11d0d311a8cf437428992729c8a47253b6a3894a6326b1ee4d9 languageName: node linkType: hard @@ -18034,9 +17862,9 @@ __metadata: linkType: hard "@types/mime-types@npm:^2.1.0": - version: 2.1.1 - resolution: "@types/mime-types@npm:2.1.1" - checksum: 106b5d556add46446a579ad25ff15d6b421851790d887edcad558c90c1e64b1defc72bfbaf4b08f208916e21d9cc45cdb951d77be51268b18221544cfe054a3c + version: 2.1.2 + resolution: "@types/mime-types@npm:2.1.2" + checksum: 9e3c78f1c63211e0450901212566a046da68d4438a5e543333ec9b0be3259bd5d01532734dc51ead40104889b98d12c7663b65212a318aafad3e34c98204e9e1 languageName: node linkType: hard @@ -18062,27 +17890,27 @@ __metadata: linkType: hard "@types/minimist@npm:^1.2.0": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d + version: 1.2.3 + resolution: "@types/minimist@npm:1.2.3" + checksum: 666ea4f8c39dcbdfbc3171fe6b3902157c845cc9cb8cee33c10deb706cda5e0cc80f98ace2d6d29f6774b0dc21180c96cd73c592a1cbefe04777247c7ba0e84b languageName: node linkType: hard "@types/mock-fs@npm:^4.10.0, @types/mock-fs@npm:^4.13.0": - version: 4.13.1 - resolution: "@types/mock-fs@npm:4.13.1" + version: 4.13.2 + resolution: "@types/mock-fs@npm:4.13.2" dependencies: "@types/node": "*" - checksum: a5fcf8212daa270e6aa560019a4bd28a66e6fa49c55c1373746d5894f4aa1aafa5588335194953cf014de3c77df6be67a041fb6638ead7124307370985880b6c + checksum: 726975ae51f7b4068bb059c633ae28a1d85595d3036c235d3f9c9dc3a9c519dc6b811713af1b686807e80a484a6ec47a742a11b4ada32a6e74eee6538a9f4658 languageName: node linkType: hard "@types/morgan@npm:^1.9.0": - version: 1.9.5 - resolution: "@types/morgan@npm:1.9.5" + version: 1.9.6 + resolution: "@types/morgan@npm:1.9.6" dependencies: "@types/node": "*" - checksum: f98deb4c7f2ad6049ad34ed7b0f0d427546bdf2358011070af9d597de1b0a03b38cc10cfe65ef2e7673e569c384303d949e76df701acefe288d547f614142973 + checksum: 6525248325a74342f929c958be69c0840c8f3a288e003a8904319cae92e531f17a8aa2700701e66775adcca7f9506dd630fec2f95dc04a3e73add04fde42aab8 languageName: node linkType: hard @@ -18103,38 +17931,38 @@ __metadata: linkType: hard "@types/ndjson@npm:^2.0.1": - version: 2.0.1 - resolution: "@types/ndjson@npm:2.0.1" + version: 2.0.2 + resolution: "@types/ndjson@npm:2.0.2" dependencies: "@types/node": "*" "@types/through": "*" - checksum: d7e5ef9d43424851d1d3e1b223c0d6508bf283c4a769eb08312a96b1e6e60011b3454a5599dbecfdad4128f7c9c6c1b5b4abfabe29bb5065d412dead1c20f9e8 + checksum: 2f4d60229a01dadd4ed1d7df923223788cc4517a15d0fc07b56b3dbdefb567646334e173d7f976a8a7ce7b85df74bf78fd8805f41bdd9ebd8d135310f472a2cb languageName: node linkType: hard "@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7, @types/node-fetch@npm:^2.6.1": - version: 2.6.4 - resolution: "@types/node-fetch@npm:2.6.4" + version: 2.6.5 + resolution: "@types/node-fetch@npm:2.6.5" dependencies: "@types/node": "*" - form-data: ^3.0.0 - checksum: f3e1d881bb42269e676ecaf49f0e096ab345e22823a2b2d071d60619414817fe02df48a31a8d05adb23054028a2a65521bdb3906ceb763ab6d3339c8d8775058 + form-data: ^4.0.0 + checksum: 686ee0d52bb82d73f82c0da0bb025d4af1ba7bd8df4edd09336f6179eb838b6d4b5f0a524677a8faec2b00918d1b08a1690d50fa592c9741a5df6a8041a52495 languageName: node linkType: hard "@types/node-forge@npm:^1.3.0": - version: 1.3.5 - resolution: "@types/node-forge@npm:1.3.5" + version: 1.3.6 + resolution: "@types/node-forge@npm:1.3.6" dependencies: "@types/node": "*" - checksum: b93dae2639ab166d8703567285538f14a53fbe9199b02c1e3752d147260be4a8be5257246558a81fc3eee3c5880704039a6aa22c4415aeb06758aad0391ac39c + checksum: 5fe97ce83937c51215a52eb8c9d5c4458abbca2b3cfd91a65142f20fd4a2830ed10ab1a8c860efc55ff36553f939a75c4a6d5c243ed6e24e55a005c9bddeaf43 languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 20.6.0 - resolution: "@types/node@npm:20.6.0" - checksum: 52611801af5cf151c6fac1963aa4a8a8ca2e388a9e9ed82b01b70bca762088ded5b32cc789c5564220d5d7dccba2b8dd34446a3d4fc74736805e1f2cf262e29d +"@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:^20.1.1": + version: 20.6.5 + resolution: "@types/node@npm:20.6.5" + checksum: b849e849cf7631458a65c5019c81962028e306d8c4455a48422277b240f5a7eb8a1f1dafa60306bd4c773b77263bb8b05c074b1026e868bd137bb2022cf63ea2 languageName: node linkType: hard @@ -18145,13 +17973,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^14.14.31": - version: 14.18.59 - resolution: "@types/node@npm:14.18.59" - checksum: 6a2a5a5c07b9150bad47b821deb723ab72d33beae8b7b75a10787550236e6428d547806ba3103c86918b849b790bfaef0b165650213d807792effcfb7181be10 - languageName: node - linkType: hard - "@types/node@npm:^15.6.1": version: 15.14.9 resolution: "@types/node@npm:15.14.9" @@ -18159,17 +17980,17 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^16.0.0, @types/node@npm:^16.11.26, @types/node@npm:^16.9.2": - version: 16.18.50 - resolution: "@types/node@npm:16.18.50" - checksum: 8aec1eaf83407197ec2fe947182c238f49b82a7aace867cee1f81f72eb8a76c3c8b2adb1fd356e7443317cffb2546708da8934299a579edd25e3160bf7af30a1 +"@types/node@npm:^16.9.2": + version: 16.18.53 + resolution: "@types/node@npm:16.18.53" + checksum: 26c05cde59664360c22e0dda70776ca6f1b35f0b94e4f84d2c21e2afa2e69ac3a2c99bbb57b43405f81df1b2598f6d707ccc7c4c31865f90e45c4625d8400518 languageName: node linkType: hard -"@types/node@npm:^18.11.17": - version: 18.17.15 - resolution: "@types/node@npm:18.17.15" - checksum: eed11d4398ccdb999a4c65658ee75de621a4ad57aece48ed2fb8803b1e2711fadf58d8aefbdb0a447d69cf3cba602ca32fe0fc92077575950a796e1dc13baa0f +"@types/node@npm:^18.11.17, @types/node@npm:^18.17.8": + version: 18.17.18 + resolution: "@types/node@npm:18.17.18" + checksum: 59cbd906363d37017fe9ba0c08c1446e440d4d977459609c5f90b8fb7eb41f273ce8af30c5a5b5d599d7de934c1b3702bc9fc27caf8d2270e5cdb659c5232991 languageName: node linkType: hard @@ -18188,9 +18009,9 @@ __metadata: linkType: hard "@types/nunjucks@npm:^3.1.4": - version: 3.2.3 - resolution: "@types/nunjucks@npm:3.2.3" - checksum: f4263a39f0bafb701fe75a088cf2100f0fe717ab29c53d13eb60fea77e945f8cfdabfb84bd6ce85fd11586f90aa36539cf5bd489166edcf56a189a0407d481a2 + version: 3.2.4 + resolution: "@types/nunjucks@npm:3.2.4" + checksum: d154c6cc98320b6b9f48892eb4238f961b0196e24eb98252f9dceaa0b17bf70cd480a11d4ffda9f419d2570abf6d96524ebd3193b101f0fcf73c65af3e56d064 languageName: node linkType: hard @@ -18218,43 +18039,43 @@ __metadata: linkType: hard "@types/passport-auth0@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/passport-auth0@npm:1.0.5" + version: 1.0.7 + resolution: "@types/passport-auth0@npm:1.0.7" dependencies: "@types/express": "*" "@types/passport": "*" - checksum: b86b69a182864cae6877c0f16a1d62e24a394dc9cde8e7285a29aef89d52fbb555b899e061157bfd52420dcbccd6fd9b189155e5367a22763b0b2813cbb28354 + checksum: 75b17c3424054a8b0238905088a7c34efab771a0bccc5ce0270d5c6f238ba859fb7354531c0df4f39e7b2c28f10090f9c260ffc42773211fc216a9acbf11170a languageName: node linkType: hard "@types/passport-github2@npm:^1.2.4": - version: 1.2.5 - resolution: "@types/passport-github2@npm:1.2.5" + version: 1.2.6 + resolution: "@types/passport-github2@npm:1.2.6" dependencies: "@types/express": "*" "@types/passport": "*" "@types/passport-oauth2": "*" - checksum: a4f1851edb91a2502136b7e76dd10fd3c52aebec938ff21ffa2ade40b1f62d0e7f65991c80589f5cfa40b6cba04bf0b8ea46db6942975bf5918fa4690f681235 + checksum: 72d1c8bc335d0d7f329372ac8bc7edb22c8bea151d4438d876036b6b768f4d12c8de305abbc25b650f373b902bae250008cb185074d2d78da49d15e981208d81 languageName: node linkType: hard "@types/passport-google-oauth20@npm:^2.0.3": - version: 2.0.11 - resolution: "@types/passport-google-oauth20@npm:2.0.11" + version: 2.0.12 + resolution: "@types/passport-google-oauth20@npm:2.0.12" dependencies: "@types/express": "*" "@types/passport": "*" "@types/passport-oauth2": "*" - checksum: 5e87a0bf40d77ce863dbcea4ae1cd6bccc663282593c9b6ce83b0e2d5d6c56ed9dc0275a04f5d81832f03b3a477fd47d17fd9b3ee22ceb69ca445ab0b0d326d7 + checksum: e73fff5b7e3191ab1a3633b05b4463d656ef658fe0612bc33517a1df81c8a1f019c91dcbd244233320f9eb133892b589dcb6a6348082e85e45aa5c6ed034d191 languageName: node linkType: hard "@types/passport-microsoft@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/passport-microsoft@npm:1.0.0" + version: 1.0.1 + resolution: "@types/passport-microsoft@npm:1.0.1" dependencies: "@types/passport-oauth2": "*" - checksum: d7c8b439b18cddcf707ea0c575748ecb344b6fb3c78a847aaad83246abf081c8b485efa86a3788cd5f49f4ca84a1444d813697a433fab9d04f35fb67d628cb23 + checksum: eec44ee6e14448b89434503a438021df6738513fa705b42a6d979a6b817ce89f939996a5d30707a64bca700dbc7c6ae52f1010ad2e986bb7ccd9f935d2114c9e languageName: node linkType: hard @@ -18270,56 +18091,56 @@ __metadata: linkType: hard "@types/passport-saml@npm:^1.1.3": - version: 1.1.3 - resolution: "@types/passport-saml@npm:1.1.3" + version: 1.1.4 + resolution: "@types/passport-saml@npm:1.1.4" dependencies: "@types/express": "*" "@types/passport": "*" - checksum: 1d0abc04b1f19c043f9dd311248d3d98b00b311ed6d2cfa6cb17ef0954d0b403de4ccca4f1be192cbfda92105eb799c7963da6f39e4542ca254b06d5c467ed4a + checksum: 2a71d64c72b0f6cf4cafcc21138f5c925cc9bc375a0dd7ece664e8b1254dd4a704566632bafa3e16032821a7f010de4023169589b643a3b952709cde228a8c8c languageName: node linkType: hard "@types/passport-strategy@npm:^0.2.35": - version: 0.2.35 - resolution: "@types/passport-strategy@npm:0.2.35" + version: 0.2.36 + resolution: "@types/passport-strategy@npm:0.2.36" dependencies: "@types/express": "*" "@types/passport": "*" - checksum: e5949063ad8977ce1f7cf2a5df6bc379c4d43a959c9946bfed6570ef379c6c12d1713212a29b3b5aafc631c5ebe9bfe082116f3e75ca1bf45d79dd889671532d + checksum: 7f626eb6a12110c1ce64dd5d5181fc0795e77d60123872e33f6fa1c02a2a19451207eaf03543232241a1d70bfe0318f2ffeef88f6309d7cbaa43d2bf6ec1d1e8 languageName: node linkType: hard "@types/passport@npm:*, @types/passport@npm:^1.0.3": - version: 1.0.12 - resolution: "@types/passport@npm:1.0.12" + version: 1.0.13 + resolution: "@types/passport@npm:1.0.13" dependencies: "@types/express": "*" - checksum: 2bce41b248566d8c2aeafcb38f105e3521d42a572e92da9edc5eb669f1b3cb02e5911c9d124191f67d432b677562a885b6ad7f56320c712df1e87ba7619eb8a4 + checksum: 84330bedb330302ffd92b009b9b88eb20d3c66b659b383badb9aa3035612b40b47052153858b2498a95d9979d668443bdee3182345819cb18635dfb7f24c109c languageName: node linkType: hard "@types/pg@npm:^8.6.6": - version: 8.10.2 - resolution: "@types/pg@npm:8.10.2" + version: 8.10.3 + resolution: "@types/pg@npm:8.10.3" dependencies: "@types/node": "*" pg-protocol: "*" pg-types: ^4.0.1 - checksum: 49da89f64cec1bd12a3fbc0c72b17d685c2fee579726a529f62fcab395dbc5696d80455073409947a577164b3c53a90181a331e4a5d9357679f724d4ce37f4b9 + checksum: 05a12be3f18cc67728e3aee5a7426f065351ca991e351d2e7a0562c5d9063425d67fe88fd35108834e0fa1f5624032fefbf371cf8f3cc47230a666aa953425b9 languageName: node linkType: hard "@types/ping@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/ping@npm:0.4.1" - checksum: 9b94837fe66df70558c5a42b0e0c8371b4950ab56b96c42c8df809ff2cf52477dd0a7e01d2e6b38af8bb6683b3dcb54587960b96b4b1f3d40fdb529aea348ad0 + version: 0.4.2 + resolution: "@types/ping@npm:0.4.2" + checksum: 4ea20f8c04d6d52ac9d4a551af03b940c273616fc647d9905197400f920f744c5224ee6913ef26b845633e8e44ebab4195e4fd71daf271090336f303069b7fef languageName: node linkType: hard -"@types/pluralize@npm:^0.0.30": - version: 0.0.30 - resolution: "@types/pluralize@npm:0.0.30" - checksum: 7a9a4a24aac1f74bd63e592a824ebec114486e0635a94496e92aa37fa388fac585be108d3ccfc7b2c490963679ec4900fbf394d22fa6cbf419f22cc499ab5a29 +"@types/pluralize@npm:^0.0.31": + version: 0.0.31 + resolution: "@types/pluralize@npm:0.0.31" + checksum: 950d52d8f6709cdb7001336942fba0a63bf54b45695391fc2244d03db69b0eb6f187f80519d74941f5ce1dfa900d3975f2ed52e98b1f63a79045f5c085832beb languageName: node linkType: hard @@ -18331,9 +18152,9 @@ __metadata: linkType: hard "@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.3, @types/prop-types@npm:^15.7.5": - version: 15.7.5 - resolution: "@types/prop-types@npm:15.7.5" - checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 + version: 15.7.7 + resolution: "@types/prop-types@npm:15.7.7" + checksum: 023b95f7dd82e1c594f51dcb93ec4c382600cef6eeee29a2ac7b782b92c0882eab8da16d4cbd6e18b39e85ac8d94ebf4ca02c6e248ce5b5fb4b16dbab5d82861 languageName: node linkType: hard @@ -18370,11 +18191,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^17": - version: 17.0.20 - resolution: "@types/react-dom@npm:17.0.20" + version: 17.0.21 + resolution: "@types/react-dom@npm:17.0.21" dependencies: "@types/react": ^17 - checksum: 525439fb14a033fc5dbe74711ecc50ec82273a528df9656594066a6219401e975101dafffd15d9a1a57a9442d52ea0c92eaacae09554dde27cd792e773f67467 + checksum: a2e3f068c1374601856b63bc57f3f436cf6270c1ba5c5cef0776def6de296c8bdd31c39b5be9e9e77f4652e923bef1e71ae377a2b038f4a81bfd0fec8d10d0d0 languageName: node linkType: hard @@ -18388,20 +18209,11 @@ __metadata: linkType: hard "@types/react-helmet@npm:^6.1.0": - version: 6.1.6 - resolution: "@types/react-helmet@npm:6.1.6" + version: 6.1.7 + resolution: "@types/react-helmet@npm:6.1.7" dependencies: "@types/react": "*" - checksum: 81560c56bfe854b6a43aee31360862588ac875d1177b975da5ce049ac9aa2f7c98dcde65d4397bfaa04e468f40cf3ab2975a2ef966a69d64a60493422898698d - languageName: node - linkType: hard - -"@types/react-is@npm:^18.2.1": - version: 18.2.1 - resolution: "@types/react-is@npm:18.2.1" - dependencies: - "@types/react": "*" - checksum: b44c3262efa2c68fa6fe2beb9ef86170b18305469461a3f97aa14943cc033cb21a26944f718bdb6434eea6e8f7fcba251c4f45b65b897a3fcf751b5a6003cf82 + checksum: d5ee8343f10f8746a022249c6401493baa73241a90b5002b59e8a6ce31650b9e1ab38d398eba5564af026f68eda107c8fcdca01fc046a163a96dc422710f6a77 languageName: node linkType: hard @@ -18418,11 +18230,11 @@ __metadata: linkType: hard "@types/react-sparklines@npm:^1.7.0": - version: 1.7.2 - resolution: "@types/react-sparklines@npm:1.7.2" + version: 1.7.3 + resolution: "@types/react-sparklines@npm:1.7.3" dependencies: "@types/react": "*" - checksum: e0e8479c256731c3fe9405a5d3061f81838f8708bc585203afa89ff81f266f06f5b497b1db77e6a488d6073de623c4093afd9cbf3626bb7c89f996632749c281 + checksum: 4bcdc526ba2bab1354c8add8a01e10c42203950edfeda70d304a50b51f299c27432a8c8a7bbfce1a860a2b72bbfaf867bafe1b01f877cdaaae54e4ed209554f0 languageName: node linkType: hard @@ -18436,11 +18248,11 @@ __metadata: linkType: hard "@types/react-text-truncate@npm:^0.14.0": - version: 0.14.1 - resolution: "@types/react-text-truncate@npm:0.14.1" + version: 0.14.2 + resolution: "@types/react-text-truncate@npm:0.14.2" dependencies: "@types/react": "*" - checksum: 6b5ffb04b41fbe88c63ff7e8ff815fa7e3e52d128a5ccbc134fc412da6b6904dc55a34891aa4769cb5f9b958f48288475f500281cc1f3d74450610a3ec657491 + checksum: 714b8dade2cd149b3a353c6914065f8aaf2e8d01c21fc1e92afe9e9cf19b037c6a9c34c9100a8009848a6d8747fbd0f4c3b2fe4676b0afa35e347b2fecc92811 languageName: node linkType: hard @@ -18472,22 +18284,22 @@ __metadata: linkType: hard "@types/react-window@npm:^1.8.5": - version: 1.8.5 - resolution: "@types/react-window@npm:1.8.5" + version: 1.8.6 + resolution: "@types/react-window@npm:1.8.6" dependencies: "@types/react": "*" - checksum: 5f519e1402300d11b6e6595223feb6499f3227e38da166cbc565773cd7f71862abcf855b7835d391b5119fcfacdfba79d73a965b45f60a293fc1ff25986319ed + checksum: 3084190ab50a84d8499a6df574ad67474566cd7aeeb8fc6ce82a7a13421fd39e21a059c51f9d12f38e5ac52eb9d65f6184e3fb6cb62841e93b197b7401b36e35 languageName: node linkType: hard "@types/react@npm:^17": - version: 17.0.65 - resolution: "@types/react@npm:17.0.65" + version: 17.0.66 + resolution: "@types/react@npm:17.0.66" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: bb862f0f97a49e690cd5c62743307d17398ee62b87bbb2c85c1b01cb992244c0aef4ecdedaab0e8d33c6315d5a8f067cf90e7f1c366b8819678c59204e202932 + checksum: b364a98670ccee222dbd21ddd6cd1be78ad22bca40c7e1c073fff908121fd51fe1de0e9afc3d4ef8dfb6ceedfa28c5257dde9f23af0096f4d350e60c4b2f8858 languageName: node linkType: hard @@ -18501,28 +18313,28 @@ __metadata: linkType: hard "@types/recharts@npm:^1.8.14, @types/recharts@npm:^1.8.15": - version: 1.8.24 - resolution: "@types/recharts@npm:1.8.24" + version: 1.8.25 + resolution: "@types/recharts@npm:1.8.25" dependencies: "@types/d3-shape": ^1 "@types/react": "*" - checksum: 1341e5472bf62a83ab98648bc5c14a9a81fba16af9255203ef12a21caa21a988fac3198d9771703394eb876d4fbefb42e818865e35ecfe0d105aee1d1164aa6e + checksum: b2ab1596f391b70e349ae5f6fc6b29c16f6298f1151747aff84b3380f4644c4e087a489ca55325dc627794317f8e677c9906ab75d2e270c79e45da976a347af5 languageName: node linkType: hard "@types/recursive-readdir@npm:^2.2.0": - version: 2.2.1 - resolution: "@types/recursive-readdir@npm:2.2.1" + version: 2.2.2 + resolution: "@types/recursive-readdir@npm:2.2.2" dependencies: "@types/node": "*" - checksum: 9e8d5ecb98c009016bf65f1b7cc1f997847dc64634e1c4209fae10718a1fcecd3c3a72c4bae66cbc9973165da5e4e7f5b4cda8793b3a5cefca8c05963f6dbf82 + checksum: ed7f73d11354c7df7c5296a73500ace0b9874083c9f9cce4c5a294bb6c9b11f92d25c08a23bdc991f0537358d31e2ae3943169d42fe739ff54ecfddf9ff6b420 languageName: node linkType: hard "@types/regression@npm:^2.0.0": - version: 2.0.2 - resolution: "@types/regression@npm:2.0.2" - checksum: 28ae464c5ffda1698cecf1b1c2e21ed016ae1d71623c7f40bc5404aa55569cca03ac33d29737805059851cc734946027b006858d13a642e12240267c96d49299 + version: 2.0.3 + resolution: "@types/regression@npm:2.0.3" + checksum: 774ef76911225b61c44946573b54ab710401d0e65b9433aa7014c701272167c47e818d4c9809284514881837c2159cd47aad6b290f00f8581920f2c7a146a512 languageName: node linkType: hard @@ -18574,12 +18386,12 @@ __metadata: linkType: hard "@types/rollup-plugin-peer-deps-external@npm:^2.2.0": - version: 2.2.1 - resolution: "@types/rollup-plugin-peer-deps-external@npm:2.2.1" + version: 2.2.2 + resolution: "@types/rollup-plugin-peer-deps-external@npm:2.2.2" dependencies: "@types/node": "*" rollup: ^0.63.4 - checksum: d6bf4ca92e8b09ca35c0397b89a8b8368bb3d1448a5b82a39ab18886f4b4a3d73f197ed49470e10350b2b5ddc892d4050c5e01ac6247fc63321a5ac9fc6f7363 + checksum: a821911276d1882cf30c9650abc3c1cf7b29490ecacfdd537663a4de32b42ff7171bcd69568ce1b256191ad1d2937b1de839d1db85538769787986a5877273e2 languageName: node linkType: hard @@ -18593,11 +18405,11 @@ __metadata: linkType: hard "@types/sanitize-html@npm:^2.6.2": - version: 2.9.0 - resolution: "@types/sanitize-html@npm:2.9.0" + version: 2.9.1 + resolution: "@types/sanitize-html@npm:2.9.1" dependencies: htmlparser2: ^8.0.0 - checksum: b60f42b740bbfb1b1434ce8b43925a38ecc608b60aa654fd009d2e22e33f324b61d370768c55bd2fd98e03de08518ffa8911d61606c483526fb931bb8b59d1b0 + checksum: 381db8e3f22876e8f6aa8f0997af73c71220c8398545d809ebd4e25d33480e73642b8c143a87d87bba504a43ab58d70a724c60eb3fd8fde31a813b682730c98f languageName: node linkType: hard @@ -18609,9 +18421,9 @@ __metadata: linkType: hard "@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.8, @types/semver@npm:^7.5.0": - version: 7.5.1 - resolution: "@types/semver@npm:7.5.1" - checksum: 2fffe938c7ac168711f245a16e1856a3578d77161ca17e29a05c3e02c7be3e9c5beefa29a3350f6c1bd982fb70aa28cc52e4845eb7d36246bcdc0377170d584d + version: 7.5.3 + resolution: "@types/semver@npm:7.5.3" + checksum: 349fdd1ab6c213bac5c991bac766bd07b8b12e63762462bb058740dcd2eb09c8193d068bb226f134661275f2022976214c0e727a4e5eb83ec1b131127c980d3e languageName: node linkType: hard @@ -18626,11 +18438,11 @@ __metadata: linkType: hard "@types/serve-handler@npm:^6.1.0": - version: 6.1.1 - resolution: "@types/serve-handler@npm:6.1.1" + version: 6.1.2 + resolution: "@types/serve-handler@npm:6.1.2" dependencies: "@types/node": "*" - checksum: f519f83b18d7dea80f188f387a56dfe30fe944196849c470902fabf9db344c083c470f67e3362ad3f2294512950bc55924282c5c7a911ec8d507c37c6861d8ce + checksum: 6b206cba18bf77b938e340e1015c631d92b492918ba78dfdff57590a25da8c4bc63fba90f43d763f854c5aa523b243c283ba84d14cfeb1841795337c8b978bd6 languageName: node linkType: hard @@ -18678,14 +18490,7 @@ __metadata: languageName: node linkType: hard -"@types/sinonjs__fake-timers@npm:8.1.1": - version: 8.1.1 - resolution: "@types/sinonjs__fake-timers@npm:8.1.1" - checksum: ca09d54d47091d87020824a73f026300fa06b17cd9f2f9b9387f28b549364b141ef194ee28db762f6588de71d8febcd17f753163cb7ea116b8387c18e80ebd5c - languageName: node - linkType: hard - -"@types/sizzle@npm:*, @types/sizzle@npm:^2.3.2": +"@types/sizzle@npm:*": version: 2.3.2 resolution: "@types/sizzle@npm:2.3.2" checksum: 783b6382934d8f12f2e21220a01c4557150f07abd18336f392664fb74ceaa9a9d59b7c859c0b82fd3f15b6484774cd0d493261fe64c78ee399bf198a8fe8d89d @@ -18756,11 +18561,11 @@ __metadata: linkType: hard "@types/supertest@npm:^2.0.12, @types/supertest@npm:^2.0.8": - version: 2.0.12 - resolution: "@types/supertest@npm:2.0.12" + version: 2.0.13 + resolution: "@types/supertest@npm:2.0.13" dependencies: "@types/superagent": "*" - checksum: f0e2b44f86bec2f708d6a3d0cb209055b487922040773049b0f8c6b557af52d4b5fa904e17dfaa4ce6e610172206bbec7b62420d158fa57b6ffc2de37b1730d3 + checksum: fe66be8e16626f254dc9d9691706942689f47a84edf7d3baaeadd6d4d576dbf915ee70cebdd7034015e83fa91fcd2dcff1cd0252514e4c510619817a183b5b4f languageName: node linkType: hard @@ -18774,21 +18579,21 @@ __metadata: linkType: hard "@types/swagger-ui-react@npm:^4.18.0": - version: 4.18.0 - resolution: "@types/swagger-ui-react@npm:4.18.0" + version: 4.18.1 + resolution: "@types/swagger-ui-react@npm:4.18.1" dependencies: "@types/react": "*" - checksum: fa946a76ece76cdbaf8d8dc2945d690787f67b29a9ed14d95b706b8a7fca2d4161a62eeda74ce81c09b872c23b788f86dab36607e891744c91f425b92e302cef + checksum: 33c5e9aeccaf6591bd8f59489f8ef50b941daf491f08ba00cb1f26140a756b00ecd6a84fcf0171cdb068134e52c3877bdac571357e12f224ae7fc5979aeedb6f languageName: node linkType: hard "@types/tar@npm:^6.1.1": - version: 6.1.5 - resolution: "@types/tar@npm:6.1.5" + version: 6.1.6 + resolution: "@types/tar@npm:6.1.6" dependencies: "@types/node": "*" minipass: ^4.0.0 - checksum: 1efa71c8d72f2b02d16ffecb65c4a96be9dacce000c4207532a686477386524dd99b6e26904319354be3ac9ac4d41296a0cb9cf87d05f8f21ae31c68fe446348 + checksum: d4bcb5a06d8e4b6eac564f22274d72f6a14c614eaf5f6c6c270f3a43c197da2797a7c707bc0377cd2e6d8c429f277e1ca446121546c86021e9782034a306eafb languageName: node linkType: hard @@ -18897,20 +18702,20 @@ __metadata: linkType: hard "@types/webpack-env@npm:^1.15.2, @types/webpack-env@npm:^1.15.3": - version: 1.18.1 - resolution: "@types/webpack-env@npm:1.18.1" - checksum: 3173c069763e51a96565d602af7e6dac9d772ae4aa6f26cac187cbf599a7f0b88f790b4b050b9dbdb0485daed3061b4a337863f3b8ce66f8a4e51f75ad387c6a + version: 1.18.2 + resolution: "@types/webpack-env@npm:1.18.2" + checksum: 883908ade827d35a10efc574fb6f2728a7c520d4296cf1507633ac7457204ccd697bc6c8cadac99bc5d96074a6109c658ebfde59f42ba5ba0fdfffc538892b0f languageName: node linkType: hard "@types/webpack@npm:^5.28.0": - version: 5.28.2 - resolution: "@types/webpack@npm:5.28.2" + version: 5.28.3 + resolution: "@types/webpack@npm:5.28.3" dependencies: "@types/node": "*" tapable: ^2.2.0 webpack: ^5 - checksum: 0b147aaaaa8992417a5ed65af83eb0df9b5247c38ab482f3c844495935a29c474cb21bc865ca36052c353034f40d14c8d232f0c831fdc1a6956baa985d7b1135 + checksum: 8452528f7ff61eb5e53d9d1dc08c05c648af2d850e14debf49141859b72798ea2d91f2892f849d7fa97e208fef7ae82960eea24b1019cb072b4713b515e74bfc languageName: node linkType: hard @@ -18965,18 +18770,18 @@ __metadata: linkType: hard "@types/yarnpkg__lockfile@npm:^1.1.4": - version: 1.1.6 - resolution: "@types/yarnpkg__lockfile@npm:1.1.6" - checksum: c0983d88c479f7b00a66d927fda9f8972e072745d5d16922cf381807aa6e88553319bb9f2b21b58f9e1ebea1a198a22d4da3111d93c81288589371ebb00d65f5 + version: 1.1.7 + resolution: "@types/yarnpkg__lockfile@npm:1.1.7" + checksum: f7d898bfa7a75440ecc57a72d5297c9ce1566d10996004a61765bc79fa82f0c6c82df892442343e983602956f04f0943249902b9e4c09af472873382d0029b21 languageName: node linkType: hard -"@types/yauzl@npm:^2.10.0, @types/yauzl@npm:^2.9.1": - version: 2.10.0 - resolution: "@types/yauzl@npm:2.10.0" +"@types/yauzl@npm:^2.10.0": + version: 2.10.1 + resolution: "@types/yauzl@npm:2.10.1" dependencies: "@types/node": "*" - checksum: 55d27ae5d346ea260e40121675c24e112ef0247649073848e5d4e03182713ae4ec8142b98f61a1c6cbe7d3b72fa99bbadb65d8b01873e5e605cdc30f1ff70ef2 + checksum: 3377916a2d493cb2422b167fb7dfff8cb3ea045a9489dab4955858719bf7fe6808e5f6a51ee819904fb7f623f7ac092b87f9d6a857ea1214a45070d19c8b3d7e languageName: node linkType: hard @@ -19940,13 +19745,6 @@ __metadata: languageName: node linkType: hard -"arch@npm:^2.2.0": - version: 2.2.0 - resolution: "arch@npm:2.2.0" - checksum: e21b7635029fe8e9cdd5a026f9a6c659103e63fff423834323cdf836a1bb240a72d0c39ca8c470f84643385cf581bd8eda2cad8bf493e27e54bd9783abe9101f - languageName: node - linkType: hard - "archiver-utils@npm:^2.1.0": version: 2.1.0 resolution: "archiver-utils@npm:2.1.0" @@ -20007,13 +19805,6 @@ __metadata: languageName: node linkType: hard -"arg@npm:^5.0.2": - version: 5.0.2 - resolution: "arg@npm:5.0.2" - checksum: 6c69ada1a9943d332d9e5382393e897c500908d91d5cb735a01120d5f71daf1b339b7b8980cbeaba8fd1afc68e658a739746179e4315a26e8a28951ff9930078 - languageName: node - linkType: hard - "argparse@npm:^1.0.10, argparse@npm:^1.0.7, argparse@npm:~1.0.9": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -20928,14 +20719,7 @@ __metadata: languageName: node linkType: hard -"blob-util@npm:^2.0.2": - version: 2.0.2 - resolution: "blob-util@npm:2.0.2" - checksum: d543e6b92e4ca715ca33c78e89a07a2290d43e5b2bc897d7ec588c5c7bbf59df93e45225ac0c9258aa6ce4320358990f99c9288f1c48280f8ec5d7a2e088d19b - languageName: node - linkType: hard - -"bluebird@npm:3.7.2, bluebird@npm:^3.5.5, bluebird@npm:^3.7.2": +"bluebird@npm:^3.5.5, bluebird@npm:^3.7.2": version: 3.7.2 resolution: "bluebird@npm:3.7.2" checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef @@ -21260,7 +21044,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.2.1, buffer@npm:^5.5.0, buffer@npm:^5.6.0": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -21425,13 +21209,6 @@ __metadata: languageName: node linkType: hard -"cachedir@npm:^2.3.0": - version: 2.3.0 - resolution: "cachedir@npm:2.3.0" - checksum: ec90cb0f2e6336e266aa748dbadf3da9e0b20e843e43f1591acab7a3f1451337dc2f26cb9dd833ae8cfefeffeeb43ef5b5ff62782a685f4e3c2305dd98482fcb - languageName: node - linkType: hard - "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -21718,13 +21495,6 @@ __metadata: languageName: node linkType: hard -"check-more-types@npm:2.24.0, check-more-types@npm:^2.24.0": - version: 2.24.0 - resolution: "check-more-types@npm:2.24.0" - checksum: b09080ec3404d20a4b0ead828994b2e5913236ef44ed3033a27062af0004cf7d2091fbde4b396bf13b7ce02fb018bc9960b48305e6ab2304cd82d73ed7a51ef4 - languageName: node - linkType: hard - "check-types@npm:^11.1.1": version: 11.1.2 resolution: "check-types@npm:11.1.2" @@ -21871,19 +21641,6 @@ __metadata: languageName: node linkType: hard -"cli-table3@npm:~0.6.1": - version: 0.6.1 - resolution: "cli-table3@npm:0.6.1" - dependencies: - colors: 1.4.0 - string-width: ^4.2.0 - dependenciesMeta: - colors: - optional: true - checksum: 956e175f8eb019c26465b9f1e51121c08d8978e2aab04be7f8520ea8a4e67906fcbd8516dfb77e386ae3730ef0281aa21a65613dffbfa3d62969263252bd25a9 - languageName: node - linkType: hard - "cli-table@npm:^0.3.1": version: 0.3.6 resolution: "cli-table@npm:0.3.6" @@ -22203,7 +21960,7 @@ __metadata: languageName: node linkType: hard -"color@npm:^4.0.1, color@npm:^4.2.3": +"color@npm:^4.0.1": version: 4.2.3 resolution: "color@npm:4.2.3" dependencies: @@ -22241,13 +21998,6 @@ __metadata: languageName: node linkType: hard -"colors@npm:1.4.0": - version: 1.4.0 - resolution: "colors@npm:1.4.0" - checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec - languageName: node - linkType: hard - "colors@npm:~1.2.1": version: 1.2.5 resolution: "colors@npm:1.2.5" @@ -22316,6 +22066,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + languageName: node + linkType: hard + "commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.7.1": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -22365,7 +22122,7 @@ __metadata: languageName: node linkType: hard -"common-tags@npm:1.8.2, common-tags@npm:^1.8.0": +"common-tags@npm:1.8.2": version: 1.8.2 resolution: "common-tags@npm:1.8.2" checksum: 767a6255a84bbc47df49a60ab583053bb29a7d9687066a18500a516188a062c4e4cd52de341f22de0b07062e699b1b8fe3cfa1cb55b241cb9301aeb4f45b4dff @@ -22897,21 +22654,21 @@ __metadata: linkType: hard "cron@npm:^2.0.0": - version: 2.4.3 - resolution: "cron@npm:2.4.3" + version: 2.4.4 + resolution: "cron@npm:2.4.4" dependencies: "@types/luxon": ~3.3.0 luxon: ~3.3.0 - checksum: cb0ad49653b37ba125f8670ca92150ce515493512b1b8a5e08086d22bec9c54dc6d8926fcdb49ea5783f6699862ca5fdc532a440ce33c3228f9b3d565010db2f + checksum: e7dbc39c7c747b4fb198c3e62737bcc049ec8edb2b150eee17d39256982c6688f48b50b72e9b869b18feb186ab5081bcd8b82ad1ef79d9b7a13df499aaa77084 languageName: node linkType: hard -"cronstrue@npm:^2.2.0": - version: 2.31.0 - resolution: "cronstrue@npm:2.31.0" +"cronstrue@npm:^2.2.0, cronstrue@npm:^2.32.0": + version: 2.32.0 + resolution: "cronstrue@npm:2.32.0" bin: cronstrue: bin/cli.js - checksum: 8001433f65751ccd471497be14924dfecd6b91992d615ec7de1fec978792e4a3ab977d05874bea7b6a478dc786ea775554735126c79c8bbe3c94535f20ebebab + checksum: a0925e256583122792fe2f3b92cd49b954ab3e4466c7569a9148b9981db8a389faca139d4eb215142e7b67438a5562219956c56041ed0b8b046b798e72a357a8 languageName: node linkType: hard @@ -22927,15 +22684,6 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:3.1.5": - version: 3.1.5 - resolution: "cross-fetch@npm:3.1.5" - dependencies: - node-fetch: 2.6.7 - checksum: f6b8c6ee3ef993ace6277fd789c71b6acf1b504fd5f5c7128df4ef2f125a429e29cd62dc8c127523f04a5f2fa4771ed80e3f3d9695617f441425045f505cf3bb - languageName: node - linkType: hard - "cross-fetch@npm:^3.1.3, cross-fetch@npm:^3.1.5, cross-fetch@npm:^3.1.8 <4": version: 3.1.8 resolution: "cross-fetch@npm:3.1.8" @@ -23303,55 +23051,10 @@ __metadata: languageName: node linkType: hard -"cypress@npm:^10.0.0": - version: 10.11.0 - resolution: "cypress@npm:10.11.0" - dependencies: - "@cypress/request": ^2.88.10 - "@cypress/xvfb": ^1.2.4 - "@types/node": ^14.14.31 - "@types/sinonjs__fake-timers": 8.1.1 - "@types/sizzle": ^2.3.2 - arch: ^2.2.0 - blob-util: ^2.0.2 - bluebird: ^3.7.2 - buffer: ^5.6.0 - cachedir: ^2.3.0 - chalk: ^4.1.0 - check-more-types: ^2.24.0 - cli-cursor: ^3.1.0 - cli-table3: ~0.6.1 - commander: ^5.1.0 - common-tags: ^1.8.0 - dayjs: ^1.10.4 - debug: ^4.3.2 - enquirer: ^2.3.6 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: ^4.1.1 - extract-zip: 2.0.1 - figures: ^3.2.0 - fs-extra: ^9.1.0 - getos: ^3.2.1 - is-ci: ^3.0.0 - is-installed-globally: ~0.4.0 - lazy-ass: ^1.6.0 - listr2: ^3.8.3 - lodash: ^4.17.21 - log-symbols: ^4.0.0 - minimist: ^1.2.6 - ospath: ^1.2.2 - pretty-bytes: ^5.6.0 - proxy-from-env: 1.0.0 - request-progress: ^3.0.0 - semver: ^7.3.2 - supports-color: ^8.1.1 - tmp: ~0.2.1 - untildify: ^4.0.0 - yauzl: ^2.10.0 - bin: - cypress: bin/cypress - checksum: 938cc6a20f7eeace5c8e850d234904ee1651cbb36d94666fe600cf17ce964e73d4f7d8d944aab677491702a57364e6aceeb4fe8bcbd96147ff5e2b575a956fb2 +"ctrlc-windows@npm:^2.1.0": + version: 2.1.0 + resolution: "ctrlc-windows@npm:2.1.0" + checksum: 0f0582ba9516290d3e90ea7b91710f8b9b110e1ed29b7c84ebd44c16368b2553722b86a17226120ca3ea0ef679ac3596f48104cc113cfb7c3d07260f6c92e38b languageName: node linkType: hard @@ -23603,13 +23306,6 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:^1.10.4": - version: 1.10.4 - resolution: "dayjs@npm:1.10.4" - checksum: d248d6aa1e04f8577a94978e5194c1023347bc08b7c2766d4a4d50b0b69382d3f4fd912b9fcb64ffad4ee2947d53cd8e5d707f49b14817eb7810959d8d95c938 - languageName: node - linkType: hard - "debounce@npm:^1.1.0, debounce@npm:^1.2.0": version: 1.2.1 resolution: "debounce@npm:1.2.1" @@ -23638,7 +23334,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0, debug@npm:^3.2.7": +"debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -23931,7 +23627,7 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1": +"detect-libc@npm:^2.0.0": version: 2.0.1 resolution: "detect-libc@npm:2.0.1" checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7 @@ -23965,13 +23661,6 @@ __metadata: languageName: node linkType: hard -"devtools-protocol@npm:0.0.1036444": - version: 0.0.1036444 - resolution: "devtools-protocol@npm:0.0.1036444" - checksum: 6975c8def95a5e1a4207d6deb05322e335d6a37bdaa3e589cbd5bde40fbbe3ab0df2cfedb1b3ad2785401f208c150fd489a6a065a4624b56e4c0c4c1bfd89172 - languageName: node - linkType: hard - "dezalgo@npm:^1.0.0, dezalgo@npm:^1.0.4": version: 1.0.4 resolution: "dezalgo@npm:1.0.4" @@ -24293,7 +23982,7 @@ __metadata: languageName: node linkType: hard -"duplexer@npm:^0.1.2, duplexer@npm:~0.1.1": +"duplexer@npm:^0.1.2": version: 0.1.2 resolution: "duplexer@npm:0.1.2" checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 @@ -24321,7 +24010,7 @@ __metadata: "@backstage/create-app": "workspace:^" "@backstage/errors": "workspace:^" "@types/fs-extra": ^9.0.1 - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/puppeteer": ^5.4.4 chalk: ^4.0.0 commander: ^9.1.0 @@ -24331,7 +24020,6 @@ __metadata: mysql2: ^2.2.5 nodemon: ^3.0.1 pgtools: ^1.0.0 - puppeteer: ^17.0.0 tree-kill: ^1.2.2 ts-node: ^10.0.0 bin: @@ -24512,7 +24200,7 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": +"enquirer@npm:^2.3.0": version: 2.3.6 resolution: "enquirer@npm:2.3.6" dependencies: @@ -24991,31 +24679,31 @@ __metadata: linkType: hard "esbuild@npm:^0.19.0": - version: 0.19.3 - resolution: "esbuild@npm:0.19.3" + version: 0.19.4 + resolution: "esbuild@npm:0.19.4" dependencies: - "@esbuild/android-arm": 0.19.3 - "@esbuild/android-arm64": 0.19.3 - "@esbuild/android-x64": 0.19.3 - "@esbuild/darwin-arm64": 0.19.3 - "@esbuild/darwin-x64": 0.19.3 - "@esbuild/freebsd-arm64": 0.19.3 - "@esbuild/freebsd-x64": 0.19.3 - "@esbuild/linux-arm": 0.19.3 - "@esbuild/linux-arm64": 0.19.3 - "@esbuild/linux-ia32": 0.19.3 - "@esbuild/linux-loong64": 0.19.3 - "@esbuild/linux-mips64el": 0.19.3 - "@esbuild/linux-ppc64": 0.19.3 - "@esbuild/linux-riscv64": 0.19.3 - "@esbuild/linux-s390x": 0.19.3 - "@esbuild/linux-x64": 0.19.3 - "@esbuild/netbsd-x64": 0.19.3 - "@esbuild/openbsd-x64": 0.19.3 - "@esbuild/sunos-x64": 0.19.3 - "@esbuild/win32-arm64": 0.19.3 - "@esbuild/win32-ia32": 0.19.3 - "@esbuild/win32-x64": 0.19.3 + "@esbuild/android-arm": 0.19.4 + "@esbuild/android-arm64": 0.19.4 + "@esbuild/android-x64": 0.19.4 + "@esbuild/darwin-arm64": 0.19.4 + "@esbuild/darwin-x64": 0.19.4 + "@esbuild/freebsd-arm64": 0.19.4 + "@esbuild/freebsd-x64": 0.19.4 + "@esbuild/linux-arm": 0.19.4 + "@esbuild/linux-arm64": 0.19.4 + "@esbuild/linux-ia32": 0.19.4 + "@esbuild/linux-loong64": 0.19.4 + "@esbuild/linux-mips64el": 0.19.4 + "@esbuild/linux-ppc64": 0.19.4 + "@esbuild/linux-riscv64": 0.19.4 + "@esbuild/linux-s390x": 0.19.4 + "@esbuild/linux-x64": 0.19.4 + "@esbuild/netbsd-x64": 0.19.4 + "@esbuild/openbsd-x64": 0.19.4 + "@esbuild/sunos-x64": 0.19.4 + "@esbuild/win32-arm64": 0.19.4 + "@esbuild/win32-ia32": 0.19.4 + "@esbuild/win32-x64": 0.19.4 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -25063,7 +24751,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: f998ba82b1bbf0f3036201dc2cb94f92aff887b7552738ea3e4dd6f386f87740ef76aabae2fc1c4b91a519354d390f6d9fd89eb71e26882983f6fbaf75369206 + checksum: 024309a16365b020815a30e9a3a9354894a391cf1adbfad7f44a975cf161ab5e961619b30e1ec8ea02994631d71e6b38831119be69f8ccb610c32bbe21addc79 languageName: node linkType: hard @@ -25271,17 +24959,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-cypress@npm:^2.10.3": - version: 2.14.0 - resolution: "eslint-plugin-cypress@npm:2.14.0" - dependencies: - globals: ^13.20.0 - peerDependencies: - eslint: ">= 3.2.1" - checksum: 3fa118a757aebb1aa6b419b2944744796aa4fa3cc1e2e19fa97777fd6792fba12b5ae117bf19bf7e7d9a1abdd48398cfba9ca6f2c62fd690a2108a9a02f3f2ae - languageName: node - linkType: hard - "eslint-plugin-deprecation@npm:^1.3.2": version: 1.5.0 resolution: "eslint-plugin-deprecation@npm:1.5.0" @@ -25643,21 +25320,6 @@ __metadata: languageName: node linkType: hard -"event-stream@npm:=3.3.4": - version: 3.3.4 - resolution: "event-stream@npm:3.3.4" - dependencies: - duplexer: ~0.1.1 - from: ~0 - map-stream: ~0.1.0 - pause-stream: 0.0.11 - split: 0.3 - stream-combiner: ~0.0.4 - through: ~2.3.1 - checksum: 80b467820b6daf824d9fb4345d2daf115a056e5c104463f2e98534e92d196a27f2df5ea2aa085624db26f4c45698905499e881d13bc7c01f7a13eac85be72a22 - languageName: node - linkType: hard - "event-target-polyfill@npm:^0.0.3": version: 0.0.3 resolution: "event-target-polyfill@npm:0.0.3" @@ -25672,7 +25334,7 @@ __metadata: languageName: node linkType: hard -"eventemitter2@npm:6.4.7, eventemitter2@npm:^6.4.4": +"eventemitter2@npm:^6.4.4": version: 6.4.7 resolution: "eventemitter2@npm:6.4.7" checksum: 1b36a77e139d6965ebf3a36c01fa00c089ae6b80faa1911e52888f40b3a7057b36a2cc45dcd1ad87cda3798fe7b97a0aabcbb8175a8b96092a23bb7d0f039e66 @@ -25739,6 +25401,7 @@ __metadata: "@backstage/plugin-azure-devops": "workspace:^" "@backstage/plugin-azure-sites": "workspace:^" "@backstage/plugin-badges": "workspace:^" + "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-graph": "workspace:^" "@backstage/plugin-catalog-import": "workspace:^" @@ -25792,7 +25455,6 @@ __metadata: "@backstage/plugin-user-settings": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@internal/plugin-catalog-customized": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 @@ -25802,7 +25464,6 @@ __metadata: "@roadiehq/backstage-plugin-github-insights": ^2.0.5 "@roadiehq/backstage-plugin-github-pull-requests": ^2.2.7 "@roadiehq/backstage-plugin-travis-ci": ^2.0.5 - "@testing-library/cypress": ^9.0.0 "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -25813,8 +25474,6 @@ __metadata: "@types/zen-observable": ^0.8.0 app-next-example-plugin: "workspace:^" cross-env: ^7.0.0 - cypress: ^10.0.0 - eslint-plugin-cypress: ^2.10.3 history: ^5.0.0 lodash: ^4.17.21 prop-types: ^15.7.2 @@ -25823,7 +25482,6 @@ __metadata: react-router: ^6.3.0 react-router-dom: ^6.3.0 react-use: ^17.2.4 - start-server-and-test: ^1.10.11 zen-observable: ^0.10.0 languageName: unknown linkType: soft @@ -25854,6 +25512,7 @@ __metadata: "@backstage/plugin-azure-devops": "workspace:^" "@backstage/plugin-azure-sites": "workspace:^" "@backstage/plugin-badges": "workspace:^" + "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-graph": "workspace:^" "@backstage/plugin-catalog-import": "workspace:^" @@ -25908,17 +25567,16 @@ __metadata: "@backstage/plugin-user-settings": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@internal/plugin-catalog-customized": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 "@oriflame/backstage-plugin-score-card": ^0.7.0 + "@playwright/test": ^1.32.3 "@roadiehq/backstage-plugin-buildkite": ^2.0.8 "@roadiehq/backstage-plugin-github-insights": ^2.0.5 "@roadiehq/backstage-plugin-github-pull-requests": ^2.2.7 "@roadiehq/backstage-plugin-travis-ci": ^2.0.5 - "@testing-library/cypress": ^9.0.0 "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -25928,8 +25586,6 @@ __metadata: "@types/react-dom": "*" "@types/zen-observable": ^0.8.0 cross-env: ^7.0.0 - cypress: ^10.0.0 - eslint-plugin-cypress: ^2.10.3 history: ^5.0.0 prop-types: ^15.7.2 react: ^17.0.2 @@ -25937,7 +25593,6 @@ __metadata: react-router: ^6.3.0 react-router-dom: ^6.3.0 react-use: ^17.2.4 - start-server-and-test: ^1.10.11 zen-observable: ^0.10.0 languageName: unknown linkType: soft @@ -25967,6 +25622,7 @@ __metadata: "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" + "@backstage/plugin-playlist-backend": "workspace:^" "@backstage/plugin-proxy-backend": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-search-backend": "workspace:^" @@ -25974,6 +25630,7 @@ __metadata: "@backstage/plugin-search-backend-module-explore": "workspace:^" "@backstage/plugin-search-backend-module-techdocs": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" + "@backstage/plugin-sonarqube-backend": "workspace:^" "@backstage/plugin-techdocs-backend": "workspace:^" "@backstage/plugin-todo-backend": "workspace:^" languageName: unknown @@ -26061,40 +25718,6 @@ __metadata: languageName: unknown linkType: soft -"execa@npm:4.1.0": - version: 4.1.0 - resolution: "execa@npm:4.1.0" - dependencies: - cross-spawn: ^7.0.0 - get-stream: ^5.0.0 - human-signals: ^1.1.1 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.0 - onetime: ^5.1.0 - signal-exit: ^3.0.2 - strip-final-newline: ^2.0.0 - checksum: e30d298934d9c52f90f3847704fd8224e849a081ab2b517bbc02f5f7732c24e56a21f14cb96a08256deffeb2d12b2b7cb7e2b014a12fb36f8d3357e06417ed55 - languageName: node - linkType: hard - -"execa@npm:5.1.1, execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 - languageName: node - linkType: hard - "execa@npm:7.2.0": version: 7.2.0 resolution: "execa@npm:7.2.0" @@ -26112,12 +25735,20 @@ __metadata: languageName: node linkType: hard -"executable@npm:^4.1.1": - version: 4.1.1 - resolution: "executable@npm:4.1.1" +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" dependencies: - pify: ^2.2.0 - checksum: f01927ce59bccec804e171bf859a26e362c1f50aa9ebc69f7cafdcce3859d29d4b6267fd47237c18b0a1830614bd3f0ee14b7380d9bad18a4e7af9b5f0b6984f + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 languageName: node linkType: hard @@ -26321,23 +25952,6 @@ __metadata: languageName: node linkType: hard -"extract-zip@npm:2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": ^2.9.1 - debug: ^4.1.1 - get-stream: ^5.1.0 - yauzl: ^2.10.0 - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 - languageName: node - linkType: hard - "extsprintf@npm:1.3.0": version: 1.3.0 resolution: "extsprintf@npm:1.3.0" @@ -26608,7 +26222,7 @@ __metadata: languageName: node linkType: hard -"figures@npm:^3.0.0, figures@npm:^3.2.0": +"figures@npm:^3.0.0": version: 3.2.0 resolution: "figures@npm:3.2.0" dependencies: @@ -27046,13 +26660,6 @@ __metadata: languageName: node linkType: hard -"from@npm:~0": - version: 0.1.7 - resolution: "from@npm:0.1.7" - checksum: b85125b7890489656eb2e4f208f7654a93ec26e3aefaf3bbbcc0d496fc1941e4405834fcc9fe7333192aa2187905510ace70417bbf9ac6f6f4784a731d986939 - languageName: node - linkType: hard - "fromentries@npm:^1.3.1": version: 1.3.2 resolution: "fromentries@npm:1.3.2" @@ -27076,7 +26683,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:10.1.0, fs-extra@npm:^10.0.0, fs-extra@npm:^10.0.1": +"fs-extra@npm:10.1.0, fs-extra@npm:^10.0.0, fs-extra@npm:^10.0.1, fs-extra@npm:^10.1.0": version: 10.1.0 resolution: "fs-extra@npm:10.1.0" dependencies: @@ -27109,7 +26716,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.0.0, fs-extra@npm:^9.1.0": +"fs-extra@npm:^9.0.0": version: 9.1.0 resolution: "fs-extra@npm:9.1.0" dependencies: @@ -27153,7 +26760,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": +"fsevents@npm:2.3.2, fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: @@ -27163,7 +26770,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>": +"fsevents@patch:fsevents@2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@^2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=18f3a7" dependencies: @@ -27336,7 +26943,7 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": +"get-stream@npm:^5.1.0": version: 5.1.0 resolution: "get-stream@npm:5.1.0" dependencies: @@ -27376,15 +26983,6 @@ __metadata: languageName: node linkType: hard -"getos@npm:^3.2.1": - version: 3.2.1 - resolution: "getos@npm:3.2.1" - dependencies: - async: ^3.2.0 - checksum: 42fd78a66d47cebd3e09de5566cc0044e034b08f4a000a310dbd89a77b02c65d8f4002554bfa495ea5bdc4fa9d515f5ac785a7cc474ba45383cc697f865eeaf1 - languageName: node - linkType: hard - "getpass@npm:^0.1.1": version: 0.1.7 resolution: "getpass@npm:0.1.7" @@ -27459,19 +27057,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:8.1.0, glob@npm:^8.0.0, glob@npm:^8.0.1, glob@npm:^8.0.3": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 - languageName: node - linkType: hard - "glob@npm:^10.2.2": version: 10.2.7 resolution: "glob@npm:10.2.7" @@ -27501,6 +27086,19 @@ __metadata: languageName: node linkType: hard +"glob@npm:^8.0.0, glob@npm:^8.0.1, glob@npm:^8.0.3": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + "global-agent@npm:^3.0.0": version: 3.0.0 resolution: "global-agent@npm:3.0.0" @@ -27515,15 +27113,6 @@ __metadata: languageName: node linkType: hard -"global-dirs@npm:^3.0.0": - version: 3.0.0 - resolution: "global-dirs@npm:3.0.0" - dependencies: - ini: 2.0.0 - checksum: 953c17cf14bf6ee0e2100ae82a0d779934eed8a3ec5c94a7a4f37c5b3b592c31ea015fb9a15cf32484de13c79f4a814f3015152f3e1d65976cfbe47c1bfe4a88 - languageName: node - linkType: hard - "global-modules@npm:^2.0.0": version: 2.0.0 resolution: "global-modules@npm:2.0.0" @@ -27551,7 +27140,7 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0, globals@npm:^13.20.0": +"globals@npm:^13.19.0": version: 13.20.0 resolution: "globals@npm:13.20.0" dependencies: @@ -27859,18 +27448,18 @@ __metadata: linkType: hard "graphql-ws@npm:^5.4.1, graphql-ws@npm:^5.9.0": - version: 5.14.0 - resolution: "graphql-ws@npm:5.14.0" + version: 5.14.1 + resolution: "graphql-ws@npm:5.14.1" peerDependencies: graphql: ">=0.11 <=16" - checksum: 7b622944823fa12a77ea490656121a77e1a1daf08114a6a0b027922113f4481d95f4fe380a5de369a51657ef777d35757dc31f63e41071c21f3e97ca47e4205a + checksum: bf6aa9446496f11e74d5fea17672050fb02f0303c6a7bf1e2692b7ea88059a18837f437e2ec8ba3cf7bb5bc2a18dddeebe9a8c6e6036914c3776297c48c1a398 languageName: node linkType: hard "graphql@npm:^15.0.0 || ^16.0.0, graphql@npm:^16.0.0": - version: 16.8.0 - resolution: "graphql@npm:16.8.0" - checksum: d853d4085b0c911a7e2a926c3b0d379934ec61cd4329e70cdf281763102f024fd80a97db7a505b8b04fed9050cb4875f8f518150ea854557a500a0b41dcd7f4e + version: 16.8.1 + resolution: "graphql@npm:16.8.1" + checksum: 8d304b7b6f708c8c5cc164b06e92467dfe36aff6d4f2cf31dd19c4c2905a0e7b89edac4b7e225871131fd24e21460836b369de0c06532644d15b461d55b1ccc0 languageName: node linkType: hard @@ -28432,17 +28021,6 @@ __metadata: languageName: node linkType: hard -"http-signature@npm:~1.3.6": - version: 1.3.6 - resolution: "http-signature@npm:1.3.6" - dependencies: - assert-plus: ^1.0.0 - jsprim: ^2.0.2 - sshpk: ^1.14.1 - checksum: 10be2af4764e71fee0281392937050201ee576ac755c543f570d6d87134ce5e858663fe999a7adb3e4e368e1e356d0d7fec6b9542295b875726ff615188e7a0c - languageName: node - linkType: hard - "http2-wrapper@npm:^1.0.0-beta.5.2": version: 1.0.0-beta.5.2 resolution: "http2-wrapper@npm:1.0.0-beta.5.2" @@ -28460,7 +28038,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": +"https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -28477,13 +28055,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^1.1.1": - version: 1.1.1 - resolution: "human-signals@npm:1.1.1" - checksum: d587647c9e8ec24e02821b6be7de5a0fc37f591f6c4e319b3054b43fd4c35a70a94c46fc74d8c1a43c47fde157d23acd7421f375e1c1365b09a16835b8300205 - languageName: node - linkType: hard - "human-signals@npm:^2.1.0": version: 2.1.0 resolution: "human-signals@npm:2.1.0" @@ -28778,13 +28349,6 @@ __metadata: languageName: node linkType: hard -"ini@npm:2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: e7aadc5fb2e4aefc666d74ee2160c073995a4061556b1b5b4241ecb19ad609243b9cceafe91bae49c219519394bbd31512516cb22a3b1ca6e66d869e0447e84e - languageName: node - linkType: hard - "ini@npm:^1.3.5, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" @@ -29089,7 +28653,7 @@ __metadata: languageName: node linkType: hard -"is-ci@npm:^3.0.0, is-ci@npm:^3.0.1": +"is-ci@npm:^3.0.1": version: 3.0.1 resolution: "is-ci@npm:3.0.1" dependencies: @@ -29217,16 +28781,6 @@ __metadata: languageName: node linkType: hard -"is-installed-globally@npm:~0.4.0": - version: 0.4.0 - resolution: "is-installed-globally@npm:0.4.0" - dependencies: - global-dirs: ^3.0.0 - is-path-inside: ^3.0.2 - checksum: 3359840d5982d22e9b350034237b2cda2a12bac1b48a721912e1ab8e0631dd07d45a2797a120b7b87552759a65ba03e819f1bd63f2d7ab8657ec0b44ee0bf399 - languageName: node - linkType: hard - "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -29318,7 +28872,7 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": +"is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 @@ -30082,7 +29636,7 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^29.4.3": +"jest-haste-map@npm:29.4.3": version: 29.4.3 resolution: "jest-haste-map@npm:29.4.3" dependencies: @@ -30105,6 +29659,29 @@ __metadata: languageName: node linkType: hard +"jest-haste-map@patch:jest-haste-map@npm%3A29.4.3#./.yarn/patches/jest-haste-map-npm-29.4.3-19b03fcef3.patch::locator=root%40workspace%3A.": + version: 29.4.3 + resolution: "jest-haste-map@patch:jest-haste-map@npm%3A29.4.3#./.yarn/patches/jest-haste-map-npm-29.4.3-19b03fcef3.patch::version=29.4.3&hash=1e431f&locator=root%40workspace%3A." + dependencies: + "@jest/types": ^29.4.3 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^29.4.3 + jest-util: ^29.4.3 + jest-worker: ^29.4.3 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: a25fd71cc650acac4295172b2b84212872c4100a0b8e627e1f4b70a7e74d895a20274a4b0449aafdcb8273da055013fdc8765e55cbcf6dc46ae0351e974ed0c2 + languageName: node + linkType: hard + "jest-leak-detector@npm:^29.4.3": version: 29.4.3 resolution: "jest-leak-detector@npm:29.4.3" @@ -30379,7 +29956,7 @@ __metadata: languageName: node linkType: hard -"jest-websocket-mock@npm:^2.4.1": +"jest-websocket-mock@npm:^2.4.1, jest-websocket-mock@npm:^2.5.0": version: 2.5.0 resolution: "jest-websocket-mock@npm:2.5.0" dependencies: @@ -30483,19 +30060,6 @@ __metadata: languageName: node linkType: hard -"joi@npm:^17.7.0": - version: 17.7.0 - resolution: "joi@npm:17.7.0" - dependencies: - "@hapi/hoek": ^9.0.0 - "@hapi/topo": ^5.0.0 - "@sideway/address": ^4.1.3 - "@sideway/formula": ^3.0.0 - "@sideway/pinpoint": ^2.0.0 - checksum: 767a847936cb66787256c4351ff86e1b9e8d7383cbe81a5c827064032c2a8e8b6e938baef5ad32c4035fe4c56e537bd90aa2a952be8a0658601c920cdeb4fb3c - languageName: node - linkType: hard - "jose@npm:^4.14.4, jose@npm:^4.6.0": version: 4.14.6 resolution: "jose@npm:4.14.6" @@ -31091,18 +30655,6 @@ __metadata: languageName: node linkType: hard -"jsprim@npm:^2.0.2": - version: 2.0.2 - resolution: "jsprim@npm:2.0.2" - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - checksum: d175f6b1991e160cb0aa39bc857da780e035611986b5492f32395411879fdaf4e513d98677f08f7352dac93a16b66b8361c674b86a3fa406e2e7af6b26321838 - languageName: node - linkType: hard - "jss-camel-case@npm:^6.0.0": version: 6.1.0 resolution: "jss-camel-case@npm:6.1.0" @@ -31420,11 +30972,11 @@ __metadata: linkType: hard "knex@npm:^2.0.0, knex@npm:^2.3.0, knex@npm:^2.4.2": - version: 2.4.2 - resolution: "knex@npm:2.4.2" + version: 2.5.1 + resolution: "knex@npm:2.5.1" dependencies: colorette: 2.0.19 - commander: ^9.1.0 + commander: ^10.0.0 debug: 4.3.4 escalade: ^3.1.1 esm: ^3.2.25 @@ -31432,7 +30984,7 @@ __metadata: getopts: 2.3.0 interpret: ^2.2.0 lodash: ^4.17.21 - pg-connection-string: 2.5.0 + pg-connection-string: 2.6.1 rechoir: ^0.8.0 resolve-from: ^5.0.0 tarn: ^3.0.2 @@ -31454,11 +31006,11 @@ __metadata: optional: true bin: knex: bin/cli.js - checksum: cfb6436c0e3df3cd1f55d3637e4f222d1acbc7b6ec3757e52c92cbf0a7da4055d40156d707ffede57dc155af75d7f5739a49d1b31d8755bc77bc0e4e2a570748 + checksum: 4f2da7fda51a450de25274eb76034c869de0427c17831dc8472b8116e879d23aae0592c2ce4e9b2a473417867063ac6e7b29021b39b4a4d502335017a5a09278 languageName: node linkType: hard -"kubernetes-models@npm:^4.1.0": +"kubernetes-models@npm:^4.1.0, kubernetes-models@npm:^4.3.1": version: 4.3.1 resolution: "kubernetes-models@npm:4.3.1" dependencies: @@ -31510,13 +31062,6 @@ __metadata: languageName: node linkType: hard -"lazy-ass@npm:1.6.0, lazy-ass@npm:^1.6.0": - version: 1.6.0 - resolution: "lazy-ass@npm:1.6.0" - checksum: 5a3ebb17915b03452320804466345382a6c25ac782ec4874fecdb2385793896cd459be2f187dc7def8899180c32ee0ab9a1aa7fe52193ac3ff3fe29bb0591729 - languageName: node - linkType: hard - "lazystream@npm:^1.0.0": version: 1.0.0 resolution: "lazystream@npm:1.0.0" @@ -31737,27 +31282,6 @@ __metadata: languageName: node linkType: hard -"listr2@npm:^3.8.3": - version: 3.14.0 - resolution: "listr2@npm:3.14.0" - dependencies: - cli-truncate: ^2.1.0 - colorette: ^2.0.16 - log-update: ^4.0.0 - p-map: ^4.0.0 - rfdc: ^1.3.0 - rxjs: ^7.5.1 - through: ^2.3.8 - wrap-ansi: ^7.0.0 - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: fdb8b2d6bdf5df9371ebd5082bee46c6d0ca3d1e5f2b11fbb5a127839855d5f3da9d4968fce94f0a5ec67cac2459766abbb1faeef621065ebb1829b11ef9476d - languageName: node - linkType: hard - "listr2@npm:^4.0.5": version: 4.0.5 resolution: "listr2@npm:4.0.5" @@ -32030,13 +31554,6 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 - languageName: node - linkType: hard - "lodash.sortby@npm:^4.7.0": version: 4.7.0 resolution: "lodash.sortby@npm:4.7.0" @@ -32442,13 +31959,6 @@ __metadata: languageName: node linkType: hard -"map-stream@npm:~0.1.0": - version: 0.1.0 - resolution: "map-stream@npm:0.1.0" - checksum: 38abbe4eb883888031e6b2fc0630bc583c99396be16b8ace5794b937b682a8a081f03e8b15bfd4914d1bc88318f0e9ac73ba3512ae65955cd449f63256ddb31d - languageName: node - linkType: hard - "markdown-it-anchor@npm:^8.4.1": version: 8.6.4 resolution: "markdown-it-anchor@npm:8.6.4" @@ -32481,7 +31991,7 @@ __metadata: languageName: node linkType: hard -"markdown-to-jsx@npm:^7.2.0, markdown-to-jsx@npm:^7.3.2": +"markdown-to-jsx@npm:^7.3.2": version: 7.3.2 resolution: "markdown-to-jsx@npm:7.3.2" peerDependencies: @@ -32834,13 +32344,6 @@ __metadata: languageName: node linkType: hard -"meta-png@npm:1.0.6": - version: 1.0.6 - resolution: "meta-png@npm:1.0.6" - checksum: aed14b3b53189c9d32002d76c40926bd93dd9d439bae3ad23ffb2645c375c9772c160879aa8af59ac85a2f43ae8bbe06b9648a53fe27815f4aeab238f4e9b79d - languageName: node - linkType: hard - "methods@npm:^1.0.0, methods@npm:^1.1.2, methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" @@ -33389,7 +32892,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:>=1.2.2, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.7": +"minimist@npm:>=1.2.2, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -33590,13 +33093,20 @@ __metadata: languageName: node linkType: hard -"mock-fs@npm:^5.1.0, mock-fs@npm:^5.1.1, mock-fs@npm:^5.2.0": +"mock-fs@npm:5.2.0": version: 5.2.0 resolution: "mock-fs@npm:5.2.0" checksum: c25835247bd26fa4e0189addd61f98973f61a72741e4d2a5694b143a2069b84978443a7ac0fdb1a71aead99273ec22ff4e9c968de11bbd076db020264c5b8312 languageName: node linkType: hard +"mock-fs@patch:mock-fs@npm%3A5.2.0#./.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch::locator=root%40workspace%3A.": + version: 5.2.0 + resolution: "mock-fs@patch:mock-fs@npm%3A5.2.0#./.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch::version=5.2.0&hash=920f99&locator=root%40workspace%3A." + checksum: 84e306d7a798735ed8ee110b60ed8fc0b5db451df3a990e2a01432fac99decd15e5534c92d87f8067425329dbd9bf5c12e2673d3d770fb40f2936810e02bb07a + languageName: node + linkType: hard + "mock-socket@npm:^9.3.0": version: 9.3.1 resolution: "mock-socket@npm:9.3.1" @@ -33631,15 +33141,6 @@ __metadata: languageName: node linkType: hard -"move-file@npm:2.1.0": - version: 2.1.0 - resolution: "move-file@npm:2.1.0" - dependencies: - path-exists: ^4.0.0 - checksum: 2b92bbe047a302b593fcb2c0bf1131bb090ec80b3264569fc80d782c8ff829eecc13573943fa4d804c9747dec612ef2d1e84a5cfcf29cbc64a69ffcbb7ea09b3 - languageName: node - linkType: hard - "mri@npm:1.1.4": version: 1.1.4 resolution: "mri@npm:1.1.4" @@ -33675,7 +33176,7 @@ __metadata: languageName: node linkType: hard -"msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.2.1, msw@npm:^1.2.3": +"msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.2.1, msw@npm:^1.2.3, msw@npm:^1.3.1": version: 1.3.1 resolution: "msw@npm:1.3.1" dependencies: @@ -33970,15 +33471,6 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^6.1.0": - version: 6.1.0 - resolution: "node-addon-api@npm:6.1.0" - dependencies: - node-gyp: latest - checksum: 3a539510e677cfa3a833aca5397300e36141aca064cdc487554f2017110709a03a95da937e98c2a14ec3c626af7b2d1b6dabe629a481f9883143d0d5bff07bf2 - languageName: node - linkType: hard - "node-cache@npm:^5.1.2": version: 5.1.2 resolution: "node-cache@npm:5.1.2" @@ -34004,20 +33496,6 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:2.6.7": - version: 2.6.7 - resolution: "node-fetch@npm:2.6.7" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b - languageName: node - linkType: hard - "node-fetch@npm:^1.0.1": version: 1.7.3 resolution: "node-fetch@npm:1.7.3" @@ -34366,7 +33844,7 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": +"npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" dependencies: @@ -34823,13 +34301,6 @@ __metadata: languageName: node linkType: hard -"ospath@npm:^1.2.2": - version: 1.2.2 - resolution: "ospath@npm:1.2.2" - checksum: 505f48a4f4f1c557d6c656ec985707726e3714721680139be037613e903aa8c8fa4ddd8d1342006f9b2dc0065e6e20f8b7bea2ee05354f31257044790367b347 - languageName: node - linkType: hard - "outdent@npm:^0.5.0": version: 0.5.0 resolution: "outdent@npm:0.5.0" @@ -35528,15 +34999,6 @@ __metadata: languageName: node linkType: hard -"pause-stream@npm:0.0.11": - version: 0.0.11 - resolution: "pause-stream@npm:0.0.11" - dependencies: - through: ~2.3 - checksum: 3c4a14052a638b92e0c96eb00c0d7977df7f79ea28395250c525d197f1fc02d34ce1165d5362e2e6ebbb251524b94a76f3f0d4abc39ab8b016d97449fe15583c - languageName: node - linkType: hard - "pause@npm:0.0.1": version: 0.0.1 resolution: "pause@npm:0.0.1" @@ -35585,10 +35047,10 @@ __metadata: languageName: node linkType: hard -"pg-connection-string@npm:2.5.0": - version: 2.5.0 - resolution: "pg-connection-string@npm:2.5.0" - checksum: a6f3a068f7c9416a5b33a326811caf0dfaaee045c225b7c628b4c9b4e9a2b25bdd12a21e4c48940e1000ea223a4e608ca122d2ff3dd08c8b1db0fc9f5705133a +"pg-connection-string@npm:2.6.1": + version: 2.6.1 + resolution: "pg-connection-string@npm:2.6.1" + checksum: 882344a47e1ecf3a91383e0809bf2ac48facea97fcec0358d6e060e1cbcb8737acde419b4c86f05da4ce4a16634ee50fff1d2bb787d73b52ccbfde697243ad8a languageName: node linkType: hard @@ -35734,7 +35196,7 @@ __metadata: languageName: node linkType: hard -"pify@npm:^2.2.0, pify@npm:^2.3.0": +"pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba @@ -35811,17 +35273,6 @@ __metadata: languageName: node linkType: hard -"pixelmatch@npm:5.3.0": - version: 5.3.0 - resolution: "pixelmatch@npm:5.3.0" - dependencies: - pngjs: ^6.0.0 - bin: - pixelmatch: bin/pixelmatch - checksum: f542713d89536551181ad9ddb666a1792ba00a8632d831093232a075cb3ccac05856e7a453ed7d0a41aaef64dcb5962e8ae5cbe646dd2761790d8ee51b0a0743 - languageName: node - linkType: hard - "pkg-dir@npm:^3.0.0": version: 3.0.0 resolution: "pkg-dir@npm:3.0.0" @@ -35863,6 +35314,30 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:1.38.1": + version: 1.38.1 + resolution: "playwright-core@npm:1.38.1" + bin: + playwright-core: cli.js + checksum: 66e83fe040f309b13ad94ba39dea40ac207bfcbbc22de13141af88dbdedd64e1c4e3ce1d0cb070d4efd8050d7e579953ec3681dd8a0acf2c1cc738d9c50e545e + languageName: node + linkType: hard + +"playwright@npm:1.38.1": + version: 1.38.1 + resolution: "playwright@npm:1.38.1" + dependencies: + fsevents: 2.3.2 + playwright-core: 1.38.1 + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 4e01d4ee52d9ccf75a80d8492829106802590721d56bff7c5957ff1f21eb3c328ee5bc3c1784a59c4b515df1b98d08ef92e4a35a807f454cd00dc481d30fadc2 + languageName: node + linkType: hard + "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" @@ -35870,20 +35345,6 @@ __metadata: languageName: node linkType: hard -"pngjs@npm:7.0.0": - version: 7.0.0 - resolution: "pngjs@npm:7.0.0" - checksum: b19a018930d27de26229c1b3ff250b3a25d09caa22cbb0b0459987d91eb0a560a18ab5d67da45a38ed7514140f26d1db58de83c31159ec101f2bb270a3c707f1 - languageName: node - linkType: hard - -"pngjs@npm:^6.0.0": - version: 6.0.0 - resolution: "pngjs@npm:6.0.0" - checksum: ab6c285086060087097eab9fe6b5a528a24f9e79c03dea2b4fd6264ed4fdb5beff4a3257eeeaf2a9dc18249b539609c2a4e4013c567164a1f6b5ba2c974d5ecb - languageName: node - linkType: hard - "pony-cause@npm:^1.0.0": version: 1.1.1 resolution: "pony-cause@npm:1.1.1" @@ -36455,7 +35916,7 @@ __metadata: languageName: node linkType: hard -"pretty-bytes@npm:^5.3.0, pretty-bytes@npm:^5.6.0": +"pretty-bytes@npm:^5.3.0": version: 5.6.0 resolution: "pretty-bytes@npm:5.6.0" checksum: 9c082500d1e93434b5b291bd651662936b8bd6204ec9fa17d563116a192d6d86b98f6d328526b4e8d783c07d5499e2614a807520249692da9ec81564b2f439cd @@ -36543,13 +36004,6 @@ __metadata: languageName: node linkType: hard -"progress@npm:2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 - languageName: node - linkType: hard - "prom-client@npm:^14.0.1": version: 14.2.0 resolution: "prom-client@npm:14.2.0" @@ -36735,31 +36189,13 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:1.0.0": - version: 1.0.0 - resolution: "proxy-from-env@npm:1.0.0" - checksum: 292e28d1de0c315958d71d8315eb546dd3cd8c8cbc2dab7c54eeb9f5c17f421771964ad0b5e1f77011bab2305bdae42e1757ce33bdb1ccc3e87732322a8efcf1 - languageName: node - linkType: hard - -"proxy-from-env@npm:1.1.0, proxy-from-env@npm:^1.1.0": +"proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 languageName: node linkType: hard -"ps-tree@npm:1.2.0": - version: 1.2.0 - resolution: "ps-tree@npm:1.2.0" - dependencies: - event-stream: =3.3.4 - bin: - ps-tree: ./bin/ps-tree.js - checksum: e635dd00f53d30d31696cf5f95b3a8dbdf9b1aeb36d4391578ce8e8cd22949b7c5536c73b0dc18c78615ea3ddd4be96101166be59ca2e3e3cb1e2f79ba3c7f98 - languageName: node - linkType: hard - "pseudomap@npm:^1.0.2": version: 1.0.2 resolution: "pseudomap@npm:1.0.2" @@ -36826,25 +36262,6 @@ __metadata: languageName: node linkType: hard -"puppeteer@npm:^17.0.0": - version: 17.1.3 - resolution: "puppeteer@npm:17.1.3" - dependencies: - cross-fetch: 3.1.5 - debug: 4.3.4 - devtools-protocol: 0.0.1036444 - extract-zip: 2.0.1 - https-proxy-agent: 5.0.1 - progress: 2.0.3 - proxy-from-env: 1.1.0 - rimraf: 3.0.2 - tar-fs: 2.1.1 - unbzip2-stream: 1.4.3 - ws: 8.8.1 - checksum: b4518956c661df4c37690d46b9c6744d42d59d01fe3764938b4b3af8de4c94ef11a9dfa6bc261798f5e5490c6dce4d4f555f05d42c735249683da3017faf4585 - languageName: node - linkType: hard - "pure-color@npm:^1.2.0": version: 1.3.0 resolution: "pure-color@npm:1.3.0" @@ -37082,20 +36499,6 @@ __metadata: languageName: node linkType: hard -"rc-progress@npm:3.4.2": - version: 3.4.2 - resolution: "rc-progress@npm:3.4.2" - dependencies: - "@babel/runtime": ^7.10.1 - classnames: ^2.2.6 - rc-util: ^5.16.1 - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 738aa7a7d00c1a550884bcfa55e0a55bad799f97207889bc9b43c17d2c1b66b6a42e75d635a1c6cdb1696d01f8dddcf8d7d0656356b5871b46b63343db96777b - languageName: node - linkType: hard - "rc-progress@npm:3.5.1": version: 3.5.1 resolution: "rc-progress@npm:3.5.1" @@ -37367,6 +36770,16 @@ __metadata: languageName: node linkType: hard +"react-idle-timer@npm:5.6.2": + version: 5.6.2 + resolution: "react-idle-timer@npm:5.6.2" + peerDependencies: + react: ">=16" + react-dom: ">=16" + checksum: 23c31be5490be8b22f21ba374e01b751eb845a0e37d077e6369d9a95cf45625ca43b7402f46c53dffaae9e55866920c30f2b1a316e0a9500f73ed91155dd0041 + languageName: node + linkType: hard + "react-immutable-proptypes@npm:2.2.0": version: 2.2.0 resolution: "react-immutable-proptypes@npm:2.2.0" @@ -38348,15 +37761,6 @@ __metadata: languageName: node linkType: hard -"request-progress@npm:^3.0.0": - version: 3.0.0 - resolution: "request-progress@npm:3.0.0" - dependencies: - throttleit: ^1.0.0 - checksum: 6ea1761dcc8a8b7b5894afd478c0286aa31bd69438d7050294bd4fd0d0b3e09b5cde417d38deef9c49809039c337d8744e4bb49d8632b0c3e4ffa5e8a687e0fd - languageName: node - linkType: hard - "request@npm:^2.88.0": version: 2.88.2 resolution: "request@npm:2.88.2" @@ -38651,17 +38055,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:3.0.2, rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - "rimraf@npm:^2.6.3": version: 2.7.1 resolution: "rimraf@npm:2.7.1" @@ -38673,6 +38066,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + "rimraf@npm:~2.6.2": version: 2.6.3 resolution: "rimraf@npm:2.6.3" @@ -38832,15 +38236,17 @@ __metadata: "@backstage/cli": "workspace:*" "@backstage/codemods": "workspace:*" "@backstage/create-app": "workspace:*" + "@backstage/e2e-test-utils": "workspace:*" "@backstage/errors": "workspace:^" "@backstage/repo-tools": "workspace:*" "@changesets/cli": ^2.14.0 "@manypkg/get-packages": ^1.1.3 "@octokit/rest": ^19.0.3 + "@playwright/test": ^1.32.3 "@spotify/eslint-plugin": ^14.1.3 "@spotify/prettier-config": ^14.0.0 "@techdocs/cli": "workspace:*" - "@types/node": ^16.11.26 + "@types/node": ^18.17.8 "@types/webpack": ^5.28.0 command-exists: ^1.2.9 concurrently: ^8.0.0 @@ -38945,7 +38351,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.2.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.0, rxjs@npm:^7.8.1": +"rxjs@npm:^7.2.0, rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -39208,7 +38614,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.3, semver@npm:~7.5.4": +"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:~7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: @@ -39408,23 +38814,6 @@ __metadata: languageName: node linkType: hard -"sharp@npm:0.32.1": - version: 0.32.1 - resolution: "sharp@npm:0.32.1" - dependencies: - color: ^4.2.3 - detect-libc: ^2.0.1 - node-addon-api: ^6.1.0 - node-gyp: latest - prebuild-install: ^7.1.1 - semver: ^7.5.0 - simple-get: ^4.0.1 - tar-fs: ^2.1.1 - tunnel-agent: ^0.6.0 - checksum: 99f50df380442aa8f3f952dd6f2e27634f9cab249cce47aa7f1a97c468334979ea94d71555f782aae5f5016e44b7832799f1c5ea1cb3ca975c089acd00e62e2e - languageName: node - linkType: hard - "shebang-command@npm:^1.2.0": version: 1.2.0 resolution: "shebang-command@npm:1.2.0" @@ -39947,15 +39336,6 @@ __metadata: languageName: node linkType: hard -"split@npm:0.3": - version: 0.3.3 - resolution: "split@npm:0.3.3" - dependencies: - through: 2 - checksum: 2e076634c9637cfdc54ab4387b6a243b8c33b360874a25adf6f327a5647f07cb3bf1c755d515248eb3afee4e382278d01f62c62d87263c118f28065b86f74f02 - languageName: node - linkType: hard - "split@npm:^1.0.0": version: 1.0.1 resolution: "split@npm:1.0.1" @@ -40022,7 +39402,7 @@ __metadata: languageName: node linkType: hard -"sshpk@npm:^1.14.1, sshpk@npm:^1.7.0": +"sshpk@npm:^1.7.0": version: 1.16.1 resolution: "sshpk@npm:1.16.1" dependencies: @@ -40144,26 +39524,6 @@ __metadata: languageName: node linkType: hard -"start-server-and-test@npm:^1.10.11": - version: 1.15.4 - resolution: "start-server-and-test@npm:1.15.4" - dependencies: - arg: ^5.0.2 - bluebird: 3.7.2 - check-more-types: 2.24.0 - debug: 4.3.4 - execa: 5.1.1 - lazy-ass: 1.6.0 - ps-tree: 1.2.0 - wait-on: 7.0.1 - bin: - server-test: src/bin/start.js - start-server-and-test: src/bin/start.js - start-test: src/bin/start.js - checksum: 0df9a4710ea45ddb1a9f719e0865faa8e26a973beff693dfe244ae2d914bfc6eed4d2db8529cdcad3d53658c4655356e5aca3520485a3ef4d9d9f320956b0e7d - languageName: node - linkType: hard - "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -40212,15 +39572,6 @@ __metadata: languageName: node linkType: hard -"stream-combiner@npm:~0.0.4": - version: 0.0.4 - resolution: "stream-combiner@npm:0.0.4" - dependencies: - duplexer: ~0.1.1 - checksum: 844b622cfe8b9de45a6007404f613b60aaf85200ab9862299066204242f89a7c8033b1c356c998aa6cfc630f6cd9eba119ec1c6dc1f93e245982be4a847aee7d - languageName: node - linkType: hard - "stream-events@npm:^1.0.5": version: 1.0.5 resolution: "stream-events@npm:1.0.5" @@ -40835,14 +40186,14 @@ __metadata: linkType: hard "swr@npm:^2.0.0": - version: 2.2.2 - resolution: "swr@npm:2.2.2" + version: 2.2.4 + resolution: "swr@npm:2.2.4" dependencies: client-only: ^0.0.1 use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: afb3d4824f7631bc3a045483f4e4beb5ca9bfa82b64690b3d1133cdf0666ad8e4a9a879657fac5b34dbf19ea9a1503cf92c9bde972f3d40cefe434c73bd9627a + checksum: d1398f89fd68af0e0cb6100a5769b1e17c0dbe8a778898643ad28456acda64add43344754c7d919e3f2ca82854adf86ff7d465aba25a2d555bcb669e457138f8 languageName: node linkType: hard @@ -40881,7 +40232,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:2.1.1, tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": +"tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": version: 2.1.1 resolution: "tar-fs@npm:2.1.1" dependencies: @@ -40980,14 +40331,11 @@ __metadata: "@types/react": "*" "@types/react-dom": "*" cross-env: ^7.0.0 - cypress: ^10.0.0 - eslint-plugin-cypress: ^2.10.3 history: ^5.0.0 react: ^17.0.2 react-dom: ^17.0.2 react-router-dom: ^6.3.0 react-use: ^17.2.4 - start-server-and-test: ^1.10.11 languageName: unknown linkType: soft @@ -41140,13 +40488,6 @@ __metadata: languageName: node linkType: hard -"throttleit@npm:^1.0.0": - version: 1.0.0 - resolution: "throttleit@npm:1.0.0" - checksum: 1b2db4d2454202d589e8236c07a69d2fab838876d370030ebea237c34c0a7d1d9cf11c29f994531ebb00efd31e9728291042b7754f2798a8352ec4463455b659 - languageName: node - linkType: hard - "through2@npm:^4.0.0": version: 4.0.2 resolution: "through2@npm:4.0.2" @@ -41156,7 +40497,7 @@ __metadata: languageName: node linkType: hard -"through@npm:2, through@npm:^2.3.6, through@npm:^2.3.8, through@npm:~2.3, through@npm:~2.3.1": +"through@npm:2, through@npm:^2.3.6, through@npm:^2.3.8": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd @@ -41248,7 +40589,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.0, tmp@npm:^0.2.1, tmp@npm:~0.2.1": +"tmp@npm:^0.2.0, tmp@npm:^0.2.1": version: 0.2.1 resolution: "tmp@npm:0.2.1" dependencies: @@ -41337,13 +40678,14 @@ __metadata: linkType: hard "tough-cookie@npm:^4.0.0": - version: 4.0.0 - resolution: "tough-cookie@npm:4.0.0" + version: 4.1.3 + resolution: "tough-cookie@npm:4.1.3" dependencies: psl: ^1.1.33 punycode: ^2.1.1 - universalify: ^0.1.2 - checksum: 0891b37eb7d17faa3479d47f0dce2e3007f2583094ad272f2670d120fbcc3df3b0b0a631ba96ecad49f9e2297d93ff8995ce0d3292d08dd7eabe162f5b224d69 + universalify: ^0.2.0 + url-parse: ^1.5.3 + checksum: c9226afff36492a52118432611af083d1d8493a53ff41ec4ea48e5b583aec744b989e4280bcf476c910ec1525a89a4a0f1cae81c08b18fb2ec3a9b3a72b91dcc languageName: node linkType: hard @@ -41937,16 +41279,6 @@ __metadata: languageName: node linkType: hard -"unbzip2-stream@npm:1.4.3": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" - dependencies: - buffer: ^5.2.1 - through: ^2.3.8 - checksum: 0e67c4a91f4fa0fc7b4045f8b914d3498c2fc2e8c39c359977708ec85ac6d6029840e97f508675fdbdf21fcb8d276ca502043406f3682b70f075e69aae626d1d - languageName: node - linkType: hard - "unc-path-regex@npm:^0.1.2": version: 0.1.2 resolution: "unc-path-regex@npm:0.1.2" @@ -42157,13 +41489,20 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.0, universalify@npm:^0.1.2": +"universalify@npm:^0.1.0": version: 0.1.2 resolution: "universalify@npm:0.1.2" checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff languageName: node linkType: hard +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 + languageName: node + linkType: hard + "universalify@npm:^2.0.0": version: 2.0.0 resolution: "universalify@npm:2.0.0" @@ -42249,7 +41588,7 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.10": +"url-parse@npm:^1.5.10, url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: @@ -42450,11 +41789,11 @@ __metadata: linkType: hard "uuid@npm:^9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" + version: 9.0.1 + resolution: "uuid@npm:9.0.1" bin: uuid: dist/bin/uuid - checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 languageName: node linkType: hard @@ -42737,21 +42076,6 @@ __metadata: languageName: node linkType: hard -"wait-on@npm:7.0.1": - version: 7.0.1 - resolution: "wait-on@npm:7.0.1" - dependencies: - axios: ^0.27.2 - joi: ^17.7.0 - lodash: ^4.17.21 - minimist: ^1.2.7 - rxjs: ^7.8.0 - bin: - wait-on: bin/wait-on - checksum: 1e8a17d8ee6436f71d3ab82781ce31267481fcd7bbccde49b0f8124871e6e40a1acac3401f04f775ba6203853a5813352fa131620fc139914351f3b2894d573f - languageName: node - linkType: hard - "walk-up-path@npm:^1.0.0": version: 1.0.0 resolution: "walk-up-path@npm:1.0.0" @@ -43333,21 +42657,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.8.1": - version: 8.8.1 - resolution: "ws@npm:8.8.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 2152cf862cae0693f3775bc688a6afb2e989d19d626d215e70f5fcd8eb55b1c3b0d3a6a4052905ec320e2d7734e20aeedbf9744496d62f15a26ad79cf4cf7dae - languageName: node - linkType: hard - "ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0, ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9" @@ -43364,8 +42673,8 @@ __metadata: linkType: hard "ws@npm:^8.11.0, ws@npm:^8.13.0, ws@npm:^8.8.0": - version: 8.14.1 - resolution: "ws@npm:8.14.1" + version: 8.14.2 + resolution: "ws@npm:8.14.2" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -43374,7 +42683,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 9e310be2b0ff69e1f87d8c6d093ecd17a1ed4c37f281d17c35e8c30e2bd116401775b3d503249651374e6e0e1e9905db62fff096b694371c77561aee06bc3466 + checksum: 3ca0dad26e8cc6515ff392b622a1467430814c463b3368b0258e33696b1d4bed7510bc7030f7b72838b9fdeb8dbd8839cbf808367d6aae2e1d668ce741d4308b languageName: node linkType: hard @@ -43517,6 +42826,15 @@ __metadata: languageName: node linkType: hard +"xterm-addon-attach@npm:^0.9.0": + version: 0.9.0 + resolution: "xterm-addon-attach@npm:0.9.0" + peerDependencies: + xterm: ^5.0.0 + checksum: 70e5d3ecf139c04fae13c644b79c33858ef1a6e28dfe78f91dad3e34f5a155579029b87e91d1d016575acaf17f74e6c59402bde4bcff03461595bea0870f1ec1 + languageName: node + linkType: hard + "xterm-addon-fit@npm:^0.7.0": version: 0.7.0 resolution: "xterm-addon-fit@npm:0.7.0" @@ -43526,10 +42844,19 @@ __metadata: languageName: node linkType: hard -"xterm@npm:^5.2.1": - version: 5.2.1 - resolution: "xterm@npm:5.2.1" - checksum: 3a9de30e772c7ae30895ec97fcfb3b0906429c5ea0cddf8948e8e30301385f82e467c6e6aca28ae50a48300ce795381d83fe35b4e17886ab4a1357054a15f68f +"xterm-addon-fit@npm:^0.8.0": + version: 0.8.0 + resolution: "xterm-addon-fit@npm:0.8.0" + peerDependencies: + xterm: ^5.0.0 + checksum: 5af2041b442f7c804eda2e6f62e3b68b5159b0ae6bd96e2aa8d85b26441df57291cbfed653d1196d4af5d9b94bfc39993df8b409a25c35e0d36bdaf6f5cdfe5f + languageName: node + linkType: hard + +"xterm@npm:^5.2.1, xterm@npm:^5.3.0": + version: 5.3.0 + resolution: "xterm@npm:5.3.0" + checksum: 1bdfdfe4cae4412128376180d85e476b43fb021cdd1114b18acad821c9ea44b5b600e0d88febf2b3572f38fad7741e5161ce0178a44369617cf937222cc6e011 languageName: node linkType: hard @@ -43882,13 +43209,6 @@ __metadata: languageName: node linkType: hard -"zod@npm:~3.21.4": - version: 3.21.4 - resolution: "zod@npm:3.21.4" - checksum: f185ba87342ff16f7a06686767c2b2a7af41110c7edf7c1974095d8db7a73792696bcb4a00853de0d2edeb34a5b2ea6a55871bc864227dace682a0a28de33e1f - languageName: node - linkType: hard - "zustand@npm:3.6.9": version: 3.6.9 resolution: "zustand@npm:3.6.9"