diff --git a/.changeset/brown-islands-own.md b/.changeset/brown-islands-own.md new file mode 100644 index 0000000000..d91ab89fd8 --- /dev/null +++ b/.changeset/brown-islands-own.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-azure-devops': patch +--- + +Fixed `AssignedToCurrentUsersTeams` & `CreatedByCurrentUsersTeams` filter in `AzurePullRequestsPage` component. diff --git a/.changeset/eight-dragons-accept.md b/.changeset/eight-dragons-accept.md deleted file mode 100644 index a3d46de4a3..0000000000 --- a/.changeset/eight-dragons-accept.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -rollback `@rjsf/validator-ajv8` to `@rjsf/validator-v6` diff --git a/.changeset/eight-falcons-explode.md b/.changeset/eight-falcons-explode.md new file mode 100644 index 0000000000..d9a1a2fe1f --- /dev/null +++ b/.changeset/eight-falcons-explode.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Fixed an issue were the log redaction didn't properly escape RegExp characters. diff --git a/.changeset/flat-cups-itch.md b/.changeset/flat-cups-itch.md new file mode 100644 index 0000000000..250393c21a --- /dev/null +++ b/.changeset/flat-cups-itch.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +lock versions of `@rjsf/*-beta` packages diff --git a/.changeset/fluffy-forks-happen.md b/.changeset/fluffy-forks-happen.md deleted file mode 100644 index 4c9c2217ba..0000000000 --- a/.changeset/fluffy-forks-happen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-explore-backend': patch ---- - -Bump `msw` to `^0.49.0` diff --git a/.changeset/lazy-badgers-rule.md b/.changeset/lazy-badgers-rule.md new file mode 100644 index 0000000000..748b9dbadc --- /dev/null +++ b/.changeset/lazy-badgers-rule.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend-module-jsonfc': patch +--- + +Surface the cause of the json rules engine diff --git a/.changeset/perfect-cheetahs-serve.md b/.changeset/perfect-cheetahs-serve.md new file mode 100644 index 0000000000..08f7c1da21 --- /dev/null +++ b/.changeset/perfect-cheetahs-serve.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Added the option to overwrite files in the `targetPath` of the `template:fetch` action diff --git a/.changeset/pink-falcons-serve.md b/.changeset/pink-falcons-serve.md new file mode 100644 index 0000000000..8cc6859c25 --- /dev/null +++ b/.changeset/pink-falcons-serve.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder': minor +'@backstage/plugin-scaffolder-react': minor +--- + +Embed scaffolder workflow in other components diff --git a/.changeset/pre.json b/.changeset/pre.json index 30f0c873c4..9f9a48e8dc 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -2,197 +2,199 @@ "mode": "pre", "tag": "next", "initialVersions": { - "example-app": "0.2.78", - "@backstage/app-defaults": "1.0.9", - "example-backend": "0.2.78", - "@backstage/backend-app-api": "0.2.4", - "@backstage/backend-common": "0.17.0", - "@backstage/backend-defaults": "0.1.4", - "example-backend-next": "0.0.6", - "@backstage/backend-plugin-api": "0.2.0", - "@backstage/backend-tasks": "0.4.0", - "@backstage/backend-test-utils": "0.1.31", - "@backstage/catalog-client": "1.2.0", - "@backstage/catalog-model": "1.1.4", - "@backstage/cli": "0.22.0", + "example-app": "0.2.79", + "@backstage/app-defaults": "1.1.0", + "example-backend": "0.2.79", + "@backstage/backend-app-api": "0.3.0", + "@backstage/backend-common": "0.18.0", + "@backstage/backend-defaults": "0.1.5", + "example-backend-next": "0.0.7", + "@backstage/backend-plugin-api": "0.3.0", + "@backstage/backend-tasks": "0.4.1", + "@backstage/backend-test-utils": "0.1.32", + "@backstage/catalog-client": "1.3.0", + "@backstage/catalog-model": "1.1.5", + "@backstage/cli": "0.22.1", "@backstage/cli-common": "0.1.11", "@backstage/codemods": "0.1.42", - "@backstage/config": "1.0.5", - "@backstage/config-loader": "1.1.7", - "@backstage/core-app-api": "1.3.0", - "@backstage/core-components": "0.12.1", - "@backstage/core-plugin-api": "1.2.0", - "@backstage/create-app": "0.4.35", - "@backstage/dev-utils": "1.0.9", + "@backstage/config": "1.0.6", + "@backstage/config-loader": "1.1.8", + "@backstage/core-app-api": "1.4.0", + "@backstage/core-components": "0.12.3", + "@backstage/core-plugin-api": "1.3.0", + "@backstage/create-app": "0.4.36", + "@backstage/dev-utils": "1.0.11", "e2e-test": "0.2.0", "@backstage/errors": "1.1.4", - "@backstage/integration": "1.4.1", - "@backstage/integration-aws-node": "0.1.0", - "@backstage/integration-react": "1.1.7", + "@backstage/integration": "1.4.2", + "@backstage/integration-aws-node": "0.1.1", + "@backstage/integration-react": "1.1.9", "@backstage/release-manifests": "0.0.8", - "@backstage/repo-tools": "0.1.0", - "@techdocs/cli": "1.2.4", - "techdocs-cli-embedded-app": "0.2.77", - "@backstage/test-utils": "1.2.3", + "@backstage/repo-tools": "0.1.1", + "@techdocs/cli": "1.3.0", + "techdocs-cli-embedded-app": "0.2.78", + "@backstage/test-utils": "1.2.4", "@backstage/theme": "0.2.16", "@backstage/types": "1.0.2", "@backstage/version-bridge": "1.0.3", - "@backstage/plugin-adr": "0.2.4", - "@backstage/plugin-adr-backend": "0.2.4", - "@backstage/plugin-adr-common": "0.2.4", - "@backstage/plugin-airbrake": "0.3.12", - "@backstage/plugin-airbrake-backend": "0.2.12", - "@backstage/plugin-allure": "0.1.28", - "@backstage/plugin-analytics-module-ga": "0.1.23", - "@backstage/plugin-apache-airflow": "0.2.5", - "@backstage/plugin-api-docs": "0.8.12", + "@backstage/plugin-adr": "0.3.0", + "@backstage/plugin-adr-backend": "0.2.5", + "@backstage/plugin-adr-common": "0.2.5", + "@backstage/plugin-airbrake": "0.3.14", + "@backstage/plugin-airbrake-backend": "0.2.13", + "@backstage/plugin-allure": "0.1.30", + "@backstage/plugin-analytics-module-ga": "0.1.25", + "@backstage/plugin-apache-airflow": "0.2.7", + "@backstage/plugin-api-docs": "0.8.14", "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.0", - "@backstage/plugin-apollo-explorer": "0.1.5", - "@backstage/plugin-app-backend": "0.3.39", - "@backstage/plugin-auth-backend": "0.17.2", - "@backstage/plugin-auth-node": "0.2.8", - "@backstage/plugin-azure-devops": "0.2.3", - "@backstage/plugin-azure-devops-backend": "0.3.18", + "@backstage/plugin-apollo-explorer": "0.1.7", + "@backstage/plugin-app-backend": "0.3.40", + "@backstage/plugin-auth-backend": "0.17.3", + "@backstage/plugin-auth-node": "0.2.9", + "@backstage/plugin-azure-devops": "0.2.5", + "@backstage/plugin-azure-devops-backend": "0.3.19", "@backstage/plugin-azure-devops-common": "0.3.0", - "@backstage/plugin-azure-sites": "0.1.1", - "@backstage/plugin-azure-sites-backend": "0.1.1", + "@backstage/plugin-azure-sites": "0.1.3", + "@backstage/plugin-azure-sites-backend": "0.1.2", "@backstage/plugin-azure-sites-common": "0.1.0", - "@backstage/plugin-badges": "0.2.36", - "@backstage/plugin-badges-backend": "0.1.33", - "@backstage/plugin-bazaar": "0.2.1", - "@backstage/plugin-bazaar-backend": "0.2.2", - "@backstage/plugin-bitbucket-cloud-common": "0.2.2", - "@backstage/plugin-bitrise": "0.1.39", - "@backstage/plugin-catalog": "1.7.0", - "@backstage/plugin-catalog-backend": "1.6.0", - "@backstage/plugin-catalog-backend-module-aws": "0.1.12", - "@backstage/plugin-catalog-backend-module-azure": "0.1.10", - "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.6", - "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.6", - "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.4", - "@backstage/plugin-catalog-backend-module-gerrit": "0.1.7", - "@backstage/plugin-catalog-backend-module-github": "0.2.2", - "@backstage/plugin-catalog-backend-module-gitlab": "0.1.10", - "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.1.0", - "@backstage/plugin-catalog-backend-module-ldap": "0.5.6", - "@backstage/plugin-catalog-backend-module-msgraph": "0.4.5", - "@backstage/plugin-catalog-backend-module-openapi": "0.1.5", - "@backstage/plugin-catalog-common": "1.0.9", - "@internal/plugin-catalog-customized": "0.0.5", - "@backstage/plugin-catalog-graph": "0.2.24", - "@backstage/plugin-catalog-graphql": "0.3.16", - "@backstage/plugin-catalog-import": "0.9.2", - "@backstage/plugin-catalog-node": "1.3.0", - "@backstage/plugin-catalog-react": "1.2.2", - "@backstage/plugin-cicd-statistics": "0.1.14", - "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.8", - "@backstage/plugin-circleci": "0.3.12", - "@backstage/plugin-cloudbuild": "0.3.12", - "@backstage/plugin-code-climate": "0.1.12", - "@backstage/plugin-code-coverage": "0.2.5", - "@backstage/plugin-code-coverage-backend": "0.2.5", - "@backstage/plugin-codescene": "0.1.7", - "@backstage/plugin-config-schema": "0.1.35", - "@backstage/plugin-cost-insights": "0.12.1", + "@backstage/plugin-badges": "0.2.38", + "@backstage/plugin-badges-backend": "0.1.34", + "@backstage/plugin-bazaar": "0.2.3", + "@backstage/plugin-bazaar-backend": "0.2.3", + "@backstage/plugin-bitbucket-cloud-common": "0.2.3", + "@backstage/plugin-bitrise": "0.1.41", + "@backstage/plugin-catalog": "1.7.2", + "@backstage/plugin-catalog-backend": "1.7.0", + "@backstage/plugin-catalog-backend-module-aws": "0.1.13", + "@backstage/plugin-catalog-backend-module-azure": "0.1.11", + "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.7", + "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.7", + "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.5", + "@backstage/plugin-catalog-backend-module-gerrit": "0.1.8", + "@backstage/plugin-catalog-backend-module-github": "0.2.3", + "@backstage/plugin-catalog-backend-module-gitlab": "0.1.11", + "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.1.1", + "@backstage/plugin-catalog-backend-module-ldap": "0.5.7", + "@backstage/plugin-catalog-backend-module-msgraph": "0.4.6", + "@backstage/plugin-catalog-backend-module-openapi": "0.1.6", + "@backstage/plugin-catalog-common": "1.0.10", + "@internal/plugin-catalog-customized": "0.0.6", + "@backstage/plugin-catalog-graph": "0.2.26", + "@backstage/plugin-catalog-graphql": "0.3.17", + "@backstage/plugin-catalog-import": "0.9.4", + "@backstage/plugin-catalog-node": "1.3.1", + "@backstage/plugin-catalog-react": "1.2.4", + "@backstage/plugin-cicd-statistics": "0.1.16", + "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.10", + "@backstage/plugin-circleci": "0.3.14", + "@backstage/plugin-cloudbuild": "0.3.14", + "@backstage/plugin-code-climate": "0.1.14", + "@backstage/plugin-code-coverage": "0.2.7", + "@backstage/plugin-code-coverage-backend": "0.2.6", + "@backstage/plugin-codescene": "0.1.9", + "@backstage/plugin-config-schema": "0.1.37", + "@backstage/plugin-cost-insights": "0.12.3", "@backstage/plugin-cost-insights-common": "0.1.1", - "@backstage/plugin-dynatrace": "1.0.2", - "@backstage/plugin-events-backend": "0.2.0", - "@backstage/plugin-events-backend-module-aws-sqs": "0.1.1", - "@backstage/plugin-events-backend-module-azure": "0.1.1", - "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.1", - "@backstage/plugin-events-backend-module-gerrit": "0.1.1", - "@backstage/plugin-events-backend-module-github": "0.1.1", - "@backstage/plugin-events-backend-module-gitlab": "0.1.1", - "@backstage/plugin-events-backend-test-utils": "0.1.1", - "@backstage/plugin-events-node": "0.2.0", - "@internal/plugin-todo-list": "1.0.8", - "@internal/plugin-todo-list-backend": "1.0.8", - "@internal/plugin-todo-list-common": "1.0.7", - "@backstage/plugin-explore": "0.3.43", - "@backstage/plugin-explore-backend": "0.0.1", + "@backstage/plugin-dynatrace": "1.0.4", + "@backstage/plugin-events-backend": "0.2.1", + "@backstage/plugin-events-backend-module-aws-sqs": "0.1.2", + "@backstage/plugin-events-backend-module-azure": "0.1.2", + "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.2", + "@backstage/plugin-events-backend-module-gerrit": "0.1.2", + "@backstage/plugin-events-backend-module-github": "0.1.2", + "@backstage/plugin-events-backend-module-gitlab": "0.1.2", + "@backstage/plugin-events-backend-test-utils": "0.1.2", + "@backstage/plugin-events-node": "0.2.1", + "@internal/plugin-todo-list": "1.0.9", + "@internal/plugin-todo-list-backend": "1.0.9", + "@internal/plugin-todo-list-common": "1.0.8", + "@backstage/plugin-explore": "0.3.45", + "@backstage/plugin-explore-backend": "0.0.2", "@backstage/plugin-explore-common": "0.0.1", - "@backstage/plugin-explore-react": "0.0.24", - "@backstage/plugin-firehydrant": "0.1.29", - "@backstage/plugin-fossa": "0.2.44", - "@backstage/plugin-gcalendar": "0.3.8", - "@backstage/plugin-gcp-projects": "0.3.31", - "@backstage/plugin-git-release-manager": "0.3.25", - "@backstage/plugin-github-actions": "0.5.12", - "@backstage/plugin-github-deployments": "0.1.43", - "@backstage/plugin-github-issues": "0.2.1", - "@backstage/plugin-github-pull-requests-board": "0.1.6", - "@backstage/plugin-gitops-profiles": "0.3.30", - "@backstage/plugin-gocd": "0.1.18", - "@backstage/plugin-graphiql": "0.2.44", - "@backstage/plugin-graphql-backend": "0.1.29", - "@backstage/plugin-home": "0.4.28", - "@backstage/plugin-ilert": "0.2.1", - "@backstage/plugin-jenkins": "0.7.11", - "@backstage/plugin-jenkins-backend": "0.1.29", - "@backstage/plugin-jenkins-common": "0.1.11", - "@backstage/plugin-kafka": "0.3.12", - "@backstage/plugin-kafka-backend": "0.2.32", - "@backstage/plugin-kubernetes": "0.7.5", - "@backstage/plugin-kubernetes-backend": "0.9.0", - "@backstage/plugin-kubernetes-common": "0.5.0", - "@backstage/plugin-lighthouse": "0.3.12", - "@backstage/plugin-newrelic": "0.3.30", - "@backstage/plugin-newrelic-dashboard": "0.2.5", - "@backstage/plugin-org": "0.6.2", - "@backstage/plugin-org-react": "0.1.1", - "@backstage/plugin-pagerduty": "0.5.5", - "@backstage/plugin-periskop": "0.1.10", - "@backstage/plugin-periskop-backend": "0.1.10", - "@backstage/plugin-permission-backend": "0.5.14", - "@backstage/plugin-permission-common": "0.7.2", - "@backstage/plugin-permission-node": "0.7.2", - "@backstage/plugin-permission-react": "0.4.8", - "@backstage/plugin-playlist": "0.1.3", - "@backstage/plugin-playlist-backend": "0.2.2", - "@backstage/plugin-playlist-common": "0.1.3", - "@backstage/plugin-proxy-backend": "0.2.33", - "@backstage/plugin-rollbar": "0.4.12", - "@backstage/plugin-rollbar-backend": "0.1.36", - "@backstage/plugin-scaffolder": "1.9.0", - "@backstage/plugin-scaffolder-backend": "1.9.0", - "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.14", - "@backstage/plugin-scaffolder-backend-module-rails": "0.4.7", - "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.12", - "@backstage/plugin-scaffolder-common": "1.2.3", - "@backstage/plugin-search": "1.0.5", - "@backstage/plugin-search-backend": "1.2.0", - "@backstage/plugin-search-backend-module-elasticsearch": "1.1.0", - "@backstage/plugin-search-backend-module-pg": "0.5.0", - "@backstage/plugin-search-backend-node": "1.1.0", - "@backstage/plugin-search-common": "1.2.0", - "@backstage/plugin-search-react": "1.3.0", - "@backstage/plugin-sentry": "0.4.5", - "@backstage/plugin-shortcuts": "0.3.4", - "@backstage/plugin-sonarqube": "0.6.0", - "@backstage/plugin-sonarqube-backend": "0.1.4", - "@backstage/plugin-sonarqube-react": "0.1.0", - "@backstage/plugin-splunk-on-call": "0.4.1", - "@backstage/plugin-stack-overflow": "0.1.8", - "@backstage/plugin-stack-overflow-backend": "0.1.8", - "@backstage/plugin-tech-insights": "0.3.4", - "@backstage/plugin-tech-insights-backend": "0.5.5", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.23", + "@backstage/plugin-explore-react": "0.0.25", + "@backstage/plugin-firehydrant": "0.1.31", + "@backstage/plugin-fossa": "0.2.46", + "@backstage/plugin-gcalendar": "0.3.10", + "@backstage/plugin-gcp-projects": "0.3.33", + "@backstage/plugin-git-release-manager": "0.3.27", + "@backstage/plugin-github-actions": "0.5.14", + "@backstage/plugin-github-deployments": "0.1.45", + "@backstage/plugin-github-issues": "0.2.3", + "@backstage/plugin-github-pull-requests-board": "0.1.8", + "@backstage/plugin-gitops-profiles": "0.3.32", + "@backstage/plugin-gocd": "0.1.20", + "@backstage/plugin-graphiql": "0.2.46", + "@backstage/plugin-graphql-backend": "0.1.30", + "@backstage/plugin-home": "0.4.30", + "@backstage/plugin-ilert": "0.2.3", + "@backstage/plugin-jenkins": "0.7.13", + "@backstage/plugin-jenkins-backend": "0.1.30", + "@backstage/plugin-jenkins-common": "0.1.12", + "@backstage/plugin-kafka": "0.3.14", + "@backstage/plugin-kafka-backend": "0.2.33", + "@backstage/plugin-kubernetes": "0.7.7", + "@backstage/plugin-kubernetes-backend": "0.9.1", + "@backstage/plugin-kubernetes-common": "0.5.1", + "@backstage/plugin-lighthouse": "0.3.14", + "@backstage/plugin-newrelic": "0.3.32", + "@backstage/plugin-newrelic-dashboard": "0.2.7", + "@backstage/plugin-org": "0.6.4", + "@backstage/plugin-org-react": "0.1.3", + "@backstage/plugin-pagerduty": "0.5.7", + "@backstage/plugin-periskop": "0.1.12", + "@backstage/plugin-periskop-backend": "0.1.11", + "@backstage/plugin-permission-backend": "0.5.15", + "@backstage/plugin-permission-common": "0.7.3", + "@backstage/plugin-permission-node": "0.7.3", + "@backstage/plugin-permission-react": "0.4.9", + "@backstage/plugin-playlist": "0.1.5", + "@backstage/plugin-playlist-backend": "0.2.3", + "@backstage/plugin-playlist-common": "0.1.4", + "@backstage/plugin-proxy-backend": "0.2.34", + "@backstage/plugin-rollbar": "0.4.14", + "@backstage/plugin-rollbar-backend": "0.1.37", + "@backstage/plugin-scaffolder": "1.10.0", + "@backstage/plugin-scaffolder-backend": "1.10.0", + "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.15", + "@backstage/plugin-scaffolder-backend-module-rails": "0.4.8", + "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.0", + "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.13", + "@backstage/plugin-scaffolder-common": "1.2.4", + "@backstage/plugin-scaffolder-react": "1.0.0", + "@backstage/plugin-search": "1.0.7", + "@backstage/plugin-search-backend": "1.2.1", + "@backstage/plugin-search-backend-module-elasticsearch": "1.1.1", + "@backstage/plugin-search-backend-module-pg": "0.5.1", + "@backstage/plugin-search-backend-node": "1.1.1", + "@backstage/plugin-search-common": "1.2.1", + "@backstage/plugin-search-react": "1.4.0", + "@backstage/plugin-sentry": "0.4.7", + "@backstage/plugin-shortcuts": "0.3.6", + "@backstage/plugin-sonarqube": "0.6.2", + "@backstage/plugin-sonarqube-backend": "0.1.5", + "@backstage/plugin-sonarqube-react": "0.1.1", + "@backstage/plugin-splunk-on-call": "0.4.3", + "@backstage/plugin-stack-overflow": "0.1.10", + "@backstage/plugin-stack-overflow-backend": "0.1.9", + "@backstage/plugin-tech-insights": "0.3.6", + "@backstage/plugin-tech-insights-backend": "0.5.6", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.24", "@backstage/plugin-tech-insights-common": "0.2.9", - "@backstage/plugin-tech-insights-node": "0.3.7", - "@backstage/plugin-tech-radar": "0.5.19", - "@backstage/plugin-techdocs": "1.4.1", - "@backstage/plugin-techdocs-addons-test-utils": "1.0.7", - "@backstage/plugin-techdocs-backend": "1.5.0", - "@backstage/plugin-techdocs-module-addons-contrib": "1.0.7", - "@backstage/plugin-techdocs-node": "1.4.3", - "@backstage/plugin-techdocs-react": "1.1.0", - "@backstage/plugin-todo": "0.2.14", - "@backstage/plugin-todo-backend": "0.1.36", - "@backstage/plugin-user-settings": "0.6.0", - "@backstage/plugin-user-settings-backend": "0.1.3", - "@backstage/plugin-vault": "0.1.6", - "@backstage/plugin-vault-backend": "0.2.5", - "@backstage/plugin-xcmetrics": "0.2.32" + "@backstage/plugin-tech-insights-node": "0.3.8", + "@backstage/plugin-tech-radar": "0.6.0", + "@backstage/plugin-techdocs": "1.4.3", + "@backstage/plugin-techdocs-addons-test-utils": "1.0.9", + "@backstage/plugin-techdocs-backend": "1.5.1", + "@backstage/plugin-techdocs-module-addons-contrib": "1.0.9", + "@backstage/plugin-techdocs-node": "1.4.4", + "@backstage/plugin-techdocs-react": "1.1.2", + "@backstage/plugin-todo": "0.2.16", + "@backstage/plugin-todo-backend": "0.1.37", + "@backstage/plugin-user-settings": "0.6.2", + "@backstage/plugin-user-settings-backend": "0.1.4", + "@backstage/plugin-vault": "0.1.8", + "@backstage/plugin-vault-backend": "0.2.6", + "@backstage/plugin-xcmetrics": "0.2.34" }, "changesets": [] } diff --git a/.changeset/spotty-coats-clean.md b/.changeset/spotty-coats-clean.md new file mode 100644 index 0000000000..1a48da5688 --- /dev/null +++ b/.changeset/spotty-coats-clean.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-adr': patch +--- + +Render the common `` component when the `backstage.io/adr-location` annotation is missing from the component diff --git a/.changeset/tasty-impalas-mix.md b/.changeset/tasty-impalas-mix.md deleted file mode 100644 index c830c45c56..0000000000 --- a/.changeset/tasty-impalas-mix.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fixed an issue where internal references in the catalog would stick around for longer than expected, causing entities to not be deleted or orphaned as expected. diff --git a/.eslintrc.js b/.eslintrc.js index cf01ffe3a6..1616404a6f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -247,6 +247,11 @@ module.exports = { { forbid: [ { element: 'button', message: 'use MUI + +); +Default.args = defaultArgs; + +export const User = (args: EntityPeekAheadPopoverProps) => ( + + + +); +User.args = { + entityRef: 'user:default/fname.lname', +}; + +export const NotFound = (args: EntityPeekAheadPopoverProps) => ( + + + +); +NotFound.args = { + entityRef: 'user:default/doesnt.exist', +}; + +export const SlowCatalogItem = (args: EntityPeekAheadPopoverProps) => ( + + + +); +SlowCatalogItem.args = { + entityRef: 'component:default/slow.catalog.item', +}; + +const columns: TableColumn[] = [ + { + title: 'entity', + render: entityRef => { + return ( + + + + ); + }, + }, + { + title: 'owner', + render: () => { + return ( + + + + ); + }, + }, + { + title: 'name', + render: entityRef => stringifyEntityRef(entityRef), + }, +]; +export const TableOfItems = (args: { data: CompoundEntityRef[] }) => ( + +); + +TableOfItems.args = { + data: [ + { + name: 'playback', + kind: 'component', + namespace: 'default', + }, + { + name: 'playback', + kind: 'component', + namespace: 'default', + }, + { + name: 'playback', + kind: 'component', + namespace: 'default', + }, + ], +}; diff --git a/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.test.tsx b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.test.tsx new file mode 100644 index 0000000000..f665ca6c00 --- /dev/null +++ b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.test.tsx @@ -0,0 +1,79 @@ +/* + * 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 { screen } from '@testing-library/react'; +import user from '@testing-library/user-event'; +import React from 'react'; +import { EntityPeekAheadPopover } from './EntityPeekAheadPopover'; +import { ApiProvider } from '@backstage/core-app-api'; +import { TestApiRegistry, renderInTestApp } from '@backstage/test-utils'; +import { catalogApiRef } from '../../api'; +import { Entity } from '@backstage/catalog-model'; +import { CatalogApi } from '@backstage/catalog-client'; +import { Button } from '@material-ui/core'; +import { entityRouteRef } from '../../routes'; + +const catalogApi: Partial = { + getEntityByRef: async (entityRef: string): Promise => { + if (entityRef === 'component:default/service1') { + return { + apiVersion: '', + kind: 'Component', + metadata: { + namespace: 'default', + name: 'service1', + }, + spec: { + tags: ['java'], + }, + }; + } + return undefined; + }, +}; + +const apis = TestApiRegistry.from([catalogApiRef, catalogApi]); + +describe('', () => { + it('renders all owners', async () => { + renderInTestApp( + + + + + + + + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }, + ); + expect(screen.getByText('s1')).toBeInTheDocument(); + expect(screen.queryByText('service1')).toBeNull(); + user.hover(screen.getByTestId('popover1')); + expect(await screen.findByText('service1')).toBeInTheDocument(); + + expect(screen.getByText('s2')).toBeInTheDocument(); + expect(screen.queryByText('service2')).toBeNull(); + user.hover(screen.getByTestId('popover2')); + expect( + await screen.findByText('Error: component:default/service2 not found'), + ).toBeInTheDocument(); + }); +}); diff --git a/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.tsx b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.tsx new file mode 100644 index 0000000000..91d60d4f13 --- /dev/null +++ b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.tsx @@ -0,0 +1,200 @@ +/* + * 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 useAsyncFn from 'react-use/lib/useAsyncFn'; +import { catalogApiRef } from '../../api'; +import React, { PropsWithChildren, useEffect, useMemo, useState } from 'react'; +import HoverPopover from 'material-ui-popup-state/HoverPopover'; +import { + bindHover, + bindPopover, + usePopupState, +} from 'material-ui-popup-state/hooks'; +import { + Box, + Card, + CardActions, + CardContent, + Chip, + makeStyles, + Tooltip, + Typography, +} from '@material-ui/core'; +import { useApiHolder } from '@backstage/core-plugin-api'; +import { isGroupEntity, isUserEntity } from '@backstage/catalog-model'; +import { Progress, ResponseErrorPanel } from '@backstage/core-components'; +import { + EntityCardActions, + UserCardActions, + GroupCardActions, +} from './CardActionComponents'; +import { debounce } from 'lodash'; + +/** + * Properties for an entity popover on hover of a component. + * + * @public + */ +export type EntityPeekAheadPopoverProps = PropsWithChildren<{ + entityRef: string; + delayTime?: number; +}>; + +const useStyles = makeStyles(() => { + return { + popoverPaper: { + width: '30em', + }, + descriptionTypography: { + overflow: 'hidden', + textOverflow: 'ellipsis', + display: '-webkit-box', + WebkitLineClamp: 2, + WebkitBoxOrient: 'vertical', + }, + }; +}); + +const maxTagChips = 4; + +/** + * Shows an entity popover on hover of a component. + * + * @public + */ +export const EntityPeekAheadPopover = (props: EntityPeekAheadPopoverProps) => { + const { entityRef, children, delayTime = 500 } = props; + + const classes = useStyles(); + const apiHolder = useApiHolder(); + const popupState = usePopupState({ + variant: 'popover', + popupId: 'entity-peek-ahead', + }); + const [isHovered, setIsHovered] = useState(false); + + const debouncedHandleMouseEnter = useMemo( + () => debounce(() => setIsHovered(true), delayTime), + [delayTime], + ); + + const [{ loading, error, value: entity }, load] = useAsyncFn(async () => { + const catalogApi = apiHolder.get(catalogApiRef); + if (catalogApi) { + const retrievedEntity = await catalogApi.getEntityByRef(entityRef); + if (!retrievedEntity) { + throw new Error(`${entityRef} not found`); + } + return retrievedEntity; + } + return undefined; + }, [apiHolder, entityRef]); + + const handleOnMouseLeave = () => { + setIsHovered(false); + debouncedHandleMouseEnter.cancel(); + }; + + useEffect(() => { + if (popupState.isOpen && !entity && !error && !loading) { + load(); + } + }, [popupState.isOpen, load, entity, error, loading]); + + return ( + <> + + + {children} + + + {isHovered && ( + + + + {error && } + {loading && } + {entity && ( + <> + + {entity.metadata.namespace} + + + {entity.metadata.name} + + + {entity.kind} + + {entity.metadata.description && ( + + {entity.metadata.description} + + )} + {entity.spec?.type} + + {(entity.metadata.tags || []) + .slice(0, maxTagChips) + .map(tag => { + return ; + })} + {entity.metadata.tags?.length && + entity.metadata.tags?.length > maxTagChips && ( + + + + )} + + + )} + + {!error && entity && ( + + <> + {isUserEntity(entity) && } + {isGroupEntity(entity) && ( + + )} + + + + )} + + + )} + + ); +}; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/index.ts b/plugins/catalog-react/src/components/EntityPeekAheadPopover/index.ts similarity index 93% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/index.ts rename to plugins/catalog-react/src/components/EntityPeekAheadPopover/index.ts index 5532563e28..6630f6f555 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/index.ts +++ b/plugins/catalog-react/src/components/EntityPeekAheadPopover/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { Stepper } from './Stepper'; +export * from './EntityPeekAheadPopover'; diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.stories.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.stories.tsx new file mode 100644 index 0000000000..e82c4ab963 --- /dev/null +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLink.stories.tsx @@ -0,0 +1,41 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { ComponentType } from 'react'; +import { EntityRefLink, EntityRefLinkProps } from './EntityRefLink'; +import { wrapInTestApp } from '@backstage/test-utils'; +import { entityRouteRef } from '../../routes'; + +const defaultArgs = { + entityRef: 'component:default/playback', +}; + +export default { + title: 'Catalog /EntityRefLink', + decorators: [ + (Story: ComponentType<{}>) => + wrapInTestApp(, { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }), + ], +}; + +export const Default = (args: EntityRefLinkProps) => ( + +); +Default.args = defaultArgs; diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLinks.stories.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLinks.stories.tsx new file mode 100644 index 0000000000..176dd24530 --- /dev/null +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLinks.stories.tsx @@ -0,0 +1,42 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { ComponentType } from 'react'; +import { EntityRefLinks, EntityRefLinksProps } from './EntityRefLinks'; +import { wrapInTestApp } from '@backstage/test-utils'; +import { CompoundEntityRef } from '@backstage/catalog-model'; +import { entityRouteRef } from '../../routes'; + +const defaultArgs = { + entityRefs: ['component:default/playback', 'user:default/fname.lname'], +}; + +export default { + title: 'Catalog /EntityRefLinks', + decorators: [ + (Story: ComponentType<{}>) => + wrapInTestApp(, { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }), + ], +}; + +export const Default = ( + args: EntityRefLinksProps, +) => ; +Default.args = defaultArgs; diff --git a/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.test.tsx b/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.test.tsx index 7da357d806..de7bbb89be 100644 --- a/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.test.tsx @@ -202,4 +202,33 @@ describe('', () => { tags: new EntityTagFilter(['tag2']), }); }); + it('removes tags from filters if there are none available', async () => { + const updateFilters = jest.fn(); + const mockCatalogApiRefNoTags = { + getEntityFacets: async () => ({ + facets: { + 'metadata.tags': {}, + }, + }), + } as unknown as CatalogApi; + + render( + + + + + , + , + ); + await waitFor(() => + expect(updateFilters).toHaveBeenLastCalledWith({ + tags: undefined, + }), + ); + }); }); diff --git a/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.tsx b/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.tsx index 25f02e8adc..4a1dc03e96 100644 --- a/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.tsx +++ b/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.tsx @@ -93,10 +93,14 @@ export const EntityTagPicker = (props: EntityTagPickerProps) => { }, [queryParamTags]); useEffect(() => { + const tags = Object.keys(availableTags ?? {}); updateFilters({ - tags: selectedTags.length ? new EntityTagFilter(selectedTags) : undefined, + tags: + selectedTags.length && tags.length + ? new EntityTagFilter(selectedTags) + : undefined, }); - }, [selectedTags, updateFilters]); + }, [selectedTags, updateFilters, availableTags]); if (!Object.keys(availableTags ?? {}).length) return null; diff --git a/plugins/catalog-react/src/components/index.ts b/plugins/catalog-react/src/components/index.ts index c604306ead..a4380ddef0 100644 --- a/plugins/catalog-react/src/components/index.ts +++ b/plugins/catalog-react/src/components/index.ts @@ -19,6 +19,7 @@ export * from './EntityKindPicker'; export * from './EntityLifecyclePicker'; export * from './EntityOwnerPicker'; export * from './EntityRefLink'; +export * from './EntityPeekAheadPopover'; export * from './EntitySearchBar'; export * from './EntityTable'; export * from './EntityTagPicker'; diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 4bad115735..e28bf69da0 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,89 @@ # @backstage/plugin-catalog +## 1.7.2 + +### Patch Changes + +- cebe24ef1d: Add `EntityLabelsCard` to show the labels for an entity. +- 5353b4df61: There is now tooltip in the entity context menu +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-search-react@1.4.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration-react@1.1.9 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.10 + - @backstage/plugin-search-common@1.2.1 + +## 1.7.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/integration-react@1.1.9-next.2 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.7.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration-react@1.1.9-next.1 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-search-react@1.3.2-next.1 + +## 1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/integration-react@1.1.9-next.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.10-next.0 + - @backstage/plugin-search-common@1.2.0 + - @backstage/plugin-search-react@1.3.2-next.0 + +## 1.7.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/integration-react@1.1.8 + - @backstage/plugin-catalog-react@1.2.3 + - @backstage/plugin-search-react@1.3.1 + ## 1.7.0 ### Minor Changes diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index 74f64882a8..82df851239 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -277,6 +277,17 @@ export const EntityHasSubcomponentsCard: ( // @public (undocumented) export const EntityHasSystemsCard: (props: HasSystemsCardProps) => JSX.Element; +// @public (undocumented) +export const EntityLabelsCard: (props: EntityLabelsCardProps) => JSX.Element; + +// @public (undocumented) +export interface EntityLabelsCardProps { + // (undocumented) + title?: string; + // (undocumented) + variant?: InfoCardVariants; +} + // @public export const EntityLayout: { (props: EntityLayoutProps): JSX.Element; @@ -385,6 +396,9 @@ export interface HasComponentsCardProps { variant?: InfoCardVariants; } +// @public +export function hasLabels(entity: Entity): boolean; + // @public (undocumented) export interface HasResourcesCardProps { // (undocumented) diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index d1d1570ee5..bd4bae6437 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.7.0", + "version": "1.7.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index f7a329c7be..d22f9bde10 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -22,6 +22,7 @@ import { MenuItem, MenuList, Popover, + Tooltip, } from '@material-ui/core'; import { makeStyles } from '@material-ui/core/styles'; import BugReportIcon from '@material-ui/icons/BugReport'; @@ -114,19 +115,21 @@ export function EntityContextMenu(props: EntityContextMenuProps) { return ( <> - - - + + + + + ({ + key: { + fontWeight: 'bold', + }, +})); + +export const EntityLabelsCard = (props: EntityLabelsCardProps) => { + const { variant, title } = props; + const { entity } = useEntity(); + const classes = useStyles(); + + const columns: TableColumn<{ key: string; value: string }>[] = [ + { + render: row => { + return ( + + {row.key} + + ); + }, + }, + { + field: 'value', + }, + ]; + + const labels = entity?.metadata?.labels; + + return ( + + {!labels || Object.keys(labels).length === 0 ? ( + + ) : ( +
({ + key: labelKey, + value: labels[labelKey], + }))} + options={{ + search: false, + showTitle: true, + loadingType: 'linear', + header: false, + padding: 'dense', + pageSize: 5, + toolbar: false, + paging: Object.keys(labels).length > 5, + }} + /> + )} + + ); +}; diff --git a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx new file mode 100644 index 0000000000..a875f542a7 --- /dev/null +++ b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx @@ -0,0 +1,66 @@ +/* + * 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 { BackstageTheme } from '@backstage/theme'; +import { Button, makeStyles, Typography } from '@material-ui/core'; +import React from 'react'; +import { CodeSnippet } from '@backstage/core-components'; + +const ENTITY_YAML = `metadata: + name: example + labels: + javaVersion: 1.2.3`; + +const useStyles = makeStyles( + theme => ({ + code: { + borderRadius: 6, + margin: `${theme.spacing(2)}px 0px`, + background: theme.palette.type === 'dark' ? '#444' : '#fff', + }, + }), + { name: 'PluginCatalogEntityLabelsEmptyState' }, +); + +export function EntityLabelsEmptyState() { + const classes = useStyles(); + + return ( + <> + + No labels defined for this entity. You can add labels to your entity + YAML as shown in the highlighted example below: + +
+ +
+ + + ); +} diff --git a/plugins/catalog/src/components/EntityLabelsCard/conditions.ts b/plugins/catalog/src/components/EntityLabelsCard/conditions.ts new file mode 100644 index 0000000000..fb4678cded --- /dev/null +++ b/plugins/catalog/src/components/EntityLabelsCard/conditions.ts @@ -0,0 +1,29 @@ +/* + * 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 } from '@backstage/catalog-model'; + +/** + * Returns true if the given entity has labels annotation given by the + * catalog. For use by EntitySwitch + * + * @public + */ +export function hasLabels(entity: Entity) { + return entity?.metadata?.labels + ? Object.keys(entity?.metadata?.labels).some(Boolean) + : false; +} diff --git a/plugins/catalog/src/components/EntityLabelsCard/index.ts b/plugins/catalog/src/components/EntityLabelsCard/index.ts new file mode 100644 index 0000000000..870819f9a7 --- /dev/null +++ b/plugins/catalog/src/components/EntityLabelsCard/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { EntityLabelsCard } from './EntityLabelsCard'; +export * from './conditions'; +export type { EntityLabelsCardProps } from './EntityLabelsCard'; diff --git a/plugins/catalog/src/components/EntityLinksCard/IconLink.test.tsx b/plugins/catalog/src/components/EntityLinksCard/IconLink.test.tsx index be784ae3e8..509a3f3741 100644 --- a/plugins/catalog/src/components/EntityLinksCard/IconLink.test.tsx +++ b/plugins/catalog/src/components/EntityLinksCard/IconLink.test.tsx @@ -14,23 +14,16 @@ * limitations under the License. */ -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; +import { renderInTestApp } from '@backstage/test-utils'; import CloudIcon from '@material-ui/icons/Cloud'; -import { render, screen } from '@testing-library/react'; +import { screen } from '@testing-library/react'; import React from 'react'; import { IconLink } from './IconLink'; describe('IconLink', () => { - it('should render an icon link', () => { - render( - - - , + it('should render an icon link', async () => { + await renderInTestApp( + , ); expect(screen.getByText('I am Link')).toBeInTheDocument(); diff --git a/plugins/catalog/src/index.ts b/plugins/catalog/src/index.ts index 886039e329..7de332cf51 100644 --- a/plugins/catalog/src/index.ts +++ b/plugins/catalog/src/index.ts @@ -37,6 +37,7 @@ export * from './components/EntityProcessingErrorsPanel'; export * from './components/EntitySwitch'; export * from './components/FilteredEntityLayout'; export * from './overridableComponents'; +export * from './components/EntityLabelsCard'; export { CatalogEntityPage, CatalogIndexPage, @@ -50,6 +51,7 @@ export { EntityHasSubcomponentsCard, EntityHasSystemsCard, EntityLinksCard, + EntityLabelsCard, RelatedEntitiesCard, } from './plugin'; diff --git a/plugins/catalog/src/plugin.ts b/plugins/catalog/src/plugin.ts index 5419854cb6..c83657b85a 100644 --- a/plugins/catalog/src/plugin.ts +++ b/plugins/catalog/src/plugin.ts @@ -126,6 +126,17 @@ export const EntityLinksCard = catalogPlugin.provide( }), ); +/** @public */ +export const EntityLabelsCard = catalogPlugin.provide( + createComponentExtension({ + name: 'EntityLabelsCard', + component: { + lazy: () => + import('./components/EntityLabelsCard').then(m => m.EntityLabelsCard), + }, + }), +); + /** @public */ export const EntityHasSystemsCard: (props: HasSystemsCardProps) => JSX.Element = catalogPlugin.provide( diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 487e1afd53..1fb34871d6 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.10 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-cicd-statistics@0.1.16 + +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/plugin-cicd-statistics@0.1.16-next.2 + +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/plugin-cicd-statistics@0.1.16-next.1 + +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/plugin-cicd-statistics@0.1.16-next.0 + +## 0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.15 + ## 0.1.8 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index d5805aa03a..70a9d630ea 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.8", + "version": "0.1.10", "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 1ec8aa72bc..22d5e67a36 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-cicd-statistics +## 0.1.16 + +### Patch Changes + +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-plugin-api@1.3.0 + +## 0.1.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + +## 0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-plugin-api@1.2.0 + +## 0.1.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.14 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 390eaec6bf..3bfd432a01 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.14", + "version": "0.1.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/src/charts/status-chart.tsx b/plugins/cicd-statistics/src/charts/status-chart.tsx index 7b07885ca5..7f70d303d5 100644 --- a/plugins/cicd-statistics/src/charts/status-chart.tsx +++ b/plugins/cicd-statistics/src/charts/status-chart.tsx @@ -118,9 +118,9 @@ export function StatusChart(props: StatusChartProps) { : percentOrCount; return [ - + {label}: {valueText} - , + , null, ]; }; diff --git a/plugins/cicd-statistics/src/components/utils.tsx b/plugins/cicd-statistics/src/components/utils.tsx index 0133cf7ba8..e81c0495ad 100644 --- a/plugins/cicd-statistics/src/components/utils.tsx +++ b/plugins/cicd-statistics/src/components/utils.tsx @@ -18,6 +18,7 @@ import React, { CSSProperties } from 'react'; import { DateTime, Duration } from 'luxon'; import humanizeDuration from 'humanize-duration'; import { capitalize } from 'lodash'; +import Typography from '@material-ui/core/Typography'; const infoText: CSSProperties = { color: 'InfoText' }; @@ -60,11 +61,19 @@ function formatDateTimeShort(milliseconds: number) { } export function labelFormatter(epoch: number) { - return {formatDateTimeShort(epoch)}; + return ( + + {formatDateTimeShort(epoch)} + + ); } export function labelFormatterWithoutTime(epoch: number) { - return {formatDateShort(epoch)}; + return ( + + {formatDateShort(epoch)} + + ); } export function tickFormatterX(epoch: number) { @@ -88,12 +97,12 @@ export function tickFormatterY(duration: number) { export function tooltipValueFormatter(durationOrCount: number, name: string) { return [ - + {capitalize(name)}:{' '} {name.endsWith(' count') ? durationOrCount : formatDuration(durationOrCount)} - , + , null, ]; } diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index 07442ef199..6bfcd0373e 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-circleci +## 0.3.14 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.3.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.3.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.3.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.3.12 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 4c03a25116..4bd346c96e 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.12", + "version": "0.3.14", "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 9feb84c9cc..c78ea57cdc 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,58 @@ # @backstage/plugin-cloudbuild +## 0.3.14 + +### Patch Changes + +- 1188407632: Fixed bug in the CloudbuildClient reRunWorkflow fetch call. The method in the fetch request was not specified and defaulted to a GET. Method is now explicitly set to POST with this change. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.3.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.3.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.3.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.3.12 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index b2fc5badaf..6683982abe 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.12", + "version": "0.3.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cloudbuild/src/api/CloudbuildClient.ts b/plugins/cloudbuild/src/api/CloudbuildClient.ts index 035b20f63d..cb6747e803 100644 --- a/plugins/cloudbuild/src/api/CloudbuildClient.ts +++ b/plugins/cloudbuild/src/api/CloudbuildClient.ts @@ -34,6 +34,7 @@ export class CloudbuildClient implements CloudbuildApi { options.projectId, )}/builds/${encodeURIComponent(options.runId)}:retry`, { + method: 'POST', headers: new Headers({ Accept: '*/*', Authorization: `Bearer ${await this.getToken()}`, diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index aa4bf7a8f7..5e6e58bd54 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-code-climate +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.12 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 1a541ff220..5567f8b048 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.12", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/src/components/CodeClimateTable/CodeClimateTable.test.tsx b/plugins/code-climate/src/components/CodeClimateTable/CodeClimateTable.test.tsx index 70d34d0298..e5703a993e 100644 --- a/plugins/code-climate/src/components/CodeClimateTable/CodeClimateTable.test.tsx +++ b/plugins/code-climate/src/components/CodeClimateTable/CodeClimateTable.test.tsx @@ -15,18 +15,14 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/test-utils'; import { CodeClimateTable } from './CodeClimateTable'; import { mockData } from '../../api/mock/mock-api'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; describe('CodeClimateTable', () => { it('should render values in a table', async () => { - const table = await render( - - - , + const table = await renderInTestApp( + , ); expect(await table.findByText('3 months')).toBeInTheDocument(); expect(await table.findByText('88%')).toBeInTheDocument(); diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index 5bab00763e..fc1bbe4d00 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-code-coverage-backend +## 0.2.6 + +### Patch Changes + +- dcfdaeccd3: `RouterOptions` now accepts an optional `catalogApi` argument, allowing custom catalog clients to be used. This is leveraged in the local standalone development runner to pass in a catalog client that returns fake data. +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + +## 0.2.6-next.0 + +### Patch Changes + +- dcfdaeccd3: `RouterOptions` now accepts an optional `catalogApi` argument, allowing custom catalog clients to be used. This is leveraged in the local standalone development runner to pass in a catalog client that returns fake data. +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + ## 0.2.5 ### Patch Changes diff --git a/plugins/code-coverage-backend/api-report.md b/plugins/code-coverage-backend/api-report.md index c33874064b..440af50714 100644 --- a/plugins/code-coverage-backend/api-report.md +++ b/plugins/code-coverage-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 { CatalogApi } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; import express from 'express'; import { Logger } from 'winston'; @@ -15,6 +16,8 @@ export function createRouter(options: RouterOptions): Promise; // @public export interface RouterOptions { + // (undocumented) + catalogApi?: CatalogApi; // (undocumented) config: Config; // (undocumented) diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 3cf997f2c9..908ab1f978 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.5", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/src/service/CoverageUtils.test.ts b/plugins/code-coverage-backend/src/service/CoverageUtils.test.ts index e0b4c6589e..44b1411cc4 100644 --- a/plugins/code-coverage-backend/src/service/CoverageUtils.test.ts +++ b/plugins/code-coverage-backend/src/service/CoverageUtils.test.ts @@ -209,7 +209,7 @@ describe('CodeCoverageUtils', () => { } catch (error: any) { err = error; } - expect(err?.message).toEqual('Content-Type missing'); + expect(err?.message).toEqual('Content-Type header missing'); }); it('rejects unsupported content type', () => { @@ -223,7 +223,9 @@ describe('CodeCoverageUtils', () => { } catch (error: any) { err = error; } - expect(err?.message).toEqual('Illegal Content-Type'); + expect(err?.message).toEqual( + 'Content-Type header "application/json" not supported, expected "text/xml" possibly followed by a charset', + ); }); it('parses the body', () => { diff --git a/plugins/code-coverage-backend/src/service/CoverageUtils.ts b/plugins/code-coverage-backend/src/service/CoverageUtils.ts index d965ae6300..a4d3405868 100644 --- a/plugins/code-coverage-backend/src/service/CoverageUtils.ts +++ b/plugins/code-coverage-backend/src/service/CoverageUtils.ts @@ -162,9 +162,11 @@ export class CoverageUtils { validateRequestBody(req: Request) { const contentType = req.headers['content-type']; if (!contentType) { - throw new InputError('Content-Type missing'); + throw new InputError('Content-Type header missing'); } else if (!contentType.match(/^text\/xml($|;)/)) { - throw new InputError('Illegal Content-Type'); + throw new InputError( + `Content-Type header "${contentType}" not supported, expected "text/xml" possibly followed by a charset`, + ); } const body = req.body; if (!body) { diff --git a/plugins/code-coverage-backend/src/service/converter/jacoco.ts b/plugins/code-coverage-backend/src/service/converter/jacoco.ts index f3047d9f00..ac5ccbfa45 100644 --- a/plugins/code-coverage-backend/src/service/converter/jacoco.ts +++ b/plugins/code-coverage-backend/src/service/converter/jacoco.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { BranchHit, FileEntry } from '../types'; import { JacocoSourceFile, JacocoXML } from './types'; import { Logger } from 'winston'; diff --git a/plugins/code-coverage-backend/src/service/router.ts b/plugins/code-coverage-backend/src/service/router.ts index b87b21bffd..4d4fb779b5 100644 --- a/plugins/code-coverage-backend/src/service/router.ts +++ b/plugins/code-coverage-backend/src/service/router.ts @@ -46,6 +46,7 @@ export interface RouterOptions { database: PluginDatabaseManager; urlReader: UrlReader; logger: Logger; + catalogApi?: CatalogApi; } export interface CodeCoverageApi { @@ -59,7 +60,8 @@ export const makeRouter = async ( const codeCoverageDatabase = await CodeCoverageDatabase.create(database); const codecovUrl = await discovery.getExternalBaseUrl('code-coverage'); - const catalogApi: CatalogApi = new CatalogClient({ discoveryApi: discovery }); + const catalogApi = + options.catalogApi ?? new CatalogClient({ discoveryApi: discovery }); const scm = ScmIntegrations.fromConfig(config); const router = Router(); @@ -167,10 +169,10 @@ export const makeRouter = async ( * /report?entity=component:default/mycomponent&coverageType=cobertura */ router.post('/report', async (req, res) => { - const { entity, coverageType } = req.query; - const entityLookup = await catalogApi.getEntityByRef(entity as string); - if (!entityLookup) { - throw new NotFoundError(`No entity found matching ${entity}`); + const { entity: entityRef, coverageType } = req.query; + const entity = await catalogApi.getEntityByRef(entityRef as string); + if (!entity) { + throw new NotFoundError(`No entity found matching ${entityRef}`); } let converter: Converter; @@ -185,7 +187,7 @@ export const makeRouter = async ( } const { sourceLocation, vcs, scmFiles, body } = - await utils.processCoveragePayload(entityLookup, req); + await utils.processCoveragePayload(entity, req); const files = converter.convert(body, scmFiles); if (!files || files.length === 0) { @@ -193,7 +195,7 @@ export const makeRouter = async ( } const coverage = await utils.buildCoverage( - entityLookup, + entity, sourceLocation, vcs, files, @@ -204,7 +206,7 @@ export const makeRouter = async ( links: [ { rel: 'coverage', - href: `${codecovUrl}/report?entity=${entity}`, + href: `${codecovUrl}/report?entity=${entityRef}`, }, ], }); diff --git a/plugins/code-coverage-backend/src/service/standaloneServer.ts b/plugins/code-coverage-backend/src/service/standaloneServer.ts index c4ced6baeb..41493660fb 100644 --- a/plugins/code-coverage-backend/src/service/standaloneServer.ts +++ b/plugins/code-coverage-backend/src/service/standaloneServer.ts @@ -21,6 +21,8 @@ import { UrlReaders, useHotMemoize, } from '@backstage/backend-common'; +import { CatalogApi } from '@backstage/catalog-client'; +import { CompoundEntityRef, parseEntityRef } from '@backstage/catalog-model'; import { Server } from 'http'; import knexFactory from 'knex'; import { Logger } from 'winston'; @@ -52,13 +54,27 @@ export async function startStandaloneServer( return knex; }); + const catalogApi = { + async getEntityByRef(entityRef: string | CompoundEntityRef) { + const { kind, namespace, name } = parseEntityRef(entityRef); + return { + apiVersion: 'backstage.io/v1alpha1', + kind, + metadata: { name, namespace }, + spec: {}, + }; + }, + } as Partial as CatalogApi; + logger.debug('Starting application server...'); + const router = await createRouter({ database: { getClient: async () => db }, config, discovery: SingleHostDiscovery.fromConfig(config), urlReader: UrlReaders.default({ logger, config }), logger, + catalogApi, }); let service = createServiceBuilder(module) diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index e53661e437..dbcbb6fdbe 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,65 @@ # @backstage/plugin-code-coverage +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.2.5 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index 40e81db84a..5c181d0a8c 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.5", + "version": "0.2.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index fb4404bb75..deb3feb593 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,56 @@ # @backstage/plugin-codescene +## 0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.1.7 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 44d1614b3d..8d2e91b0fd 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.7", + "version": "0.1.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/src/components/CodeScenePageComponent/CodeScenePageComponent.test.tsx b/plugins/codescene/src/components/CodeScenePageComponent/CodeScenePageComponent.test.tsx index d8ffca841d..a1d7690ca8 100644 --- a/plugins/codescene/src/components/CodeScenePageComponent/CodeScenePageComponent.test.tsx +++ b/plugins/codescene/src/components/CodeScenePageComponent/CodeScenePageComponent.test.tsx @@ -15,8 +15,6 @@ */ import React from 'react'; import { CodeScenePageComponent } from './CodeScenePageComponent'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { rootRouteRef } from '../../routes'; @@ -54,9 +52,7 @@ describe('CodeScenePageComponent', () => { it('should render', async () => { const rendered = await renderInTestApp( - - - + , { mountedRoutes: { diff --git a/plugins/codescene/src/components/CodeSceneProjectDetailsPage/CodeSceneProjectDetailsPage.test.tsx b/plugins/codescene/src/components/CodeSceneProjectDetailsPage/CodeSceneProjectDetailsPage.test.tsx index 9ace0f1224..8ea1a0235f 100644 --- a/plugins/codescene/src/components/CodeSceneProjectDetailsPage/CodeSceneProjectDetailsPage.test.tsx +++ b/plugins/codescene/src/components/CodeSceneProjectDetailsPage/CodeSceneProjectDetailsPage.test.tsx @@ -15,8 +15,6 @@ */ import React from 'react'; import { CodeSceneProjectDetailsPage } from './CodeSceneProjectDetailsPage'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { @@ -90,9 +88,7 @@ describe('CodeSceneProjectDetailsPage', () => { it('should render', async () => { const rendered = await renderInTestApp( - - - + , ); expect(rendered.getByText('CodeScene: test-project')).toBeInTheDocument(); diff --git a/plugins/codescene/src/components/ProjectsComponent/ProjectsComponent.test.tsx b/plugins/codescene/src/components/ProjectsComponent/ProjectsComponent.test.tsx index 4c9ee9ed42..40aee57312 100644 --- a/plugins/codescene/src/components/ProjectsComponent/ProjectsComponent.test.tsx +++ b/plugins/codescene/src/components/ProjectsComponent/ProjectsComponent.test.tsx @@ -15,8 +15,6 @@ */ import React from 'react'; import { ProjectsComponent } from './ProjectsComponent'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { rootRouteRef } from '../../routes'; @@ -90,9 +88,7 @@ describe('ProjectsComponent', () => { it('should render', async () => { const rendered = await renderInTestApp( - - - + , { mountedRoutes: { diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 52d5a70f5f..0c9889e2ae 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,60 @@ # @backstage/plugin-config-schema +## 0.1.37 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.1.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.1.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.1.36 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.1.35 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index f8e337f873..436a2c8ca5 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.35", + "version": "0.1.37", "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 55bd8aaac8..343319032a 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,69 @@ # @backstage/plugin-cost-insights +## 0.12.3 + +### Patch Changes + +- 6a41175d70: Removed @backstage/test-utils dependency, since it was already in the devDependencies where it belongs. The main benefit is that this will exclude better-sqlite3 from the production build. +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/theme@0.2.16 + - @backstage/plugin-cost-insights-common@0.1.1 + +## 0.12.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-cost-insights-common@0.1.1 + +## 0.12.3-next.1 + +### Patch Changes + +- 6a41175d70: Removed @backstage/test-utils dependency, since it was already in the devDependencies where it belongs. The main benefit is that this will exclude better-sqlite3 from the production build. +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-cost-insights-common@0.1.1 + +## 0.12.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/test-utils@1.2.3 + - @backstage/theme@0.2.16 + - @backstage/plugin-cost-insights-common@0.1.1 + +## 0.12.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.12.1 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index defc54f904..1a3ced06a7 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.1", + "version": "0.12.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,7 +38,6 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-cost-insights-common": "workspace:^", - "@backstage/test-utils": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertInsightsHeader.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertInsightsHeader.tsx index 2d218f8164..97def45b76 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertInsightsHeader.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertInsightsHeader.tsx @@ -36,9 +36,9 @@ export const AlertInsightsHeader = ({ {title}{' '} - + 🎯 - + {subtitle} diff --git a/plugins/cost-insights/src/components/CostGrowth/CostGrowth.tsx b/plugins/cost-insights/src/components/CostGrowth/CostGrowth.tsx index 51f9c61e7b..c6dd29b86f 100644 --- a/plugins/cost-insights/src/components/CostGrowth/CostGrowth.tsx +++ b/plugins/cost-insights/src/components/CostGrowth/CostGrowth.tsx @@ -16,6 +16,7 @@ import React from 'react'; import classnames from 'classnames'; +import Typography from '@material-ui/core/Typography'; import { CurrencyType, Duration, GrowthType } from '../../types'; import { ChangeStatistic } from '@backstage/plugin-cost-insights-common'; import { rateOf } from '../../utils/currency'; @@ -59,48 +60,52 @@ export const CostGrowth = (props: CostGrowthProps) => { }); if (engineers < engineerThreshold) { - return Negligible; + return ( + + Negligible + + ); } if (currency.kind === CurrencyType.USD) { // Do not display percentage if ratio cannot be calculated if (isNaN(ratio)) { return ( - + ~{currency.prefix} {formatCurrency(converted)} - + ); } return ( - + {formatPercent(ratio)} or ~{currency.prefix} {formatCurrency(converted)} - + ); } if (amount < 1) { return ( - + less than {indefiniteArticleOf(['a', 'an'], currency.unit)} - + ); } // Do not display percentage if ratio cannot be calculated if (isNaN(ratio)) { return ( - + ~{formatCurrency(converted, currency.unit)} - + ); } return ( - + {formatPercent(ratio)} or ~{formatCurrency(converted, currency.unit)} - + ); }; diff --git a/plugins/cost-insights/src/components/CostInsightsHeader/CostInsightsHeader.tsx b/plugins/cost-insights/src/components/CostInsightsHeader/CostInsightsHeader.tsx index 8e12b7f5dd..c1b3e12575 100644 --- a/plugins/cost-insights/src/components/CostInsightsHeader/CostInsightsHeader.tsx +++ b/plugins/cost-insights/src/components/CostInsightsHeader/CostInsightsHeader.tsx @@ -46,9 +46,9 @@ const CostInsightsHeaderNoData = ({ return ( <> - + 😳 - {' '} + {' '} Well this is awkward @@ -76,9 +76,9 @@ const CostInsightsHeaderAlerts = ({ return ( <> - + 🔎 - {' '} + {' '} You have {alerts} thing{alerts > 1 && 's'} to look into @@ -101,9 +101,9 @@ const CostInsightsHeaderNoAlerts = ({ return ( <> - + 👍 - {' '} + {' '} Your team is doing great @@ -120,9 +120,9 @@ export const CostInsightsHeaderNoGroups = () => { return ( <> - + 😳 - {' '} + {' '} Well this is awkward diff --git a/plugins/cost-insights/src/components/CurrencySelect/CurrencySelect.tsx b/plugins/cost-insights/src/components/CurrencySelect/CurrencySelect.tsx index 47d2bf1eda..8f7d466de7 100644 --- a/plugins/cost-insights/src/components/CurrencySelect/CurrencySelect.tsx +++ b/plugins/cost-insights/src/components/CurrencySelect/CurrencySelect.tsx @@ -22,6 +22,7 @@ import { Select, SelectProps, } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { Currency, CurrencyType } from '../../types'; import { findAlways } from '../../utils/assert'; import { useSelectStyles as useStyles } from '../../utils/styles'; @@ -73,9 +74,9 @@ export const CurrencySelect = ({ key={c.kind || NULL_VALUE} value={c.kind || NULL_VALUE} > - + {c.label} - + ))} diff --git a/plugins/cost-insights/src/components/LegendItem/LegendItem.tsx b/plugins/cost-insights/src/components/LegendItem/LegendItem.tsx index 0b8a993b39..93b1df7bdb 100644 --- a/plugins/cost-insights/src/components/LegendItem/LegendItem.tsx +++ b/plugins/cost-insights/src/components/LegendItem/LegendItem.tsx @@ -59,9 +59,14 @@ export const LegendItem = (props: PropsWithChildren) => { } placement="top-start" > - + - + )} diff --git a/plugins/cost-insights/src/components/WhyCostsMatter/WhyCostsMatter.tsx b/plugins/cost-insights/src/components/WhyCostsMatter/WhyCostsMatter.tsx index 3869356c5c..0b3ea9f00d 100644 --- a/plugins/cost-insights/src/components/WhyCostsMatter/WhyCostsMatter.tsx +++ b/plugins/cost-insights/src/components/WhyCostsMatter/WhyCostsMatter.tsx @@ -30,9 +30,9 @@ export const WhyCostsMatter = () => { Sustainability{' '} - + 🌎 - + Reducing cloud usage improves our carbon footprint. @@ -44,9 +44,13 @@ export const WhyCostsMatter = () => { Revenue{' '} - + 💸 - + Keeping cloud costs well-tuned prevents infrastructure from eating @@ -59,9 +63,9 @@ export const WhyCostsMatter = () => { Innovation{' '} - + 🥇 - + The more we save, the more we can reinvest in speed and diff --git a/plugins/cost-insights/src/example/alerts/KubernetesMigrationAlert.tsx b/plugins/cost-insights/src/example/alerts/KubernetesMigrationAlert.tsx index eb5423148d..d1cc2d9828 100644 --- a/plugins/cost-insights/src/example/alerts/KubernetesMigrationAlert.tsx +++ b/plugins/cost-insights/src/example/alerts/KubernetesMigrationAlert.tsx @@ -16,6 +16,7 @@ import React from 'react'; import pluralize from 'pluralize'; +import Typography from '@material-ui/core/Typography'; import { KubernetesMigrationAlertCard } from '../components'; import { CostInsightsApi } from '../../api'; import { @@ -91,11 +92,11 @@ export class KubernetesMigrationAlert implements KubernetesMigrationApi { get title() { return ( - + Consider migrating{' '} {pluralize('service', this.data.services.length, true)} to Kubernetes{' '} - + ); } diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index c85156fbbf..63ffdd5da9 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-dynatrace +## 1.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 1.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 1.0.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 1.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 1.0.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 1.0.2 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index d359156787..03c0f97f16 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "1.0.2", + "version": "1.0.4", "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 991f845cdc..6fc92e2700 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.1.2 + +### Patch Changes + +- 9f2b786fc9: Provide context for logged errors. +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/backend-common@0.18.0 + - @backstage/backend-tasks@0.4.1 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.1 + - @backstage/types@1.0.2 + +## 0.1.2-next.1 + +### Patch Changes + +- 9f2b786fc9: Provide context for logged errors. +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/plugin-events-node@0.2.1-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/types@1.0.2 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-events-node@0.2.1-next.0 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/types@1.0.2 + ## 0.1.1 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/api-report.md b/plugins/events-backend-module-aws-sqs/api-report.md index 79a422c9f3..ede18f2787 100644 --- a/plugins/events-backend-module-aws-sqs/api-report.md +++ b/plugins/events-backend-module-aws-sqs/api-report.md @@ -23,7 +23,5 @@ export class AwsSqsConsumingEventPublisher implements EventPublisher { } // @alpha -export const awsSqsConsumingEventPublisherEventsModule: ( - options?: undefined, -) => BackendFeature; +export const awsSqsConsumingEventPublisherEventsModule: () => BackendFeature; ``` diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 15c859a8bc..323b015237 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.1.1", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,6 +24,7 @@ }, "dependencies": { "@aws-sdk/client-sqs": "^3.208.0", + "@backstage/backend-common": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", "@backstage/config": "workspace:^", diff --git a/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts b/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts index 4638769c45..e649e2ee83 100644 --- a/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts +++ b/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts @@ -100,7 +100,7 @@ export class AwsSqsConsumingEventPublisher implements EventPublisher { await this.sleep(this.waitTimeAfterEmptyReceiveMs); } } catch (error) { - logger.error(error); + logger.error('Failed to consume AWS SQS messages', error); } }, }); diff --git a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts b/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts index a6c43d4046..50812f321b 100644 --- a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts +++ b/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts @@ -17,8 +17,8 @@ import { coreServices, createBackendModule, - loggerToWinstonLogger, } from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; import { eventsExtensionPoint } from '@backstage/plugin-events-node'; import { AwsSqsConsumingEventPublisher } from '../publisher/AwsSqsConsumingEventPublisher'; diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 77498eeb99..1e4c666332 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/plugin-events-node@0.2.1 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/plugin-events-node@0.2.1-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/plugin-events-node@0.2.1-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/events-backend-module-azure/api-report.md b/plugins/events-backend-module-azure/api-report.md index 510ec91c47..2e13a7ed4a 100644 --- a/plugins/events-backend-module-azure/api-report.md +++ b/plugins/events-backend-module-azure/api-report.md @@ -15,7 +15,5 @@ export class AzureDevOpsEventRouter extends SubTopicEventRouter { } // @alpha -export const azureDevOpsEventRouterEventsModule: ( - options?: undefined, -) => BackendFeature; +export const azureDevOpsEventRouterEventsModule: () => BackendFeature; ``` diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 3b6302200f..4e5c429b39 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.1", + "version": "0.1.2", "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 f4a6fa5ae0..bf95401831 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/plugin-events-node@0.2.1 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/plugin-events-node@0.2.1-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/plugin-events-node@0.2.1-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/api-report.md b/plugins/events-backend-module-bitbucket-cloud/api-report.md index 0e4acfac91..c47252ce17 100644 --- a/plugins/events-backend-module-bitbucket-cloud/api-report.md +++ b/plugins/events-backend-module-bitbucket-cloud/api-report.md @@ -15,7 +15,5 @@ export class BitbucketCloudEventRouter extends SubTopicEventRouter { } // @alpha -export const bitbucketCloudEventRouterEventsModule: ( - options?: undefined, -) => BackendFeature; +export const bitbucketCloudEventRouterEventsModule: () => BackendFeature; ``` diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index c44c1ef1cc..7c6496c946 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.1", + "version": "0.1.2", "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 bf3bdf34b4..8fdb5fd6d8 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/plugin-events-node@0.2.1 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/plugin-events-node@0.2.1-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/plugin-events-node@0.2.1-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/api-report.md b/plugins/events-backend-module-gerrit/api-report.md index 268e5970fa..c8d4a7c9b6 100644 --- a/plugins/events-backend-module-gerrit/api-report.md +++ b/plugins/events-backend-module-gerrit/api-report.md @@ -15,7 +15,5 @@ export class GerritEventRouter extends SubTopicEventRouter { } // @alpha -export const gerritEventRouterEventsModule: ( - options?: undefined, -) => BackendFeature; +export const gerritEventRouterEventsModule: () => BackendFeature; ``` diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 497756bc93..98832ea84c 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.1", + "version": "0.1.2", "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 b3e4d2821b..47fdc41032 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-events-backend-module-github +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.1 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/plugin-events-node@0.2.1-next.1 + - @backstage/config@1.0.6-next.0 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-events-node@0.2.1-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/events-backend-module-github/api-report.md b/plugins/events-backend-module-github/api-report.md index b2a4425ae6..4f14bce789 100644 --- a/plugins/events-backend-module-github/api-report.md +++ b/plugins/events-backend-module-github/api-report.md @@ -22,10 +22,8 @@ export class GithubEventRouter extends SubTopicEventRouter { } // @alpha -export const githubEventRouterEventsModule: ( - options?: undefined, -) => BackendFeature; +export const githubEventRouterEventsModule: () => BackendFeature; // @alpha -export const githubWebhookEventsModule: (options?: undefined) => BackendFeature; +export const githubWebhookEventsModule: () => BackendFeature; ``` diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 8be3fd4c7b..7d5fcf9981 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.1", + "version": "0.1.2", "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 a3d25cefac..e87e9cf0ee 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.1 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/plugin-events-node@0.2.1-next.1 + - @backstage/config@1.0.6-next.0 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-events-node@0.2.1-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/api-report.md b/plugins/events-backend-module-gitlab/api-report.md index 8f130902a2..2a88295032 100644 --- a/plugins/events-backend-module-gitlab/api-report.md +++ b/plugins/events-backend-module-gitlab/api-report.md @@ -20,10 +20,8 @@ export class GitlabEventRouter extends SubTopicEventRouter { } // @alpha -export const gitlabEventRouterEventsModule: ( - options?: undefined, -) => BackendFeature; +export const gitlabEventRouterEventsModule: () => BackendFeature; // @alpha -export const gitlabWebhookEventsModule: (options?: undefined) => BackendFeature; +export const gitlabWebhookEventsModule: () => BackendFeature; ``` diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 019052ba11..8c7d08ef71 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.1", + "version": "0.1.2", "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 f5ce89f47d..ad60c22bf1 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.1 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.1-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.1-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 2cd90d985b..26a8f9bdb4 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.1", + "version": "0.1.2", "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 50074a6f07..7fe73314f5 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-events-backend +## 0.2.1 + +### Patch Changes + +- 217149ae98: The default event broker will now catch and log errors thrown by the `onEvent` method of subscribers. The returned promise from `publish` method will also not resolve until all subscribers have handled the event. +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/plugin-events-node@0.2.1 + +## 0.2.1-next.1 + +### Patch Changes + +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-events-node@0.2.1-next.1 + - @backstage/config@1.0.6-next.0 + +## 0.2.1-next.0 + +### Patch Changes + +- 217149ae98: The default event broker will now catch and log errors thrown by the `onEvent` method of subscribers. The returned promise from `publish` method will also not resolve until all subscribers have handled the event. +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-events-node@0.2.1-next.0 + ## 0.2.0 ### Minor Changes diff --git a/plugins/events-backend/api-report.md b/plugins/events-backend/api-report.md index 69d7600ed3..28437772ae 100644 --- a/plugins/events-backend/api-report.md +++ b/plugins/events-backend/api-report.md @@ -29,7 +29,7 @@ export class EventsBackend { } // @alpha -export const eventsPlugin: (options?: undefined) => BackendFeature; +export const eventsPlugin: () => BackendFeature; // @public export class HttpPostIngressEventPublisher implements EventPublisher { diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 6aee64754c..23e388e2b9 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.0", + "version": "0.2.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/src/service/EventsPlugin.ts b/plugins/events-backend/src/service/EventsPlugin.ts index 63d0d0b02a..29456d71f7 100644 --- a/plugins/events-backend/src/service/EventsPlugin.ts +++ b/plugins/events-backend/src/service/EventsPlugin.ts @@ -17,8 +17,8 @@ import { createBackendPlugin, coreServices, - loggerToWinstonLogger, } from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; import { EventBroker, EventPublisher, diff --git a/plugins/events-backend/src/service/InMemoryEventBroker.test.ts b/plugins/events-backend/src/service/InMemoryEventBroker.test.ts index 68a6f63a72..861cdda940 100644 --- a/plugins/events-backend/src/service/InMemoryEventBroker.test.ts +++ b/plugins/events-backend/src/service/InMemoryEventBroker.test.ts @@ -16,6 +16,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { TestEventSubscriber } from '@backstage/plugin-events-backend-test-utils'; +import { EventParams, EventSubscriber } from '@backstage/plugin-events-node'; import { InMemoryEventBroker } from './InMemoryEventBroker'; const logger = getVoidLogger(); @@ -63,4 +64,51 @@ describe('InMemoryEventBroker', () => { eventPayload: { test: 'topicC' }, }); }); + + it('logs errors from subscribers', async () => { + const topic = 'testTopic'; + + const subscriber1 = new (class Subscriber1 implements EventSubscriber { + supportsEventTopics() { + return [topic]; + } + async onEvent(event: EventParams) { + throw new Error(`NOPE ${event.eventPayload}`); + } + })(); + const subscriber2 = new (class Subscriber2 implements EventSubscriber { + supportsEventTopics() { + return [topic]; + } + async onEvent(event: EventParams) { + throw new Error(`NOPE ${event.eventPayload}`); + } + })(); + + const errorSpy = jest.spyOn(logger, 'error'); + const eventBroker = new InMemoryEventBroker(logger); + + eventBroker.subscribe(subscriber1); + await eventBroker.publish({ topic, eventPayload: '1' }); + + expect(errorSpy).toHaveBeenCalledTimes(1); + expect(errorSpy).toHaveBeenCalledWith( + 'Subscriber "Subscriber1" failed to process event', + new Error('NOPE 1'), + ); + + eventBroker.subscribe(subscriber2); + await eventBroker.publish({ topic, eventPayload: '2' }); + + // With two subscribers we should not halt on the first error but call all subscribers + expect(errorSpy).toHaveBeenCalledTimes(3); + expect(errorSpy).toHaveBeenCalledWith( + 'Subscriber "Subscriber1" failed to process event', + new Error('NOPE 2'), + ); + expect(errorSpy).toHaveBeenCalledWith( + 'Subscriber "Subscriber2" failed to process event', + new Error('NOPE 2'), + ); + }); }); diff --git a/plugins/events-backend/src/service/InMemoryEventBroker.ts b/plugins/events-backend/src/service/InMemoryEventBroker.ts index 90c7d912fe..04be01f658 100644 --- a/plugins/events-backend/src/service/InMemoryEventBroker.ts +++ b/plugins/events-backend/src/service/InMemoryEventBroker.ts @@ -42,7 +42,18 @@ export class InMemoryEventBroker implements EventBroker { ); const subscribed = this.subscribers[params.topic] ?? []; - subscribed.forEach(subscriber => subscriber.onEvent(params)); + await Promise.all( + subscribed.map(async subscriber => { + try { + await subscriber.onEvent(params); + } catch (error) { + this.logger.error( + `Subscriber "${subscriber.constructor.name}" failed to process event`, + error, + ); + } + }), + ); } subscribe( diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index b91a966342..e8f37ea791 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-events-node +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + ## 0.2.0 ### Minor Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 59123e0e27..7d7992db7c 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.0", + "version": "0.2.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index f853f231e1..cf6ea72eb9 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @internal/plugin-todo-list-backend +## 1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9 + +## 1.0.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + +## 1.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9-next.0 + ## 1.0.8 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 14b6a81c70..bf8eaa48dd 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.8", + "version": "1.0.9", "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 2cf4c41b4f..01850d2122 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,19 @@ # @internal/plugin-todo-list-common +## 1.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.3 + +## 1.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.3-next.0 + ## 1.0.7 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 1392e063ff..c1be8da2f8 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-common", - "version": "1.0.7", + "version": "1.0.8", "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 74b1eb0985..66c920d08b 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,48 @@ # @internal/plugin-todo-list +## 1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 1.0.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 1.0.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + +## 1.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 1.0.8 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index ee34b6541f..ce8197bc6e 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.8", + "version": "1.0.9", "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 55e62824f2..39507030de 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-explore-backend +## 0.0.2 + +### Patch Changes + +- 358554ff3c: Bump `msw` to `^0.49.0` +- 9f9d279bd1: Updated `README.md` examples +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.1 + +## 0.0.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.0.2-next.1 + +### Patch Changes + +- 9f9d279bd1: Updated `README.md` examples +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.0.2-next.0 + +### Patch Changes + +- 358554ff3c: Bump `msw` to `^0.49.0` +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.0 + ## 0.0.1 ### Patch Changes diff --git a/plugins/explore-backend/README.md b/plugins/explore-backend/README.md index d1714806f4..3edf48249a 100644 --- a/plugins/explore-backend/README.md +++ b/plugins/explore-backend/README.md @@ -11,32 +11,32 @@ for these tools. ```bash # From your Backstage root directory -yarn add --cwd packages/backend @backstage/plugin-explore-backend +yarn add --cwd packages/backend @backstage/plugin-explore-backend @backstage/plugin-explore-common ``` ### Adding the plugin to your `packages/backend` You'll need to add the plugin to the router in your `backend` package. You can -do this by creating a file called `packages/backend/src/plugins/explore.ts` +do this by creating a file called `packages/backend/src/plugins/explore.ts` with the following content: ```ts import { createRouter, StaticExploreToolProvider, } from '@backstage/plugin-explore-backend'; +import { ExploreTool } from '@backstage/plugin-explore-common'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; // List of tools you want to surface in the Explore plugin "Tools" page. -const tools: ExploreTool[] = [ +const exploreTools: ExploreTool[] = [ { title: 'New Relic', - description:'new relic plugin', + description: 'new relic plugin', url: '/newrelic', image: 'https://i.imgur.com/L37ikrX.jpg', tags: ['newrelic', 'proxy', 'nerdGraph'], }, - ... ]; export default async function createPlugin( diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index 748a4e0a09..eca8761c84 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.1", + "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 358a51dd10..2dc2181597 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-explore-react +## 0.0.25 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-explore-common@0.0.1 + +## 0.0.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-explore-common@0.0.1 + +## 0.0.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/plugin-explore-common@0.0.1 + ## 0.0.24 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index ec96a184f4..e5a47a4ab7 100644 --- a/plugins/explore-react/package.json +++ b/plugins/explore-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-react", "description": "A frontend library for Backstage plugins that want to interact with the explore plugin", - "version": "0.0.24", + "version": "0.0.25", "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 776aeb1d91..4730211b0d 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,83 @@ # @backstage/plugin-explore +## 0.3.45 + +### Patch Changes + +- 9f9d279bd1: Updated `README.md` examples +- d318d4f659: Makes the `GroupsDiagram` not grown on screen on its own. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-search-react@1.4.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.25 + - @backstage/plugin-search-common@1.2.1 + +## 0.3.45-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.25-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.3.45-next.1 + +### Patch Changes + +- 9f9d279bd1: Updated `README.md` examples +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.25-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-search-react@1.3.2-next.1 + +## 0.3.45-next.0 + +### Patch Changes + +- d318d4f659: Makes the `GroupsDiagram` not grown on screen on its own. +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.24 + - @backstage/plugin-search-common@1.2.0 + - @backstage/plugin-search-react@1.3.2-next.0 + +## 0.3.44 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + - @backstage/plugin-search-react@1.3.1 + - @backstage/plugin-explore-react@0.0.24 + ## 0.3.43 ### Patch Changes diff --git a/plugins/explore/README.md b/plugins/explore/README.md index 0204f34714..2388d97ac1 100644 --- a/plugins/explore/README.md +++ b/plugins/explore/README.md @@ -68,6 +68,7 @@ ready to make modifications, add the following code snippet to add the ```diff +import { ToolSearchResultListItem } from '@backstage/plugin-explore'; ++import BuildIcon from '@material-ui/icons/Build'; const SearchPage = () => { ... diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 9f6f700950..19ec095c09 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.3.43", + "version": "0.3.45", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/src/components/GroupsExplorerContent/GroupsDiagram.tsx b/plugins/explore/src/components/GroupsExplorerContent/GroupsDiagram.tsx index 674ef1e43f..fd1d5ba5fb 100644 --- a/plugins/explore/src/components/GroupsExplorerContent/GroupsDiagram.tsx +++ b/plugins/explore/src/components/GroupsExplorerContent/GroupsDiagram.tsx @@ -44,8 +44,10 @@ import useAsync from 'react-use/lib/useAsync'; const useStyles = makeStyles((theme: BackstageTheme) => ({ graph: { minHeight: '100%', + flex: 1, }, graphWrapper: { + display: 'flex', height: '100%', }, organizationNode: { diff --git a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx index f3cca5642f..7c5259d96b 100644 --- a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx +++ b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx @@ -16,8 +16,6 @@ import { ExploreTool } from '@backstage/plugin-explore-common'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; import { waitFor } from '@testing-library/react'; import React from 'react'; import { exploreApiRef } from '../../api'; @@ -29,11 +27,9 @@ describe('', () => { }; const Wrapper = ({ children }: { children?: React.ReactNode }) => ( - - - {children} - - + + {children} + ); beforeEach(() => { diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index d48143d536..f4156731bb 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,54 @@ # @backstage/plugin-firehydrant +## 0.1.31 + +### Patch Changes + +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.1.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.1.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.1.30 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.29 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 81a329ec5f..6ddfa301b9 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.1.29", + "version": "0.1.31", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx index b70c578e11..ed8bbf6a81 100644 --- a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx +++ b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx @@ -192,7 +192,10 @@ export const ServiceDetailsCard = () => { {!showServiceDetails && !loading && (
-   This service does not exist in FireHydrant. +    + + This service does not exist in FireHydrant. +
)} {showServiceDetails && ( @@ -251,7 +254,7 @@ export const ServiceDetailsCard = () => { - Declare an incident + Declare an incident @@ -267,7 +270,7 @@ export const ServiceDetailsCard = () => { - View all incidents + View all incidents @@ -284,7 +287,7 @@ export const ServiceDetailsCard = () => { - View Service Details + View Service Details diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index a2a9bdc2b9..3fc6dd9738 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,63 @@ # @backstage/plugin-fossa +## 0.2.46 + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.46-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.2.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.45 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.2.44 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index c0ece5f0f0..2ad62b8a4f 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.44", + "version": "0.2.46", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/src/components/FossaCard/FossaCard.tsx b/plugins/fossa/src/components/FossaCard/FossaCard.tsx index 31ff84e107..c31f5b9d0c 100644 --- a/plugins/fossa/src/components/FossaCard/FossaCard.tsx +++ b/plugins/fossa/src/components/FossaCard/FossaCard.tsx @@ -17,6 +17,7 @@ import { useEntity } from '@backstage/plugin-catalog-react'; import { Grid, Tooltip } from '@material-ui/core'; import { makeStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; import { DateTime } from 'luxon'; import React, { PropsWithChildren } from 'react'; import useAsync from 'react-use/lib/useAsync'; @@ -165,7 +166,8 @@ export const FossaCard = (props: { variant?: InfoCardVariants }) => { spacing={0} > -

0 || value.dependencyCount === 0 ? classes.numberError @@ -173,16 +175,18 @@ export const FossaCard = (props: { variant?: InfoCardVariants }) => { } > {value.issueCount} -

+ {value.dependencyCount > 0 && ( -

Number of issues

+ + Number of issues + )} {value.dependencyCount === 0 && ( -

+ No Dependencies.
Please check your FOSSA project settings. -

+ )}
@@ -195,7 +199,9 @@ export const FossaCard = (props: { variant?: InfoCardVariants }) => { Based on {value.dependencyCount} Dependencies on branch{' '} - {value.projectDefaultBranch} + + {value.projectDefaultBranch} + . diff --git a/plugins/fossa/src/components/FossaPage/FossaPage.tsx b/plugins/fossa/src/components/FossaPage/FossaPage.tsx index faff862d0f..4b82fab220 100644 --- a/plugins/fossa/src/components/FossaPage/FossaPage.tsx +++ b/plugins/fossa/src/components/FossaPage/FossaPage.tsx @@ -27,6 +27,7 @@ import { getEntityRelations, } from '@backstage/plugin-catalog-react'; import { Tooltip } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { Skeleton } from '@material-ui/lab'; import { DateTime } from 'luxon'; import * as React from 'react'; @@ -140,11 +141,11 @@ const columns: TableColumn[] = [ DateTime.DATETIME_MED, )} > - + {DateTime.fromISO(details.timestamp).toRelative({ locale: 'en', })} - + ) ); diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index 4c0a29dd58..8155123f67 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,52 @@ # @backstage/plugin-gcalendar +## 0.3.10 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.3.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.3.9 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.3.8 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 71cd4b999c..dd6c804f98 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.8", + "version": "0.3.10", "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 eea93cfa72..67ac992174 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-gcp-projects +## 0.3.33 + +### Patch Changes + +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.3.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.3.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + +## 0.3.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.3.32 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.3.31 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index dc0653d122..193ab0af28 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gcp-projects", "description": "A Backstage plugin that helps you manage projects in GCP", - "version": "0.3.31", + "version": "0.3.33", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcp-projects/src/components/ProjectListPage/ProjectListPage.tsx b/plugins/gcp-projects/src/components/ProjectListPage/ProjectListPage.tsx index dea12f4b60..209d2a27d0 100644 --- a/plugins/gcp-projects/src/components/ProjectListPage/ProjectListPage.tsx +++ b/plugins/gcp-projects/src/components/ProjectListPage/ProjectListPage.tsx @@ -39,11 +39,17 @@ import { Link as RouterLink } from 'react-router-dom'; const LongText = ({ text, max }: { text: string; max: number }) => { if (text.length < max) { - return {text}; + return ( + + {text} + + ); } return ( - {text.slice(0, max)}... + + {text.slice(0, max)}... + ); }; diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 36ad6032aa..6d59cae145 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-git-release-manager +## 0.3.27 + +### Patch Changes + +- 8024341620: add exports to clear api-report messages +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## 0.3.27-next.2 + +### Patch Changes + +- 8024341620: add exports to clear api-report messages +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/integration@1.4.2-next.0 + - @backstage/theme@0.2.16 + +## 0.3.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/integration@1.4.2-next.0 + - @backstage/theme@0.2.16 + +## 0.3.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/integration@1.4.1 + - @backstage/theme@0.2.16 + +## 0.3.26 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.3.25 ### Patch Changes diff --git a/plugins/git-release-manager/api-report.md b/plugins/git-release-manager/api-report.md index d34b6c07fb..edc2e56ad9 100644 --- a/plugins/git-release-manager/api-report.md +++ b/plugins/git-release-manager/api-report.md @@ -12,23 +12,72 @@ import { default as React_2 } from 'react'; import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; -// Warning: (ae-missing-release-tag) "A_CALVER_VERSION" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "A_CALVER_VERSION" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const A_CALVER_VERSION = '2020.01.01_1'; -// Warning: (ae-missing-release-tag) "A_SEMVER_VERSION" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "A_SEMVER_VERSION" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const A_SEMVER_VERSION = '1.2.3'; -// Warning: (ae-missing-release-tag) "calverRegexp" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "AlertError" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface AlertError { + // (undocumented) + subtitle: string; + // (undocumented) + title?: string; +} + +// Warning: (ae-missing-release-tag) "calverRegexp" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const calverRegexp: RegExp; +// Warning: (ae-missing-release-tag) "CalverTagParts" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +type CalverTagParts = { + prefix: string; + calver: string; + patch: number; +}; + +// Warning: (ae-missing-release-tag) "ComponentConfig" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ComponentConfig = { + omit?: boolean; + onSuccess?: (args: OnSuccessArgs) => Promise | void; +}; + +declare namespace components { + export { + Differ, + Divider, + InfoCardPlus, + LinearProgressWithLabel, + NoLatestRelease, + ResponseStepDialog, + ResponseStepList, + ResponseStepListItem, + }; +} + +declare namespace constants { + export { + SEMVER_PARTS, + DISABLE_CACHE, + VERSIONING_STRATEGIES, + TAG_OBJECT_MESSAGE, + }; +} + // Warning: (ae-forgotten-export) The symbol "GetBranchResult" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "createMockBranch" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "createMockBranch" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public const createMockBranch: ({ @@ -36,7 +85,7 @@ const createMockBranch: ({ }?: Partial) => GetBranchResult['branch']; // Warning: (ae-forgotten-export) The symbol "GetCommitResult" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "createMockCommit" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "createMockCommit" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const createMockCommit: ( @@ -44,7 +93,7 @@ const createMockCommit: ( ) => GetCommitResult; // Warning: (ae-forgotten-export) The symbol "GetRecentCommitsResultSingle" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "createMockRecentCommit" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "createMockRecentCommit" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public const createMockRecentCommit: ({ @@ -52,7 +101,7 @@ const createMockRecentCommit: ({ }: Partial) => GetRecentCommitsResultSingle; // Warning: (ae-forgotten-export) The symbol "GetLatestReleaseResult" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "createMockRelease" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "createMockRelease" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public const createMockRelease: ({ @@ -64,18 +113,38 @@ const createMockRelease: ({ >) => NonNullable; // Warning: (ae-forgotten-export) The symbol "GetTagResult" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "createMockTag" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "createMockTag" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const createMockTag: (overrides: Partial) => GetTagResult; +// Warning: (ae-missing-release-tag) "CreateRcOnSuccessArgs" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface CreateRcOnSuccessArgs { + // (undocumented) + comparisonUrl: string; + // (undocumented) + createdTag: string; + // (undocumented) + gitReleaseName: string | null; + // (undocumented) + gitReleaseUrl: string; + // Warning: (ae-forgotten-export) The symbol "UseCreateReleaseCandidate" needs to be exported by the entry point index.d.ts + // + // (undocumented) + input: Omit; + // (undocumented) + previousTag?: string; +} + // Warning: (ae-forgotten-export) The symbol "DifferProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "Differ" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "Differ" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const Differ: ({ current, next, icon }: DifferProps) => JSX.Element; -// Warning: (ae-missing-release-tag) "DISABLE_CACHE" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "DISABLE_CACHE" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const DISABLE_CACHE: { @@ -84,7 +153,7 @@ const DISABLE_CACHE: { }; }; -// Warning: (ae-missing-release-tag) "Divider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "Divider" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const Divider: () => JSX.Element; @@ -129,7 +198,7 @@ function getBumpedTag(options: { error: AlertError; }; -// Warning: (ae-missing-release-tag) "getCalverTagParts" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "getCalverTagParts" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) function getCalverTagParts(tag: string): @@ -142,7 +211,7 @@ function getCalverTagParts(tag: string): error?: undefined; }; -// Warning: (ae-missing-release-tag) "getSemverTagParts" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "getSemverTagParts" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) function getSemverTagParts(tag: string): @@ -155,7 +224,7 @@ function getSemverTagParts(tag: string): error?: undefined; }; -// Warning: (ae-missing-release-tag) "getShortCommitHash" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "getShortCommitHash" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) function getShortCommitHash(hash: string): string; @@ -176,18 +245,18 @@ function getTagParts(options: { project: Project; tag: string }): }; // Warning: (ae-forgotten-export) The symbol "GitReleaseApi" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "gitReleaseManagerApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "gitReleaseManagerApiRef" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const gitReleaseManagerApiRef: ApiRef; // Warning: (ae-forgotten-export) The symbol "GitReleaseManager" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "GitReleaseManagerPage" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "GitReleaseManagerPage" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const GitReleaseManagerPage: GitReleaseManager; -// Warning: (ae-missing-release-tag) "gitReleaseManagerPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "gitReleaseManagerPlugin" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const gitReleaseManagerPlugin: BackstagePlugin< @@ -198,20 +267,32 @@ export const gitReleaseManagerPlugin: BackstagePlugin< {} >; +declare namespace helpers { + export { + calverRegexp, + getCalverTagParts, + CalverTagParts, + getBumpedSemverTagParts, + getBumpedTag, + getSemverTagParts, + semverRegexp, + getShortCommitHash, + getTagParts, + isCalverTagParts, + isProjectValid, + validateTagName, + }; +} + // @public (undocumented) const InfoCardPlus: (props: { children?: React_2.ReactNode }) => JSX.Element; -// Warning: (ae-missing-release-tag) "internals" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const internals: { - components: typeof components; - constants: typeof constants; - helpers: typeof helpers; - testHelpers: typeof testHelpers; -}; +declare namespace internals { + export { components, constants, helpers, testHelpers }; +} +export { internals }; -// Warning: (ae-missing-release-tag) "isCalverTagParts" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "isCalverTagParts" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) function isCalverTagParts( @@ -219,12 +300,12 @@ function isCalverTagParts( _tagParts: unknown, ): _tagParts is CalverTagParts; -// Warning: (ae-missing-release-tag) "isProjectValid" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "isProjectValid" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) function isProjectValid(project: any): project is Project; -// Warning: (ae-missing-release-tag) "LinearProgressWithLabel" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "LinearProgressWithLabel" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) function LinearProgressWithLabel(props: { @@ -232,88 +313,88 @@ function LinearProgressWithLabel(props: { responseSteps: ResponseStep[]; }): JSX.Element; -// Warning: (ae-missing-release-tag) "MOCK_RELEASE_BRANCH_NAME_CALVER" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "MOCK_RELEASE_BRANCH_NAME_CALVER" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const MOCK_RELEASE_BRANCH_NAME_CALVER: string; -// Warning: (ae-missing-release-tag) "MOCK_RELEASE_BRANCH_NAME_SEMVER" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "MOCK_RELEASE_BRANCH_NAME_SEMVER" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const MOCK_RELEASE_BRANCH_NAME_SEMVER: string; -// Warning: (ae-missing-release-tag) "MOCK_RELEASE_CANDIDATE_TAG_NAME_CALVER" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "MOCK_RELEASE_CANDIDATE_TAG_NAME_CALVER" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const MOCK_RELEASE_CANDIDATE_TAG_NAME_CALVER: string; -// Warning: (ae-missing-release-tag) "MOCK_RELEASE_CANDIDATE_TAG_NAME_SEMVER" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "MOCK_RELEASE_CANDIDATE_TAG_NAME_SEMVER" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const MOCK_RELEASE_CANDIDATE_TAG_NAME_SEMVER: string; -// Warning: (ae-missing-release-tag) "MOCK_RELEASE_NAME_CALVER" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "MOCK_RELEASE_NAME_CALVER" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const MOCK_RELEASE_NAME_CALVER: string; -// Warning: (ae-missing-release-tag) "MOCK_RELEASE_NAME_SEMVER" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "MOCK_RELEASE_NAME_SEMVER" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const MOCK_RELEASE_NAME_SEMVER: string; -// Warning: (ae-missing-release-tag) "MOCK_RELEASE_VERSION_TAG_NAME_CALVER" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "MOCK_RELEASE_VERSION_TAG_NAME_CALVER" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const MOCK_RELEASE_VERSION_TAG_NAME_CALVER: string; -// Warning: (ae-missing-release-tag) "MOCK_RELEASE_VERSION_TAG_NAME_SEMVER" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "MOCK_RELEASE_VERSION_TAG_NAME_SEMVER" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const MOCK_RELEASE_VERSION_TAG_NAME_SEMVER: string; -// Warning: (ae-missing-release-tag) "mockBumpedTag" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockBumpedTag" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockBumpedTag = 'rc-2020.01.01_1337'; -// Warning: (ae-missing-release-tag) "mockCalverProject" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockCalverProject" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockCalverProject: Project; -// Warning: (ae-missing-release-tag) "mockCtaMessage" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockCtaMessage" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockCtaMessage = 'Patch Release Candidate'; -// Warning: (ae-missing-release-tag) "mockDefaultBranch" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockDefaultBranch" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockDefaultBranch = 'mock_defaultBranch'; -// Warning: (ae-missing-release-tag) "mockEmail" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockEmail" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockEmail = 'mock_email'; // Warning: (ae-forgotten-export) The symbol "getReleaseCandidateGitInfo" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "mockNextGitInfoCalver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockNextGitInfoCalver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockNextGitInfoCalver: ReturnType; -// Warning: (ae-missing-release-tag) "mockNextGitInfoSemver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockNextGitInfoSemver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockNextGitInfoSemver: ReturnType; -// Warning: (ae-missing-release-tag) "mockOwner" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockOwner" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockOwner = 'mock_owner'; -// Warning: (ae-missing-release-tag) "mockReleaseBranch" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockReleaseBranch" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockReleaseBranch: { @@ -331,7 +412,7 @@ const mockReleaseBranch: { }; }; -// Warning: (ae-missing-release-tag) "mockReleaseCandidateCalver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockReleaseCandidateCalver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockReleaseCandidateCalver: { @@ -343,7 +424,7 @@ const mockReleaseCandidateCalver: { body?: string | null | undefined; }; -// Warning: (ae-missing-release-tag) "mockReleaseCandidateSemver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockReleaseCandidateSemver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockReleaseCandidateSemver: { @@ -356,12 +437,12 @@ const mockReleaseCandidateSemver: { }; // Warning: (ae-forgotten-export) The symbol "ReleaseStats" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "mockReleaseStats" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockReleaseStats" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockReleaseStats: ReleaseStats; -// Warning: (ae-missing-release-tag) "mockReleaseVersionCalver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockReleaseVersionCalver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockReleaseVersionCalver: { @@ -373,7 +454,7 @@ const mockReleaseVersionCalver: { body?: string | null | undefined; }; -// Warning: (ae-missing-release-tag) "mockReleaseVersionSemver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockReleaseVersionSemver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockReleaseVersionSemver: { @@ -385,22 +466,22 @@ const mockReleaseVersionSemver: { body?: string | null | undefined; }; -// Warning: (ae-missing-release-tag) "mockRepo" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockRepo" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockRepo = 'mock_repo'; -// Warning: (ae-missing-release-tag) "mockSearchCalver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockSearchCalver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockSearchCalver: string; -// Warning: (ae-missing-release-tag) "mockSearchSemver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockSearchSemver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockSearchSemver: string; -// Warning: (ae-missing-release-tag) "mockSelectedPatchCommit" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockSelectedPatchCommit" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockSelectedPatchCommit: { @@ -416,17 +497,17 @@ const mockSelectedPatchCommit: { firstParentSha?: string | undefined; }; -// Warning: (ae-missing-release-tag) "mockSemverProject" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockSemverProject" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockSemverProject: Project; -// Warning: (ae-missing-release-tag) "mockTagParts" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockTagParts" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockTagParts: CalverTagParts; -// Warning: (ae-missing-release-tag) "mockUser" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockUser" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockUser: { @@ -434,18 +515,86 @@ const mockUser: { email: string; }; -// Warning: (ae-missing-release-tag) "mockUsername" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "mockUsername" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const mockUsername = 'mock_username'; -// Warning: (ae-missing-release-tag) "NoLatestRelease" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "NoLatestRelease" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const NoLatestRelease: () => JSX.Element; +// Warning: (ae-missing-release-tag) "PatchOnSuccessArgs" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface PatchOnSuccessArgs { + // Warning: (ae-forgotten-export) The symbol "UsePatch" needs to be exported by the entry point index.d.ts + // + // (undocumented) + input: Omit; + // (undocumented) + patchCommitMessage: string; + // (undocumented) + patchCommitUrl: string; + // (undocumented) + patchedTag: string; + // (undocumented) + previousTag: string; + // (undocumented) + updatedReleaseName: string | null; + // (undocumented) + updatedReleaseUrl: string; +} + +// Warning: (ae-missing-release-tag) "Project" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface Project { + isProvidedViaProps: boolean; + owner: string; + repo: string; + versioningStrategy: keyof typeof VERSIONING_STRATEGIES; +} + +// Warning: (ae-missing-release-tag) "PromoteRcOnSuccessArgs" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface PromoteRcOnSuccessArgs { + // (undocumented) + gitReleaseName: string | null; + // (undocumented) + gitReleaseUrl: string; + // Warning: (ae-forgotten-export) The symbol "UsePromoteRc" needs to be exported by the entry point index.d.ts + // + // (undocumented) + input: Omit; + // (undocumented) + previousTag: string; + // (undocumented) + previousTagUrl: string; + // (undocumented) + updatedTag: string; + // (undocumented) + updatedTagUrl: string; +} + +// Warning: (ae-missing-release-tag) "ResponseStep" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface ResponseStep { + // (undocumented) + icon?: 'success' | 'failure'; + // (undocumented) + link?: string; + // (undocumented) + message: React.ReactNode; + // (undocumented) + secondaryMessage?: string | React.ReactNode; +} + // Warning: (ae-forgotten-export) The symbol "DialogProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "ResponseStepDialog" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "ResponseStepDialog" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const ResponseStepDialog: ({ @@ -455,7 +604,7 @@ const ResponseStepDialog: ({ }: DialogProps) => JSX.Element; // Warning: (ae-forgotten-export) The symbol "ResponseStepListProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "ResponseStepList" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "ResponseStepList" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const ResponseStepList: ({ @@ -467,7 +616,7 @@ const ResponseStepList: ({ }: PropsWithChildren) => JSX.Element; // Warning: (ae-forgotten-export) The symbol "ResponseStepListItemProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "ResponseStepListItem" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "ResponseStepListItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const ResponseStepListItem: ({ @@ -475,7 +624,7 @@ const ResponseStepListItem: ({ animationDelay, }: ResponseStepListItemProps) => JSX.Element; -// Warning: (ae-missing-release-tag) "SEMVER_PARTS" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "SEMVER_PARTS" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const SEMVER_PARTS: { @@ -484,7 +633,7 @@ const SEMVER_PARTS: { patch: 'patch'; }; -// Warning: (ae-missing-release-tag) "semverRegexp" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "semverRegexp" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const semverRegexp: RegExp; @@ -493,13 +642,13 @@ declare namespace stats { export { mockReleaseStats }; } -// Warning: (ae-missing-release-tag) "TAG_OBJECT_MESSAGE" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "TAG_OBJECT_MESSAGE" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const TAG_OBJECT_MESSAGE = 'Tag generated by your friendly neighborhood Backstage Release Manager'; -// Warning: (ae-missing-release-tag) "TEST_IDS" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "TEST_IDS" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const TEST_IDS: { @@ -565,6 +714,10 @@ const TEST_IDS: { }; }; +declare namespace testHelpers { + export { stats, testHelpers_2 as testHelpers, testIds }; +} + declare namespace testHelpers_2 { export { mockUsername, @@ -619,22 +772,11 @@ const validateTagName: (options: { project: Project; tagName?: string }) => tagNameError: AlertError | undefined; }; -// Warning: (ae-missing-release-tag) "VERSIONING_STRATEGIES" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "VERSIONING_STRATEGIES" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) const VERSIONING_STRATEGIES: { semver: 'semver'; calver: 'calver'; }; - -// Warnings were encountered during analysis: -// -// src/components/ResponseStepDialog/LinearProgressWithLabel.d.ts:5:5 - (ae-forgotten-export) The symbol "ResponseStep" needs to be exported by the entry point index.d.ts -// src/helpers/getBumpedTag.d.ts:16:5 - (ae-forgotten-export) The symbol "Project" needs to be exported by the entry point index.d.ts -// src/helpers/getBumpedTag.d.ts:21:5 - (ae-forgotten-export) The symbol "CalverTagParts" needs to be exported by the entry point index.d.ts -// src/helpers/getBumpedTag.d.ts:33:5 - (ae-forgotten-export) The symbol "AlertError" needs to be exported by the entry point index.d.ts -// src/index.d.ts:9:5 - (ae-forgotten-export) The symbol "components" needs to be exported by the entry point index.d.ts -// src/index.d.ts:10:5 - (ae-forgotten-export) The symbol "constants" needs to be exported by the entry point index.d.ts -// src/index.d.ts:11:5 - (ae-forgotten-export) The symbol "helpers" needs to be exported by the entry point index.d.ts -// src/index.d.ts:12:5 - (ae-forgotten-export) The symbol "testHelpers" needs to be exported by the entry point index.d.ts ``` diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index fe65ff159b..d3273e686d 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.25", + "version": "0.3.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/src/components/Differ.tsx b/plugins/git-release-manager/src/components/Differ.tsx index c29f3732e3..d579a8d6c7 100644 --- a/plugins/git-release-manager/src/components/Differ.tsx +++ b/plugins/git-release-manager/src/components/Differ.tsx @@ -16,6 +16,7 @@ import React, { ReactNode } from 'react'; import { grey } from '@material-ui/core/colors'; +import Typography from '@material-ui/core/Typography'; import CallSplitIcon from '@material-ui/icons/CallSplit'; import ChatIcon from '@material-ui/icons/Chat'; import DynamicFeedIcon from '@material-ui/icons/DynamicFeed'; @@ -35,29 +36,31 @@ export const Differ = ({ current, next, icon }: DifferProps) => { return ( <> {icon && ( - + {' '} - + )} {!!current && ( - {current ?? 'None'} - + )} - {current && next && {' → '}} + {current && next && {' → '}} {next && ( - {next} - + )} ); diff --git a/plugins/git-release-manager/src/components/ResponseStepDialog/LinearProgressWithLabel.tsx b/plugins/git-release-manager/src/components/ResponseStepDialog/LinearProgressWithLabel.tsx index 5c4b34b3b9..2b95e5f247 100644 --- a/plugins/git-release-manager/src/components/ResponseStepDialog/LinearProgressWithLabel.tsx +++ b/plugins/git-release-manager/src/components/ResponseStepDialog/LinearProgressWithLabel.tsx @@ -50,8 +50,9 @@ export function LinearProgressWithLabel(props: { const CompletionEmoji = () => { if (status === STATUSES.ONGOING) return null; - if (status === STATUSES.FAILURE) return {` ${ICONS.FAILURE} `}; - return {` ${ICONS.SUCCESS} `}; + if (status === STATUSES.FAILURE) + return {` ${ICONS.FAILURE} `}; + return {` ${ICONS.SUCCESS} `}; }; return ( diff --git a/plugins/git-release-manager/src/features/Info/Info.test.tsx b/plugins/git-release-manager/src/features/Info/Info.test.tsx index c98290cfae..1fcd53eb9c 100644 --- a/plugins/git-release-manager/src/features/Info/Info.test.tsx +++ b/plugins/git-release-manager/src/features/Info/Info.test.tsx @@ -42,6 +42,7 @@ describe('Info', () => { expect(await findByText(mockReleaseBranch.name)).toMatchInlineSnapshot(` @@ -53,6 +54,7 @@ describe('Info', () => { await findByText(`${mockCalverProject.owner}/${mockCalverProject.repo}`), ).toMatchInlineSnapshot(` @@ -63,6 +65,7 @@ describe('Info', () => { expect(await findByText(mockCalverProject.versioningStrategy)) .toMatchInlineSnapshot(` @@ -73,6 +76,7 @@ describe('Info', () => { expect(await findByText(mockReleaseCandidateCalver.tagName)) .toMatchInlineSnapshot(` diff --git a/plugins/git-release-manager/src/helpers/index.tsx b/plugins/git-release-manager/src/helpers/index.tsx index 1516e192a1..6589596114 100644 --- a/plugins/git-release-manager/src/helpers/index.tsx +++ b/plugins/git-release-manager/src/helpers/index.tsx @@ -15,6 +15,7 @@ */ export { calverRegexp, getCalverTagParts } from './tagParts/getCalverTagParts'; +export type { CalverTagParts } from './tagParts/getCalverTagParts'; export { getBumpedSemverTagParts, getBumpedTag } from './getBumpedTag'; export { getSemverTagParts, semverRegexp } from './tagParts/getSemverTagParts'; export { getShortCommitHash } from './getShortCommitHash'; diff --git a/plugins/git-release-manager/src/hooks/useResponseSteps.test.ts b/plugins/git-release-manager/src/hooks/useResponseSteps.test.ts index 450fc87b97..513c51758d 100644 --- a/plugins/git-release-manager/src/hooks/useResponseSteps.test.ts +++ b/plugins/git-release-manager/src/hooks/useResponseSteps.test.ts @@ -75,12 +75,13 @@ describe('useResponseSteps', () => { "message": Something went wrong - 🔥 - + , "secondaryMessage": "Error message: :(", }, @@ -108,12 +109,13 @@ describe('useResponseSteps', () => { "message": Something went wrong - 🔥 - + , "secondaryMessage": "Error message: unknown", }, diff --git a/plugins/git-release-manager/src/hooks/useResponseSteps.tsx b/plugins/git-release-manager/src/hooks/useResponseSteps.tsx index 3c44a34a0d..583412f2c3 100644 --- a/plugins/git-release-manager/src/hooks/useResponseSteps.tsx +++ b/plugins/git-release-manager/src/hooks/useResponseSteps.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ +import Typography from '@material-ui/core/Typography'; import React, { useState } from 'react'; import { ResponseStep } from '../types/types'; @@ -30,9 +31,9 @@ export function useResponseSteps() { message: ( Something went wrong{' '} - + 🔥 - + ), secondaryMessage: `Error message: ${ diff --git a/plugins/git-release-manager/src/index.ts b/plugins/git-release-manager/src/index.ts index ac6b294cbc..e8fa661c21 100644 --- a/plugins/git-release-manager/src/index.ts +++ b/plugins/git-release-manager/src/index.ts @@ -26,11 +26,17 @@ export { gitReleaseManagerApiRef, } from './plugin'; -import { components, constants, helpers, testHelpers } from './plugin'; +import * as internals from './internals'; -export const internals = { - components, - constants, - helpers, - testHelpers, -}; +export { internals }; + +export type { + ComponentConfig, + CreateRcOnSuccessArgs, + PatchOnSuccessArgs, + PromoteRcOnSuccessArgs, + ResponseStep, + AlertError, +} from './types/types'; + +export type { Project } from './contexts/ProjectContext'; diff --git a/plugins/git-release-manager/src/internals.ts b/plugins/git-release-manager/src/internals.ts new file mode 100644 index 0000000000..2cd7863bac --- /dev/null +++ b/plugins/git-release-manager/src/internals.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 { components, constants, helpers, testHelpers } from './plugin'; diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index b07881013a..88cf0f6808 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,62 @@ # @backstage/plugin-github-actions +## 0.5.14 + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## 0.5.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/integration@1.4.2-next.0 + - @backstage/theme@0.2.16 + +## 0.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/integration@1.4.2-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/integration@1.4.1 + - @backstage/theme@0.2.16 + +## 0.5.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.5.12 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index aecce63b3f..93320fe766 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.5.12", + "version": "0.5.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/src/__fixtures__/get-workflow-run.json b/plugins/github-actions/src/__fixtures__/get-workflow-run.json index 38c3513b15..7b6b3b3890 100644 --- a/plugins/github-actions/src/__fixtures__/get-workflow-run.json +++ b/plugins/github-actions/src/__fixtures__/get-workflow-run.json @@ -3,6 +3,7 @@ "name": "Build", "node_id": "MDEyOldvcmtmbG93IFJ1bjI2OTI4OQ==", "check_suite_id": 42, + "display_title": "foo", "check_suite_node_id": "MDEwOkNoZWNrU3VpdGU0Mg==", "head_branch": "main", "head_sha": "acb5820ced9479c074f688cc328bf03f341a511d", diff --git a/plugins/github-actions/src/components/WorkflowRunsTable/WorkflowRunsTable.tsx b/plugins/github-actions/src/components/WorkflowRunsTable/WorkflowRunsTable.tsx index 88f8567b90..f05a41e71b 100644 --- a/plugins/github-actions/src/components/WorkflowRunsTable/WorkflowRunsTable.tsx +++ b/plugins/github-actions/src/components/WorkflowRunsTable/WorkflowRunsTable.tsx @@ -68,8 +68,12 @@ const generatedColumns: TableColumn[] = [ title: 'Source', render: (row: Partial) => ( -

{row.source?.branchName}

-

{row.source?.commit.hash}

+ + {row.source?.branchName} + + + {row.source?.commit.hash} +
), }, diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index 4a4d9c05ec..f55803fc5c 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,70 @@ # @backstage/plugin-github-deployments +## 0.1.45 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.9 + - @backstage/theme@0.2.16 + +## 0.1.45-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-react@1.1.9-next.2 + - @backstage/theme@0.2.16 + +## 0.1.45-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-react@1.1.9-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.45-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/integration-react@1.1.9-next.0 + - @backstage/theme@0.2.16 + +## 0.1.44 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/integration-react@1.1.8 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.43 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 70c6d53f10..523a7af480 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.43", + "version": "0.1.45", "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 dab4fd740d..5ba471e4ad 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,65 @@ # @backstage/plugin-github-issues +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/theme@0.2.16 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/theme@0.2.16 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.2.1 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index c10d0283e0..655818f164 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.1", + "version": "0.2.3", "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 c5d1666701..6681f1f7c7 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/integration@1.4.2-next.0 + - @backstage/theme@0.2.16 + +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/integration@1.4.2-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/integration@1.4.1 + - @backstage/theme@0.2.16 + +## 0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.6 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index ce059d64cf..01657b7b93 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.6", + "version": "0.1.8", "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 b3b8b8d844..c7e895315a 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-gitops-profiles +## 0.3.32 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.3.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.3.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + +## 0.3.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.3.31 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.3.30 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index e3025031bf..b485aea867 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gitops-profiles", "description": "A Backstage plugin that helps you manage GitOps profiles", - "version": "0.3.30", + "version": "0.3.32", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx b/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx index e158bcf6ad..5aa59a1cae 100644 --- a/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx +++ b/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx @@ -15,8 +15,6 @@ */ import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; import React from 'react'; import { gitOpsApiRef, GitOpsRestApi } from '../../api'; import ProfileCatalog from './ProfileCatalog'; @@ -47,11 +45,9 @@ describe('ProfileCatalog', () => { ); const { getByText } = await renderInTestApp( - - - - - , + + + , ); expect(getByText('Create GitOps-managed Cluster')).toBeInTheDocument(); diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 0096ec096a..2cc84e0b68 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-gocd +## 0.1.20 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.18 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index 3b25b36669..684737f2b9 100644 --- a/plugins/gocd/package.json +++ b/plugins/gocd/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gocd", "description": "A Backstage plugin that integrates towards GoCD", - "version": "0.1.18", + "version": "0.1.20", "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 25a753cddd..f14c0602d0 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-graphiql +## 0.2.46 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.2.46-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.2.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + +## 0.2.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.2.45 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.2.44 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index 5752000ec5..92c89dda60 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.44", + "version": "0.2.46", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/graphiql/src/components/GraphiQLBrowser/GraphiQLBrowser.test.tsx b/plugins/graphiql/src/components/GraphiQLBrowser/GraphiQLBrowser.test.tsx index 7724a2ae23..3156662bf3 100644 --- a/plugins/graphiql/src/components/GraphiQLBrowser/GraphiQLBrowser.test.tsx +++ b/plugins/graphiql/src/components/GraphiQLBrowser/GraphiQLBrowser.test.tsx @@ -15,41 +15,33 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/test-utils'; import { GraphiQLBrowser } from './GraphiQLBrowser'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; -jest.mock('graphiql', () => () => ''); +jest.mock('graphiql', () => ({ GraphiQL: () => '' })); describe('GraphiQLBrowser', () => { - it('should render error text if there are no endpoints', () => { - const rendered = render( - - - , - ); + it('should render error text if there are no endpoints', async () => { + const rendered = await renderInTestApp(); rendered.getByText('No endpoints available'); }); - it('should render endpoint tabs', () => { - const rendered = render( - - - , + it('should render endpoint tabs', async () => { + const rendered = await renderInTestApp( + , ); rendered.getByText('Endpoint A'); rendered.getByText('Endpoint B'); diff --git a/plugins/graphiql/src/components/GraphiQLPage/GraphiQLPage.test.tsx b/plugins/graphiql/src/components/GraphiQLPage/GraphiQLPage.test.tsx index 90f8edd4ad..9923facc7b 100644 --- a/plugins/graphiql/src/components/GraphiQLPage/GraphiQLPage.test.tsx +++ b/plugins/graphiql/src/components/GraphiQLPage/GraphiQLPage.test.tsx @@ -16,13 +16,9 @@ import React from 'react'; import { GraphiQLPage } from './GraphiQLPage'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; import { act } from '@testing-library/react'; -import { renderWithEffects, TestApiProvider } from '@backstage/test-utils'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { GraphQLBrowseApi, graphQlBrowseApiRef } from '../../lib/api'; -import { configApiRef } from '@backstage/core-plugin-api'; -import { ConfigReader } from '@backstage/core-app-api'; jest.mock('../GraphiQLBrowser', () => ({ GraphiQLBrowser: () => '', @@ -38,17 +34,9 @@ describe('GraphiQLPage', () => { }, }; - const rendered = await renderWithEffects( - - - - - , + const rendered = await renderInTestApp( + + , , ); act(() => { @@ -66,16 +54,9 @@ describe('GraphiQLPage', () => { }, }; - const rendered = await renderWithEffects( - - - - + const rendered = await renderInTestApp( + + , ); @@ -90,16 +71,9 @@ describe('GraphiQLPage', () => { }, }; - const rendered = await renderWithEffects( - - - - + const rendered = await renderInTestApp( + + , ); diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index da362fb71d..7365acdee1 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-graphql-backend +## 0.1.30 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/plugin-catalog-graphql@0.3.17 + +## 0.1.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-catalog-graphql@0.3.17-next.1 + +## 0.1.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-catalog-graphql@0.3.17-next.1 + +## 0.1.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/plugin-catalog-graphql@0.3.17-next.0 + ## 0.1.29 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 10d5426cc8..e2d0f854c0 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.29", + "version": "0.1.30", "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 8afd364136..968a5870c4 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,68 @@ # @backstage/plugin-home +## 0.4.30 + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-stack-overflow@0.1.10 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/theme@0.2.16 + +## 0.4.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-stack-overflow@0.1.10-next.2 + +## 0.4.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-stack-overflow@0.1.10-next.1 + +## 0.4.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-stack-overflow@0.1.10-next.0 + +## 0.4.29 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + - @backstage/plugin-stack-overflow@0.1.9 + ## 0.4.28 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 1196950333..7fe4068947 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home", "description": "A Backstage plugin that helps you build a home page", - "version": "0.4.28", + "version": "0.4.30", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home/src/homePageComponents/HeaderWorldClock/HeaderWorldClock.test.tsx b/plugins/home/src/homePageComponents/HeaderWorldClock/HeaderWorldClock.test.tsx index db92fbb89f..03f19fb046 100644 --- a/plugins/home/src/homePageComponents/HeaderWorldClock/HeaderWorldClock.test.tsx +++ b/plugins/home/src/homePageComponents/HeaderWorldClock/HeaderWorldClock.test.tsx @@ -17,8 +17,6 @@ import { renderInTestApp } from '@backstage/test-utils'; import { HeaderWorldClock, ClockConfig } from './HeaderWorldClock'; import React from 'react'; -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; describe('HeaderWorldClock with valid Time Zones', () => { it('displays Time Zones as expected', async () => { @@ -42,9 +40,7 @@ describe('HeaderWorldClock with valid Time Zones', () => { ]; const rendered = await renderInTestApp( - - - , + , ); expect(rendered.getByText('NYC')).toBeInTheDocument(); @@ -59,9 +55,7 @@ describe('HeaderWorldClock with no Time Zones provided', () => { const clockConfigs: ClockConfig[] = []; const rendered = await renderInTestApp( - - - , + , ); expect(rendered.container).toBeEmptyDOMElement(); @@ -78,9 +72,7 @@ describe('HeaderWorldClock with invalid Time Zone', () => { ]; const rendered = await renderInTestApp( - - - , + , ); expect(rendered.getByText('GMT')).toBeInTheDocument(); @@ -105,12 +97,10 @@ describe('HeaderWorldClock with custom Time Format', () => { }; const rendered = await renderInTestApp( - - - , + , ); expect(rendered.getByText('09:10')).toBeInTheDocument(); diff --git a/plugins/home/src/homePageComponents/RandomJoke/Content.tsx b/plugins/home/src/homePageComponents/RandomJoke/Content.tsx index 231e32356a..80467c46fa 100644 --- a/plugins/home/src/homePageComponents/RandomJoke/Content.tsx +++ b/plugins/home/src/homePageComponents/RandomJoke/Content.tsx @@ -14,18 +14,19 @@ * limitations under the License. */ +import Typography from '@material-ui/core/Typography'; import React from 'react'; import { useRandomJoke } from './Context'; export const Content = () => { const { joke, loading } = useRandomJoke(); - if (loading) return

Loading...

; + if (loading) return Loading...; return (
-

{joke.setup}

-

{joke.punchline}

+ {joke.setup} + {joke.punchline}
); }; diff --git a/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx b/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx index 40a5361f43..1d2f3d672a 100644 --- a/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx +++ b/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx @@ -19,6 +19,7 @@ import { useApi, } from '@backstage/core-plugin-api'; import { Tooltip } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import React, { useEffect, useMemo } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { getTimeBasedGreeting } from './timeUtil'; @@ -43,9 +44,9 @@ export const WelcomeTitle = () => { return ( - {`${greeting.greeting}${ + {`${greeting.greeting}${ profile?.displayName ? `, ${profile?.displayName}` : '' - }!`} + }!`} ); }; diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index c509f60e00..c3f33fc4f4 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,63 @@ # @backstage/plugin-ilert +## 0.2.3 + +### Patch Changes + +- b1279d396d: fixed error on service page not showing if historical uptime was disabled on a service +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.2.3-next.0 + +### Patch Changes + +- b1279d396d: fixed error on service page not showing if historical uptime was disabled on a service +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.2.1 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 605e1f367e..fffbcbc16e 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.1", + "version": "0.2.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/ilert/src/components/ServicesPage/ServicesTable.tsx b/plugins/ilert/src/components/ServicesPage/ServicesTable.tsx index 30a83e4cec..2597986031 100644 --- a/plugins/ilert/src/components/ServicesPage/ServicesTable.tsx +++ b/plugins/ilert/src/components/ServicesPage/ServicesTable.tsx @@ -86,7 +86,7 @@ export const ServicesTable = ({ cellStyle: smColumnStyle, headerStyle: smColumnStyle, render: rowData => ( - {rowData.uptime.uptimePercentage.p90} + {rowData.uptime?.uptimePercentage?.p90 || ''} ), }; const actionsColumn: TableColumn = { diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 685579d3d6..8925ad532f 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-jenkins-backend +## 0.1.30 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-jenkins-common@0.1.12 + - @backstage/plugin-permission-common@0.7.3 + +## 0.1.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-jenkins-common@0.1.12-next.1 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.1.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-jenkins-common@0.1.12-next.1 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.1.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/plugin-jenkins-common@0.1.12-next.0 + - @backstage/plugin-permission-common@0.7.2 + ## 0.1.29 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 4b83b449cf..ecddb43149 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.1.29", + "version": "0.1.30", "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 13568fe8f3..82307ff247 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-jenkins-common +## 0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.10 + - @backstage/plugin-permission-common@0.7.3 + +## 0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.10-next.0 + - @backstage/plugin-permission-common@0.7.2 + ## 0.1.11 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index ce639d5d9c..0950759950 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.11", + "version": "0.1.12", "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 c81fd2474a..e562f6b598 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,66 @@ # @backstage/plugin-jenkins +## 0.7.13 + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-jenkins-common@0.1.12 + +## 0.7.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-jenkins-common@0.1.12-next.1 + +## 0.7.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-jenkins-common@0.1.12-next.1 + +## 0.7.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-jenkins-common@0.1.12-next.0 + +## 0.7.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.7.11 ### Patch Changes diff --git a/plugins/jenkins/api-report.md b/plugins/jenkins/api-report.md index 59e3dc636e..a2ae16988b 100644 --- a/plugins/jenkins/api-report.md +++ b/plugins/jenkins/api-report.md @@ -28,12 +28,12 @@ const isJenkinsAvailable: (entity: Entity) => boolean; export { isJenkinsAvailable }; export { isJenkinsAvailable as isPluginApplicableToEntity }; -// Warning: (ae-missing-release-tag) "JENKINS_ANNOTATION" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "JENKINS_ANNOTATION" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const JENKINS_ANNOTATION = 'jenkins.io/job-full-name'; -// Warning: (ae-missing-release-tag) "JenkinsApi" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "JenkinsApi" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export interface JenkinsApi { @@ -58,12 +58,12 @@ export interface JenkinsApi { }): Promise; } -// Warning: (ae-missing-release-tag) "jenkinsApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "jenkinsApiRef" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const jenkinsApiRef: ApiRef; -// Warning: (ae-missing-release-tag) "JenkinsClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "JenkinsClient" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export class JenkinsClient implements JenkinsApi { @@ -103,7 +103,7 @@ const jenkinsPlugin: BackstagePlugin< export { jenkinsPlugin }; export { jenkinsPlugin as plugin }; -// Warning: (ae-missing-release-tag) "LatestRunCard" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "LatestRunCard" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const LatestRunCard: (props: { @@ -111,12 +111,12 @@ export const LatestRunCard: (props: { variant?: InfoCardVariants; }) => JSX.Element; -// Warning: (ae-missing-release-tag) "LEGACY_JENKINS_ANNOTATION" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "LEGACY_JENKINS_ANNOTATION" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const LEGACY_JENKINS_ANNOTATION = 'jenkins.io/github-folder'; -// Warning: (ae-missing-release-tag) "Router" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) export const Router: () => JSX.Element; diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index d15e5b580d..b82ed97e08 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.7.11", + "version": "0.7.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx index c525e297be..0217f00513 100644 --- a/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx @@ -126,12 +126,12 @@ const generatedColumns: TableColumn[] = [ field: 'lastBuild.source.branchName', render: (row: Partial) => ( <> -

+ {row.lastBuild?.source?.branchName} -

-

{row.lastBuild?.source?.commit?.hash}

+ + {row.lastBuild?.source?.commit?.hash} ), }, @@ -152,7 +152,7 @@ const generatedColumns: TableColumn[] = [ render: (row: Partial) => { return ( <> -

+ {row.lastBuild?.tests && ( {row.lastBuild?.tests.passed} / {row.lastBuild?.tests.total}{' '} @@ -165,7 +165,7 @@ const generatedColumns: TableColumn[] = [ )} {!row.lastBuild?.tests && 'n/a'} -

+ ); }, diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index b573ae4eb3..4800c3161e 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-kafka-backend +## 0.2.33 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## 0.2.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + +## 0.2.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + +## 0.2.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + ## 0.2.32 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 66c4ffce0a..db3ffd6dde 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.32", + "version": "0.2.33", "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 d5f02615c8..f5f59c6e15 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-kafka +## 0.3.14 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/theme@0.2.16 + +## 0.3.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.3.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.3.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.3.12 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index a56c915946..e9ee53d3ad 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.12", + "version": "0.3.14", "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 fd60b462bb..bb212a7607 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,64 @@ # @backstage/plugin-kubernetes-backend +## 0.9.1 + +### Patch Changes + +- 083bf1b9fa: fixes a bug affecting clusters that have a base path in the URL. The base path was being replaced with the resource path instead of being appended +- c6f29bfcdc: Added the missing auth provider googleServiceAccount in config schema. +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/backend-test-utils@0.1.32 + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-kubernetes-common@0.5.1 + +## 0.9.1-next.2 + +### Patch Changes + +- c6f29bfcdc: Added the missing auth provider googleServiceAccount in config schema. +- Updated dependencies + - @backstage/backend-test-utils@0.1.32-next.2 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-kubernetes-common@0.5.1-next.1 + +## 0.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.32-next.1 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-kubernetes-common@0.5.1-next.1 + +## 0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/backend-test-utils@0.1.32-next.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/plugin-kubernetes-common@0.5.1-next.0 + ## 0.9.0 ### Minor Changes diff --git a/plugins/kubernetes-backend/config.d.ts b/plugins/kubernetes-backend/config.d.ts index cc6c8bcd46..d3f197c21e 100644 --- a/plugins/kubernetes-backend/config.d.ts +++ b/plugins/kubernetes-backend/config.d.ts @@ -47,7 +47,8 @@ export interface Config { | 'google' | 'serviceAccount' | 'azure' - | 'oidc'; + | 'oidc' + | 'googleServiceAccount'; /** @visibility frontend */ oidcTokenProvider?: string; /** @visibility frontend */ diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 9b163361f3..679162d890 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.9.0", + "version": "0.9.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/src/routes/resourceRoutes.test.ts b/plugins/kubernetes-backend/src/routes/resourceRoutes.test.ts index 57e6514a96..753be36fb0 100644 --- a/plugins/kubernetes-backend/src/routes/resourceRoutes.test.ts +++ b/plugins/kubernetes-backend/src/routes/resourceRoutes.test.ts @@ -248,8 +248,6 @@ describe('resourcesRoutes', () => { error: { name: 'Error', message: 'some internal error', - level: 'error', - service: 'backstage', }, request: { method: 'POST', url: '/resources/workloads/query' }, response: { statusCode: 500 }, @@ -534,8 +532,6 @@ describe('resourcesRoutes', () => { error: { name: 'Error', message: 'some internal error', - level: 'error', - service: 'backstage', }, request: { method: 'POST', url: '/resources/custom/query' }, response: { statusCode: 500 }, diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts index 065416f8c1..6482ba5f9e 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts @@ -170,6 +170,71 @@ describe('KubernetesFetcher', () => { }); }); + it('should support clusters with a base path', async () => { + worker.use( + rest.get( + 'http://localhost:9999/k8s/clusters/1234/api/v1/pods', + (req, res, ctx) => + res( + checkToken(req, ctx, 'token'), + withLabels(req, ctx, { + items: [{ metadata: { name: 'pod-name' } }], + }), + ), + ), + rest.get( + 'http://localhost:9999/k8s/clusters/1234/api/v1/services', + (req, res, ctx) => + res( + checkToken(req, ctx, 'token'), + withLabels(req, ctx, { + items: [{ metadata: { name: 'service-name' } }], + }), + ), + ), + ); + + const result = await sut.fetchObjectsForService({ + serviceId: 'some-service', + clusterDetails: { + name: 'cluster1', + url: 'http://localhost:9999/k8s/clusters/1234', + serviceAccountToken: 'token', + authProvider: 'serviceAccount', + }, + objectTypesToFetch: OBJECTS_TO_FETCH, + labelSelector: '', + customResources: [], + }); + + expect(result).toStrictEqual({ + errors: [], + responses: [ + { + type: 'pods', + resources: [ + { + metadata: { + name: 'pod-name', + labels: { 'backstage.io/kubernetes-id': 'some-service' }, + }, + }, + ], + }, + { + type: 'services', + resources: [ + { + metadata: { + name: 'service-name', + labels: { 'backstage.io/kubernetes-id': 'some-service' }, + }, + }, + ], + }, + ], + }); + }); it('should return pods, services', async () => { worker.use( rest.get('http://localhost:9999/api/v1/pods', (req, res, ctx) => @@ -688,6 +753,7 @@ describe('KubernetesFetcher', () => { expect(agent.options.rejectUnauthorized).toBe(false); }); }); + it('should use namespace if provided', async () => { worker.use( rest.get( diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts index 6ef4397e9c..6161c040d7 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts @@ -203,7 +203,12 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { ); } - url.pathname = resourcePath; + if (url.pathname === '/') { + url.pathname = resourcePath; + } else { + url.pathname += resourcePath; + } + if (labelSelector) { url.search = `labelSelector=${labelSelector}`; } diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 51f7f1fcd8..26e2cb3c47 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-kubernetes-common +## 0.5.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + +## 0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + +## 0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + ## 0.5.0 ### Minor Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index b06ddb3783..faae062de2 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.5.0", + "version": "0.5.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index d8d086d189..1abf979827 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,66 @@ # @backstage/plugin-kubernetes +## 0.7.7 + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/theme@0.2.16 + - @backstage/plugin-kubernetes-common@0.5.1 + +## 0.7.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-kubernetes-common@0.5.1-next.1 + +## 0.7.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-kubernetes-common@0.5.1-next.1 + +## 0.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-kubernetes-common@0.5.1-next.0 + +## 0.7.6 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.7.5 ### Patch Changes diff --git a/plugins/kubernetes/api-report.md b/plugins/kubernetes/api-report.md index 3e1b2f0198..463b4126eb 100644 --- a/plugins/kubernetes/api-report.md +++ b/plugins/kubernetes/api-report.md @@ -36,7 +36,7 @@ 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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: ({ @@ -44,19 +44,19 @@ export const Cluster: ({ podsWithErrors, }: ClusterProps) => JSX.Element; -// Warning: (ae-missing-release-tag) "ClusterContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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; -// Warning: (ae-missing-release-tag) "ClusterLinksFormatter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -70,24 +70,24 @@ export interface ClusterLinksFormatterOptions { object: any; } -// Warning: (ae-missing-release-tag) "clusterLinksFormatters" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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; // 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) => 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) => JSX.Element; -// Warning: (ae-missing-release-tag) "DeploymentResources" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -125,7 +125,7 @@ export const detectErrors: ( objects: ObjectsByEntityResponse, ) => DetectedErrorsByCluster; -// Warning: (ae-missing-release-tag) "EntityKubernetesContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) // // @public (undocumented) export const EntityKubernetesContent: ( @@ -144,7 +144,7 @@ export type ErrorDetectableKind = | 'HorizontalPodAutoscaler'; // 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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: ({ @@ -154,7 +154,7 @@ export const ErrorPanel: ({ }: ErrorPanelProps) => 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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: ({ @@ -165,7 +165,7 @@ export const ErrorReporting: ({ export type ErrorSeverity = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10; // 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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( @@ -173,7 +173,7 @@ export function formatClusterLink( ): 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -186,7 +186,7 @@ export class GoogleKubernetesAuthProvider implements KubernetesAuthProvider { ): Promise; } -// Warning: (ae-missing-release-tag) "GroupedResponses" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -206,7 +206,7 @@ export interface GroupedResponses extends DeploymentResources { statefulsets: V1StatefulSet[]; } -// Warning: (ae-missing-release-tag) "GroupedResponsesContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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; @@ -219,23 +219,23 @@ export const HorizontalPodAutoscalerDrawer: (props: { }) => 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) => JSX.Element; -// Warning: (ae-missing-release-tag) "isKubernetesAvailable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) => JSX.Element; -// Warning: (ae-missing-release-tag) "KubernetesApi" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -261,12 +261,12 @@ export interface KubernetesApi { ): Promise; } -// Warning: (ae-missing-release-tag) "kubernetesApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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; -// Warning: (ae-missing-release-tag) "KubernetesAuthProviders" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -283,7 +283,7 @@ export class KubernetesAuthProviders implements KubernetesAuthProvidersApi { ): Promise; } -// Warning: (ae-missing-release-tag) "KubernetesAuthProvidersApi" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -294,12 +294,12 @@ export interface KubernetesAuthProvidersApi { ): Promise; } -// Warning: (ae-missing-release-tag) "kubernetesAuthProvidersApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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; -// Warning: (ae-missing-release-tag) "KubernetesBackendClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -329,7 +329,7 @@ export class KubernetesBackendClient implements KubernetesApi { } // 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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: ({ @@ -339,7 +339,7 @@ export const KubernetesContent: ({ // Warning: (ae-forgotten-export) The symbol "KubernetesDrawerable" needs to be exported by the entry point index.d.ts // 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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: ({ @@ -351,7 +351,7 @@ export const KubernetesDrawer: ({ children, }: KubernetesDrawerProps) => JSX.Element; -// Warning: (ae-missing-release-tag) "KubernetesObjects" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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 { @@ -363,7 +363,7 @@ export interface KubernetesObjects { loading: boolean; } -// Warning: (ae-missing-release-tag) "kubernetesPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) const kubernetesPlugin: BackstagePlugin< @@ -382,12 +382,12 @@ export const PodDrawer: (props: { expanded?: boolean; }) => JSX.Element; -// Warning: (ae-missing-release-tag) "PodNamesWithErrorsContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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>; -// Warning: (ae-missing-release-tag) "PodNamesWithMetricsContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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< @@ -395,7 +395,7 @@ export const PodNamesWithMetricsContext: React_2.Context< >; // 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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: ({ @@ -403,7 +403,7 @@ export const PodsTable: ({ extraColumns, }: PodsTablesProps) => JSX.Element; -// Warning: (ae-missing-release-tag) "Router" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) export const Router: (props: { refreshIntervalMs?: number }) => JSX.Element; @@ -419,7 +419,7 @@ export class ServerSideKubernetesAuthProvider } // 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 exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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) => JSX.Element; @@ -431,7 +431,7 @@ export const useCustomResources: ( intervalMs?: number, ) => KubernetesObjects; -// Warning: (ae-missing-release-tag) "useKubernetesObjects" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// 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: ( diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index a922adff16..8edbc3ae15 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.7.5", + "version": "0.7.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/StepsProgress.tsx b/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/StepsProgress.tsx index ea9c37aa64..c93ab41d1d 100644 --- a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/StepsProgress.tsx +++ b/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/StepsProgress.tsx @@ -16,6 +16,7 @@ import React from 'react'; import { Step, StepLabel, Stepper } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { ArgoRolloutCanaryStep, SetWeightStep, @@ -49,11 +50,11 @@ const createLabelForStep = (step: ArgoRolloutCanaryStep): React.ReactNode => { } else if (isAnalysisStep(step)) { return (
-

analysis templates:

+ analysis templates: {step.analysis.templates.map((t, i) => ( -

{`${t.templateName}${ + {`${t.templateName}${ t.clusterScope ? ' (cluster scoped)' : '' - }`}

+ }`} ))}
); diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index 671eb232e2..5f0d1510ba 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,64 @@ # @backstage/plugin-lighthouse +## 0.3.14 + +### Patch Changes + +- 2f1b283de2: Fixed bug in Lighthouse Plugin where audit list item and create audit button navigated to a wrong URL. +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/theme@0.2.16 + +## 0.3.14-next.2 + +### Patch Changes + +- 2f1b283de2: Fixed bug in Lighthouse Plugin where audit list item and create audit button navigated to a wrong URL. +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.3.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.3.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.3.12 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index 3cb414f4bc..4e67412b17 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.3.12", + "version": "0.3.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/src/components/AuditList/AuditListForEntity.test.tsx b/plugins/lighthouse/src/components/AuditList/AuditListForEntity.test.tsx index 3e34eed6e3..59892e1475 100644 --- a/plugins/lighthouse/src/components/AuditList/AuditListForEntity.test.tsx +++ b/plugins/lighthouse/src/components/AuditList/AuditListForEntity.test.tsx @@ -16,11 +16,8 @@ import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-react'; -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; -import { render } from '@testing-library/react'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import React from 'react'; -import { MemoryRouter } from 'react-router-dom'; import { lighthouseApiRef, LighthouseRestApi, @@ -30,36 +27,18 @@ import { useWebsiteForEntity } from '../../hooks/useWebsiteForEntity'; import * as data from '../../__fixtures__/website-list-response.json'; import { AuditListForEntity } from './AuditListForEntity'; -import { ApiProvider } from '@backstage/core-app-api'; -import { errorApiRef } from '@backstage/core-plugin-api'; -import { TestApiRegistry } from '@backstage/test-utils'; - jest.mock('../../hooks/useWebsiteForEntity', () => ({ useWebsiteForEntity: jest.fn(), })); +const useWebsiteForEntityMock = useWebsiteForEntity as jest.Mock; + const websiteListResponse = data as WebsiteListResponse; const entityWebsite = websiteListResponse.items[0]; describe('', () => { - let apis: TestApiRegistry; - - const mockErrorApi: jest.Mocked = { - post: jest.fn(), - error$: jest.fn(), - }; - - beforeEach(() => { - apis = TestApiRegistry.from( - [lighthouseApiRef, new LighthouseRestApi('http://lighthouse')], - [errorApiRef, mockErrorApi], - ); - - (useWebsiteForEntity as jest.Mock).mockReturnValue({ - value: entityWebsite, - loading: false, - error: null, - }); + afterEach(() => { + jest.resetAllMocks(); }); const entity: Entity = { @@ -78,66 +57,55 @@ describe('', () => { }, }; - const subject = () => - render( - - - - - - - - - , - ); + const subject = () => ( + + + + + + ); it('renders the audit list for the entity', async () => { - const { findByText } = subject(); + useWebsiteForEntityMock.mockReturnValue({ + value: entityWebsite, + loading: false, + error: null, + }); + const { findByText } = await renderInTestApp(subject()); expect(await findByText(entityWebsite.url)).toBeInTheDocument(); }); - describe('where the data is loading', () => { - beforeEach(() => { - (useWebsiteForEntity as jest.Mock).mockReturnValue({ - value: null, - loading: true, - error: null, - }); + it('renders a Progress element where the data is loading', async () => { + useWebsiteForEntityMock.mockReturnValue({ + value: null, + loading: true, + error: null, }); - it('renders a Progress element', async () => { - const { findByTestId } = subject(); - expect(await findByTestId('progress')).toBeInTheDocument(); - }); + const { findByTestId } = await renderInTestApp(subject()); + expect(await findByTestId('progress')).toBeInTheDocument(); }); - describe('where there is an error loading data', () => { - beforeEach(() => { - (useWebsiteForEntity as jest.Mock).mockReturnValue({ - value: null, - loading: false, - error: 'error', - }); - }); - - it('renders nothing', async () => { - const { queryByTestId } = subject(); - expect(queryByTestId('AuditListTable')).toBeNull(); + it('renders nothing where there is an error loading data', async () => { + useWebsiteForEntityMock.mockReturnValue({ + value: null, + loading: false, + error: 'error', }); + const { queryByTestId } = await renderInTestApp(subject()); + expect(queryByTestId('AuditListTable')).toBeNull(); }); - describe('where there is not data', () => { - beforeEach(() => { - (useWebsiteForEntity as jest.Mock).mockReturnValue({ - value: null, - loading: false, - error: null, - }); + it('renders nothing where there is not data', async () => { + useWebsiteForEntityMock.mockReturnValue({ + value: null, + loading: false, + error: null, }); - it('renders nothing', async () => { - const { queryByTestId } = subject(); - expect(queryByTestId('AuditListTable')).toBeNull(); - }); + const { queryByTestId } = await renderInTestApp(subject()); + expect(queryByTestId('AuditListTable')).toBeNull(); }); }); diff --git a/plugins/lighthouse/src/components/AuditList/AuditListTable.tsx b/plugins/lighthouse/src/components/AuditList/AuditListTable.tsx index 4701ae157f..9f5fa94436 100644 --- a/plugins/lighthouse/src/components/AuditList/AuditListTable.tsx +++ b/plugins/lighthouse/src/components/AuditList/AuditListTable.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ import React, { useState, useEffect } from 'react'; +import Typography from '@material-ui/core/Typography'; import { Website, lighthouseApiRef } from '../../api'; import useInterval from 'react-use/lib/useInterval'; import { @@ -112,7 +113,9 @@ export const AuditListTable = ({ items }: { items: Website[] }) => { lastReport: ( <> {' '} - {website.lastAudit.status.toLocaleUpperCase('en-US')} + + {website.lastAudit.status.toLocaleUpperCase('en-US')} + ), lastAuditTriggered: formatTime(website.lastAudit.timeCreated), diff --git a/plugins/lighthouse/src/components/AuditView/index.test.tsx b/plugins/lighthouse/src/components/AuditView/index.test.tsx index c68daddc67..d555133f3e 100644 --- a/plugins/lighthouse/src/components/AuditView/index.test.tsx +++ b/plugins/lighthouse/src/components/AuditView/index.test.tsx @@ -16,6 +16,8 @@ /* eslint-disable jest/no-disabled-tests */ +import { configApiRef } from '@backstage/core-plugin-api'; + jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); const mockNavigation = jest.fn(); @@ -28,6 +30,7 @@ jest.mock('react-router-dom', () => { import { setupRequestMockHandlers, + TestApiProvider, TestApiRegistry, wrapInTestApp, } from '@backstage/test-utils'; @@ -39,13 +42,18 @@ import { Audit, lighthouseApiRef, LighthouseRestApi, Website } from '../../api'; import { formatTime } from '../../utils'; import * as data from '../../__fixtures__/website-response.json'; import AuditView from './index'; -import { ApiProvider } from '@backstage/core-app-api'; +import { ApiProvider, ConfigReader } from '@backstage/core-app-api'; +import { rootRouteRef } from '../../plugin'; const { useParams }: { useParams: jest.Mock } = jest.requireMock('react-router-dom'); const websiteResponse = data as Website; describe('AuditView', () => { + const lighthouseRestApiMock = new LighthouseRestApi('https://lighthouse'); + const testAppOptions = { + mountedRoutes: { '/': rootRouteRef }, + }; let apis: TestApiRegistry; let id: string; @@ -59,10 +67,7 @@ describe('AuditView', () => { ), ); - apis = TestApiRegistry.from([ - lighthouseApiRef, - new LighthouseRestApi('https://lighthouse'), - ]); + apis = TestApiRegistry.from([lighthouseApiRef, lighthouseRestApiMock]); id = websiteResponse.audits.find(a => a.status === 'COMPLETED') ?.id as string; useParams.mockReturnValue({ id }); @@ -74,6 +79,7 @@ describe('AuditView', () => { , + testAppOptions, ), ); @@ -91,6 +97,7 @@ describe('AuditView', () => { , + testAppOptions, ), ); @@ -109,6 +116,7 @@ describe('AuditView', () => { , + testAppOptions, ), ); @@ -137,6 +145,7 @@ describe('AuditView', () => { , + testAppOptions, ), ); @@ -149,6 +158,36 @@ describe('AuditView', () => { ).toHaveAttribute('href', `/audit/${a.id}`); }); }); + + it('navigates to the next report with respect to the base path', async () => { + const configApiMock = new ConfigReader({ + app: { baseUrl: `http://localhost:3000/example` }, + }); + const rendered = render( + wrapInTestApp( + + + , + { + mountedRoutes: { [`/example/lighthouse`]: rootRouteRef }, + }, + ), + ); + + await rendered.findByTestId('audit-sidebar'); + + websiteResponse.audits.forEach(a => { + expect( + rendered.getByText(formatTime(a.timeCreated)).parentElement + ?.parentElement, + ).toHaveAttribute('href', `/example/lighthouse/audit/${a.id}`); + }); + }); }); describe('when the request for the website by id is pending', () => { @@ -159,6 +198,7 @@ describe('AuditView', () => { , + testAppOptions, ), ); expect(await rendered.findByTestId('progress')).toBeInTheDocument(); @@ -177,6 +217,7 @@ describe('AuditView', () => { , + testAppOptions, ), ); expect(await rendered.findByText(/failed to fetch/)).toBeInTheDocument(); @@ -194,6 +235,7 @@ describe('AuditView', () => { , + testAppOptions, ), ); @@ -214,6 +256,7 @@ describe('AuditView', () => { , + testAppOptions, ), ); diff --git a/plugins/lighthouse/src/components/AuditView/index.tsx b/plugins/lighthouse/src/components/AuditView/index.tsx index e377894c90..ade485b09a 100644 --- a/plugins/lighthouse/src/components/AuditView/index.tsx +++ b/plugins/lighthouse/src/components/AuditView/index.tsx @@ -47,7 +47,8 @@ import { Page, Progress, } from '@backstage/core-components'; -import { useApi } from '@backstage/core-plugin-api'; +import { useApi, useRouteRef } from '@backstage/core-plugin-api'; +import { rootRouteRef } from '../../plugin'; // TODO(freben): move all of this out of index @@ -67,29 +68,35 @@ interface AuditLinkListProps { audits?: Audit[]; selectedId: string; } -const AuditLinkList = ({ audits = [], selectedId }: AuditLinkListProps) => ( - - {audits.map(audit => ( - - - - - - - ))} - -); +const AuditLinkList = ({ audits = [], selectedId }: AuditLinkListProps) => { + const fromPath = useRouteRef(rootRouteRef)?.() ?? '../'; + return ( + + {audits.map(audit => ( + + + + + + + ))} + + ); +}; const AuditView = ({ audit }: { audit?: Audit }) => { const classes = useStyles(); @@ -119,6 +126,7 @@ const AuditView = ({ audit }: { audit?: Audit }) => { export const AuditViewContent = () => { const lighthouseApi = useApi(lighthouseApiRef); + const fromPath = useRouteRef(rootRouteRef)?.() ?? '../'; const params = useParams() as { id: string }; const classes = useStyles(); const navigate = useNavigate(); @@ -178,7 +186,7 @@ export const AuditViewContent = () => { diff --git a/plugins/lighthouse/src/components/Cards/LastLighthouseAuditCard.test.tsx b/plugins/lighthouse/src/components/Cards/LastLighthouseAuditCard.test.tsx index ab1e2683b6..c59458f3f3 100644 --- a/plugins/lighthouse/src/components/Cards/LastLighthouseAuditCard.test.tsx +++ b/plugins/lighthouse/src/components/Cards/LastLighthouseAuditCard.test.tsx @@ -16,11 +16,8 @@ import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-react'; -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; -import { render } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/test-utils'; import React from 'react'; -import { MemoryRouter } from 'react-router-dom'; import { AuditCompleted, LighthouseCategoryId, @@ -64,22 +61,15 @@ describe('', () => { }, }; - const subject = () => - render( - - - - - - - , - ); - describe('where the last audit completed successfully', () => { const audit = entityWebsite.lastAudit as AuditCompleted; it('renders the performance data for the audit', async () => { - const { findByText } = subject(); + const { findByText } = await renderInTestApp( + + + , + ); expect(await findByText(audit.url)).toBeInTheDocument(); expect(await findByText(audit.status)).toBeInTheDocument(); for (const category of Object.keys(audit.categories)) { @@ -101,7 +91,11 @@ describe('', () => { }); it('renders the performance data for the audit', async () => { - const { findByText } = subject(); + const { findByText } = await renderInTestApp( + + + , + ); expect(await findByText('N/A')).toBeInTheDocument(); }); }); @@ -119,7 +113,11 @@ describe('', () => { }); it('renders the url and status of the audit', async () => { - const { findByText } = subject(); + const { findByText } = await renderInTestApp( + + + , + ); expect(await findByText(audit.url)).toBeInTheDocument(); expect(await findByText(audit.status)).toBeInTheDocument(); }); @@ -135,7 +133,11 @@ describe('', () => { }); it('renders a Progress element', async () => { - const { findByTestId } = subject(); + const { findByTestId } = await renderInTestApp( + + + , + ); expect(await findByTestId('progress')).toBeInTheDocument(); }); }); @@ -150,7 +152,11 @@ describe('', () => { }); it('renders nothing', async () => { - const { queryByTestId } = subject(); + const { queryByTestId } = await renderInTestApp( + + + , + ); expect(queryByTestId('AuditListTable')).toBeNull(); }); }); @@ -165,7 +171,11 @@ describe('', () => { }); it('renders nothing', async () => { - const { queryByTestId } = subject(); + const { queryByTestId } = await renderInTestApp( + + + , + ); expect(queryByTestId('AuditListTable')).toBeNull(); }); }); diff --git a/plugins/lighthouse/src/components/Cards/LastLighthouseAuditCard.tsx b/plugins/lighthouse/src/components/Cards/LastLighthouseAuditCard.tsx index 4daeb5177c..1562031007 100644 --- a/plugins/lighthouse/src/components/Cards/LastLighthouseAuditCard.tsx +++ b/plugins/lighthouse/src/components/Cards/LastLighthouseAuditCard.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ import React from 'react'; +import Typography from '@material-ui/core/Typography'; import { Audit, AuditCompleted, LighthouseCategoryId } from '../../api'; import { useWebsiteForEntity } from '../../hooks/useWebsiteForEntity'; import AuditStatusIcon from '../AuditStatusIcon'; @@ -52,7 +53,7 @@ const LighthouseCategoryScoreStatus = (props: { score: number }) => { ); default: - return N/A; + return N/A; } }; diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 9054bd205d..d01c1cd3c2 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.2.5 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index d68150c6ba..a6ece89000 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.5", + "version": "0.2.7", "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 5ae4313421..8332f157af 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-newrelic +## 0.3.32 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.3.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.3.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + +## 0.3.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.3.31 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.3.30 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index b42a25db95..022eda45bd 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.30", + "version": "0.3.32", "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 38f992369a..96b86c6eba 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-org-react +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.1 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 61a5e8dc58..f64443b506 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.1", + "version": "0.1.3", "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 12cef56ddb..e48a27b900 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-org +## 0.6.4 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.6.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.6.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.6.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.6.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.6.2 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index a22f17a6b4..fa36038045 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.2", + "version": "0.6.4", "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 855b1b0b10..677093d270 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-pagerduty +## 0.5.7 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.5.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.5.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.5.6 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.5.5 ### Patch Changes diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 902df09231..fceead836b 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-pagerduty", "description": "A Backstage plugin that integrates towards PagerDuty", - "version": "0.5.5", + "version": "0.5.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index bd58a06593..527139a776 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-periskop-backend +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/config@1.0.6-next.0 + +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + ## 0.1.10 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index 102569ad79..670345ff27 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.1.10", + "version": "0.1.11", "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 854b124d89..640e5e1631 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-periskop +## 0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.10 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 10daf69de6..61b85a4a74 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.10", + "version": "0.1.12", "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 f33b09f657..35a0a54fb6 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-permission-backend +## 0.5.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.3 + +## 0.5.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/plugin-permission-node@0.7.3-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-permission-node@0.7.3-next.0 + ## 0.5.14 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index f9ed36a35d..98255fcdfc 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.14", + "version": "0.5.15", "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 5c11ef95af..57021a6a09 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-permission-common +## 0.7.3 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## 0.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.7.2 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 5b5ca74560..472a86aaab 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-common", "description": "Isomorphic types and client for Backstage permissions and authorization", - "version": "0.7.2", + "version": "0.7.3", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 4c38e7a895..a66ab38e98 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-permission-node +## 0.7.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-permission-common@0.7.3 + +## 0.7.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + ## 0.7.2 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index b23670017e..c5cf2f9ce4 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.2", + "version": "0.7.3", "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 708b30abdc..4093b6a430 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-permission-react +## 0.4.9 + +### Patch Changes + +- 1a53a735b7: Updated dependency `swr` to `^2.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/plugin-permission-common@0.7.3 + +## 0.4.9-next.1 + +### Patch Changes + +- 1a53a735b7: Updated dependency `swr` to `^2.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + ## 0.4.8 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index c69d2899ee..beef8e093d 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.8", + "version": "0.4.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,7 +36,7 @@ "@backstage/plugin-permission-common": "workspace:^", "cross-fetch": "^3.1.5", "react-use": "^17.2.4", - "swr": "^1.1.2" + "swr": "^2.0.0" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0", diff --git a/plugins/permission-react/src/hooks/usePermission.test.tsx b/plugins/permission-react/src/hooks/usePermission.test.tsx index cbf3b22ae7..1987382f47 100644 --- a/plugins/permission-react/src/hooks/usePermission.test.tsx +++ b/plugins/permission-react/src/hooks/usePermission.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { FC } from 'react'; +import React from 'react'; import { render } from '@testing-library/react'; import { usePermission } from './usePermission'; import { @@ -30,7 +30,7 @@ const permission = createPermission({ attributes: { action: 'read' }, }); -const TestComponent: FC = () => { +const TestComponent = () => { const { loading, allowed, error } = usePermission({ permission }); return (
@@ -47,7 +47,6 @@ function renderComponent(mockApi: PermissionApi) { - , , ); } diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index 26dc5378d3..99c1dc0ea4 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,69 @@ # @backstage/plugin-playlist-backend +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/backend-test-utils@0.1.32 + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.3 + - @backstage/plugin-playlist-common@0.1.4 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.32-next.2 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/plugin-permission-node@0.7.3-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-playlist-common@0.1.4-next.0 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.32-next.1 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-permission-node@0.7.3-next.0 + - @backstage/plugin-playlist-common@0.1.4-next.0 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/backend-test-utils@0.1.32-next.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-permission-node@0.7.2 + - @backstage/plugin-playlist-common@0.1.3 + ## 0.2.2 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 19785706ed..28d5907925 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.2.2", + "version": "0.2.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-common/CHANGELOG.md b/plugins/playlist-common/CHANGELOG.md index 3db070e10d..963f5dca73 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-playlist-common +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.3 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.3-next.0 + ## 0.1.3 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 9a3820e306..f5e58ae51e 100644 --- a/plugins/playlist-common/package.json +++ b/plugins/playlist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-playlist-common", "description": "Common functionalities for the playlist plugin", - "version": "0.1.3", + "version": "0.1.4", "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 0f0625b7b0..b44a4b9b55 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,84 @@ # @backstage/plugin-playlist +## 0.1.5 + +### Patch Changes + +- 1a53a735b7: Updated dependency `swr` to `^2.0.0`. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-search-react@1.4.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.10 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-playlist-common@0.1.4 + +## 0.1.5-next.2 + +### Patch Changes + +- 1a53a735b7: Updated dependency `swr` to `^2.0.0`. +- Updated dependencies + - @backstage/plugin-search-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/plugin-permission-react@0.4.9-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-playlist-common@0.1.4-next.0 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-permission-react@0.4.9-next.0 + - @backstage/plugin-playlist-common@0.1.4-next.0 + - @backstage/plugin-search-react@1.3.2-next.1 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.10-next.0 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-permission-react@0.4.8 + - @backstage/plugin-playlist-common@0.1.3 + - @backstage/plugin-search-react@1.3.2-next.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + - @backstage/plugin-search-react@1.3.1 + ## 0.1.3 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index db5b1d822b..4343de503a 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.3", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -62,7 +62,7 @@ "@types/node": "*", "cross-fetch": "^3.1.5", "msw": "^0.49.0", - "swr": "^1.1.2" + "swr": "^2.0.0" }, "files": [ "dist" diff --git a/plugins/playlist/src/components/PlaylistCard/PlaylistCard.test.tsx b/plugins/playlist/src/components/PlaylistCard/PlaylistCard.test.tsx index 177cc23b81..5a34aa93e2 100644 --- a/plugins/playlist/src/components/PlaylistCard/PlaylistCard.test.tsx +++ b/plugins/playlist/src/components/PlaylistCard/PlaylistCard.test.tsx @@ -16,8 +16,6 @@ import { entityRouteRef } from '@backstage/plugin-catalog-react'; import { renderInTestApp } from '@backstage/test-utils'; -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; import React from 'react'; import { rootRouteRef } from '../../routes'; @@ -26,20 +24,18 @@ import { PlaylistCard } from './PlaylistCard'; describe('', () => { it('renders playlist info', async () => { const rendered = await renderInTestApp( - - - , + , { mountedRoutes: { '/playlists': rootRouteRef, diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 4a7a1c3554..491c9e4f99 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-proxy-backend +## 0.2.34 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + +## 0.2.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/config@1.0.6-next.0 + +## 0.2.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + ## 0.2.33 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index b4342ad43c..52e021b7c9 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.33", + "version": "0.2.34", "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 06c6af4fe4..cc7cf0000b 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-rollbar-backend +## 0.1.37 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + +## 0.1.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/config@1.0.6-next.0 + +## 0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + ## 0.1.36 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 552a534058..c570652d98 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.36", + "version": "0.1.37", "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 99be990c2f..0d4466b704 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-rollbar +## 0.4.14 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.4.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.4.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.4.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.4.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.4.12 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index 6ad58bcff4..e2b49d62f2 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar", "description": "A Backstage plugin that integrates towards Rollbar", - "version": "0.4.12", + "version": "0.4.14", "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 2c5e107f06..44db8fc3ad 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,113 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.15 + +### Patch Changes + +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0 + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-scaffolder-backend@1.10.0-next.2 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/types@1.0.2 + +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0-next.1 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/types@1.0.2 + +## 0.2.15-next.0 + +### Patch Changes + +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.9.1-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/types@1.0.2 + ## 0.2.14 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/README.md b/plugins/scaffolder-backend-module-cookiecutter/README.md index 8516139e64..ae34e09c96 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/README.md +++ b/plugins/scaffolder-backend-module-cookiecutter/README.md @@ -73,16 +73,16 @@ spec: description: Owner of the component ui:field: OwnerPicker ui:options: - allowedKinds: - - Group + catalogFilter: + kind: Group system: title: System type: string description: System of the component ui:field: EntityPicker ui:options: - allowedKinds: - - System + catalogFilter: + kind: System defaultKind: System - title: Choose a location diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index a1aa35dfb7..6a1ee7fd3b 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.14", + "version": "0.2.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts index bfa4aa0507..15e5d25183 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts @@ -75,7 +75,6 @@ describe('fetch:cookiecutter', () => { const mockReader: UrlReader = { readUrl: jest.fn(), - read: jest.fn(), readTree: jest.fn(), search: jest.fn(), }; diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index b856284bfd..491e3b04a4 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,116 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.8 + +### Patch Changes + +- 268b8634f9: handle skipActiveRecord rails new argument +- 2fadff2a25: Change scaffolder task actions to include markdown to demonstrate the new `ActionsPage` markdown feature. +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0 + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## 0.4.8-next.2 + +### Patch Changes + +- 2fadff2a25: Change scaffolder task actions to include markdown to demonstrate the new `ActionsPage` markdown feature. +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-scaffolder-backend@1.10.0-next.2 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/types@1.0.2 + +## 0.4.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0-next.1 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/types@1.0.2 + +## 0.4.8-next.0 + +### Patch Changes + +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.9.1-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/types@1.0.2 + ## 0.4.7 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/README.md b/plugins/scaffolder-backend-module-rails/README.md index 738cd43cff..f4ec086775 100644 --- a/plugins/scaffolder-backend-module-rails/README.md +++ b/plugins/scaffolder-backend-module-rails/README.md @@ -74,16 +74,16 @@ spec: description: Owner of the component ui:field: OwnerPicker ui:options: - allowedKinds: - - Group + catalogFilter: + kind: Group system: title: System type: string description: System of the component ui:field: EntityPicker ui:options: - allowedKinds: - - System + catalogFilter: + kind: System defaultKind: System - title: Choose a location diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 967d1d94ec..408db6d559 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.7", + "version": "0.4.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts index 98ac3a403f..56f85d002e 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts @@ -74,7 +74,6 @@ describe('fetch:rails', () => { }; const mockReader: UrlReader = { - read: jest.fn(), readUrl: jest.fn(), readTree: jest.fn(), search: jest.fn(), diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts index 49b7ac100b..4a5bd7dfd1 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts @@ -54,7 +54,7 @@ export function createFetchRailsAction(options: { }>({ id: 'fetch:rails', description: - 'Downloads a template from the given URL into the workspace, and runs a rails new generator on it.', + 'Downloads a template from the given `url` into the workspace, and runs a rails new generator on it.', schema: { input: { type: 'object', @@ -128,6 +128,12 @@ export function createFetchRailsAction(options: { description: 'Skip Action Text gem', type: 'boolean', }, + skipActiveRecord: { + title: 'skipActiveRecord', + description: 'Skip Active Record files', + type: 'boolean', + }, + force: { title: 'force', description: 'Overwrite files that already exist', diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsArgumentResolver.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsArgumentResolver.test.ts index 401ebb295f..935c8f96bd 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsArgumentResolver.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsArgumentResolver.test.ts @@ -33,6 +33,7 @@ describe('railsArgumentResolver', () => { [{ skipActionMailbox: true }, ['--skip-action-mailbox']], [{ skipActiveStorage: true }, ['--skip-active-storage']], [{ skipActionText: true }, ['--skip-action-text']], + [{ skipActiveRecord: true }, ['--skip-active-record']], [{ force: true }, ['--force']], [{ webpacker: 'vue' }, ['--webpack', 'vue']], [{ database: 'postgresql' }, ['--database', 'postgresql']], diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsArgumentResolver.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsArgumentResolver.ts index 666eac7958..bcfc8cc487 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsArgumentResolver.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsArgumentResolver.ts @@ -57,6 +57,7 @@ export type RailsRunOptions = { skipBundle?: boolean; skipTest?: boolean; skipWebpackInstall?: boolean; + skipActiveRecord?: boolean; template?: string; webpacker?: Webpacker; }; @@ -84,6 +85,10 @@ export const railsArgumentResolver = ( argumentsToRun.push('--skip-webpack-install'); } + if (options?.skipActiveRecord) { + argumentsToRun.push('--skip-active-record'); + } + if (options?.skipTest) { argumentsToRun.push('--skip-test'); } diff --git a/plugins/scaffolder-backend-module-sentry/.eslintrc.js b/plugins/scaffolder-backend-module-sentry/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/scaffolder-backend-module-sentry/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md new file mode 100644 index 0000000000..ba1ca5cf7a --- /dev/null +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -0,0 +1,15 @@ +# @backstage/plugin-scaffolder-backend-module-sentry + +## 0.1.0 + +### Minor Changes + +- 66ff367af6: Add Sentry "Create Project" Scaffolder as new package + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 diff --git a/plugins/scaffolder-backend-module-sentry/README.md b/plugins/scaffolder-backend-module-sentry/README.md new file mode 100644 index 0000000000..14751185c4 --- /dev/null +++ b/plugins/scaffolder-backend-module-sentry/README.md @@ -0,0 +1,160 @@ +# scaffolder-backend-module-sentry + +Welcome to the Sentry Module for Scaffolder. + +Here you can find all Sentry related features to improve your scaffolder: + +## Getting started + +You need to configure the action in your backend: + +## From your Backstage root directory + +```bash +# From your Backstage root directory +yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-sentry +``` + +Configure the action (you can check +the [docs](https://backstage.io/docs/features/software-templates/writing-custom-actions#registering-custom-actions) to +see all options): + +```typescript +const actions = [ + createSentryCreateProjectAction({ + integrations, + reader: env.reader, + containerRunner, + }), +]; + +return await createRouter({ + containerRunner, + catalogClient, + actions, + logger: env.logger, + config: env.config, + database: env.database, + reader: env.reader, +}); +``` + +You need to define your Sentry API Token in your `app-config.yaml`: + +```yaml +scaffolder: + sentry: + token: ${SENTRY_TOKEN} +``` + +After that you can use the action in your template: + +```yaml +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: sentry-demo + title: Sentry template + description: scaffolder sentry app +spec: + owner: backstage/techdocs-core + type: service + + parameters: + - title: Fill in some steps + required: + - name + - owner + properties: + name: + title: Name + type: string + description: Unique name of the component + ui:autofocus: true + ui:options: + rows: 5 + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + kind: Group + system: + title: System + type: string + description: System of the component + ui:field: EntityPicker + ui:options: + catalogFilter: + kind: System + defaultKind: System + + - title: Choose a location + required: + - repoUrl + - dryRun + properties: + repoUrl: + title: Repository Location + type: string + ui:field: RepoUrlPicker + ui:options: + allowedHosts: + - github.com + dryRun: + title: Only perform a dry run, don't publish anything + type: boolean + default: false + + steps: + - id: fetch + name: Fetch + action: fetch:template + input: + url: https://github.com/TEMPLATE + values: + name: ${{ parameters.name }} + + - id: create-sentry-project + if: ${{ parameters.dryRun !== true }} + name: Create Sentry Project + action: sentry:create-project + input: + organizationSlug: ORG-SLUG + teamSlug: TEAM-SLUG + name: ${{ parameters.name }} + + - id: publish + if: ${{ parameters.dryRun !== true }} + name: Publish + action: publish:github + input: + allowedHosts: + - github.com + description: This is ${{ parameters.name }} + repoUrl: ${{ parameters.repoUrl }} + + - id: register + if: ${{ parameters.dryRun !== true }} + name: Register + action: catalog:register + input: + repoContentsUrl: ${{ steps['publish'].output.repoContentsUrl }} + catalogInfoPath: '/catalog-info.yaml' + + - name: Results + if: ${{ parameters.dryRun }} + action: debug:log + input: + listWorkspace: true + + output: + links: + - title: Repository + url: ${{ steps['publish'].output.remoteUrl }} + - title: Open in catalog + icon: catalog + entityRef: ${{ steps['register'].output.entityRef }} +``` diff --git a/plugins/scaffolder-backend-module-sentry/api-report.md b/plugins/scaffolder-backend-module-sentry/api-report.md new file mode 100644 index 0000000000..8b0c229e03 --- /dev/null +++ b/plugins/scaffolder-backend-module-sentry/api-report.md @@ -0,0 +1,21 @@ +## API Report File for "@backstage/plugin-scaffolder-backend-module-sentry" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { Config } from '@backstage/config'; +import { TemplateAction } from '@backstage/plugin-scaffolder-backend'; + +// @public +export function createSentryCreateProjectAction(options: { + config: Config; +}): TemplateAction<{ + organizationSlug: string; + teamSlug: string; + name: string; + slug?: string | undefined; + authToken?: string | undefined; +}>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json new file mode 100644 index 0000000000..8eaf5c398d --- /dev/null +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -0,0 +1,48 @@ +{ + "name": "@backstage/plugin-scaffolder-backend-module-sentry", + "version": "0.1.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": "frontend-plugin" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/integration": "workspace:^", + "@backstage/plugin-scaffolder-backend": "workspace:^" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/core-app-api": "workspace:^", + "@backstage/dev-utils": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3", + "@testing-library/user-event": "^14.0.0", + "@types/node": "*", + "cross-fetch": "^3.1.5", + "msw": "^0.49.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/scaffolder-backend-module-sentry/src/actions/createProject.ts b/plugins/scaffolder-backend-module-sentry/src/actions/createProject.ts new file mode 100644 index 0000000000..bfcc8f016b --- /dev/null +++ b/plugins/scaffolder-backend-module-sentry/src/actions/createProject.ts @@ -0,0 +1,122 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createTemplateAction } from '@backstage/plugin-scaffolder-backend'; +import { InputError } from '@backstage/errors'; +import { Config } from '@backstage/config'; + +/** + * Creates the `sentry:craete-project` Scaffolder action. + * + * @remarks + * + * See {@link https://backstage.io/docs/features/software-templates/writing-custom-actions}. + * + * @param options - Configuration of the Sentry API. + * @public + */ +export function createSentryCreateProjectAction(options: { config: Config }) { + const { config } = options; + + return createTemplateAction<{ + organizationSlug: string; + teamSlug: string; + name: string; + slug?: string; + authToken?: string; + }>({ + id: 'sentry:project:create', + schema: { + input: { + required: ['organizationSlug', 'teamSlug', 'name'], + type: 'object', + properties: { + organizationSlug: { + title: 'The slug of the organization the team belongs to', + type: 'string', + }, + teamSlug: { + title: 'The slug of the team to create a new project for', + type: 'string', + }, + name: { + title: 'The name for the new project', + type: 'string', + }, + slug: { + title: + 'Optional slug for the new project. If not provided a slug is generated from the name', + type: 'string', + }, + authToken: { + title: + 'authenticate via bearer auth token. Requires scope: project:write', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + const { organizationSlug, teamSlug, name, slug, authToken } = ctx.input; + + const body: any = { + name: name, + }; + + if (slug) { + body.slug = slug; + } + + const token = authToken + ? authToken + : config.getOptionalString('scaffolder.sentry.token'); + + if (!token) { + throw new InputError(`No valid sentry token given`); + } + + const response = await fetch( + `https://sentry.io/api/0/teams/${organizationSlug}/${teamSlug}/projects/`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }, + ); + + const contentType = response.headers.get('content-type'); + + if (contentType !== 'application/json') { + throw new InputError( + `Unexpected Sentry Response Type: ${await response.text()}`, + ); + } + + const code = response.status; + const result = await response.json(); + + if (code !== 201) { + throw new InputError(`Sentry Response was: ${await result.detail}`); + } + + ctx.output('id', result.id); + ctx.output('result', result); + }, + }); +} diff --git a/plugins/scaffolder-backend-module-sentry/src/index.ts b/plugins/scaffolder-backend-module-sentry/src/index.ts new file mode 100644 index 0000000000..f6c0820874 --- /dev/null +++ b/plugins/scaffolder-backend-module-sentry/src/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { createSentryCreateProjectAction } from './actions/createProject'; diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index b5837e89b0..64437c70a1 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,101 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.13 + +### Patch Changes + +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + +## 0.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0-next.2 + - @backstage/config@1.0.6-next.0 + - @backstage/types@1.0.2 + +## 0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/types@1.0.2 + +## 0.2.13-next.0 + +### Patch Changes + +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.9.1-next.0 + - @backstage/config@1.0.5 + - @backstage/types@1.0.2 + ## 0.2.12 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/README.md b/plugins/scaffolder-backend-module-yeoman/README.md index 5242ef298c..b5c7b4d026 100644 --- a/plugins/scaffolder-backend-module-yeoman/README.md +++ b/plugins/scaffolder-backend-module-yeoman/README.md @@ -73,16 +73,16 @@ spec: description: Owner of the component ui:field: OwnerPicker ui:options: - allowedKinds: - - Group + catalogFilter: + kind: Group system: title: System type: string description: System of the component ui:field: EntityPicker ui:options: - allowedKinds: - - System + catalogFilter: + kind: System defaultKind: System - title: Choose a location diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 2de3d42a31..2d4d7e8702 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.12", + "version": "0.2.13", "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 174a8e7570..6da85db1be 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,291 @@ # @backstage/plugin-scaffolder-backend +## 1.10.0 + +### Minor Changes + +- a6808b67a7: Implement `Required approving review count`, `Restrictions`, and `Required commit signing` support for `publish:github` action +- 04a2048fb8: Allow custom repository roles to be configured on github repos +- c0ad7341f7: Add Scaffolder action `catalog:fetch` to get entity by entity reference from catalog +- b44eb68bcb: This change adds changes to provide examples alongside scaffolder task actions. + + The `createTemplateAction` function now takes a list of examples e.g. + + ```typescript + const actionExamples = [ + { + description: 'Example 1', + example: yaml.stringify({ + steps: [ + { + action: 'test:action', + id: 'test', + input: { + input1: 'value', + }, + }, + ], + }), + }, + ]; + + export function createTestAction() { + return createTemplateAction({ + id: 'test:action', + examples: [ + { + description: 'Example 1', + examples: actionExamples + } + ], + ..., + }); + ``` + + These examples can be retrieved later from the api. + + ```bash + curl http://localhost:7007/api/scaffolder/v2/actions + ``` + + ```json + [ + { + "id": "test:action", + "examples": [ + { + "description": "Example 1", + "example": "steps:\n - action: test:action\n id: test\n input:\n input1: value\n" + } + ], + "schema": { + "input": { + "type": "object", + "properties": { + "input1": { + "title": "Input 1", + "type": "string" + } + } + } + } + } + ] + ``` + +- 72d6b9f4e2: Added ability to override the commit message and author details for the `publish:bitbucketServer` action. +- a69664faee: Add Github repository support for squash merge commit title and message options + +### Patch Changes + +- 2fadff2a25: Change scaffolder task actions to include markdown to demonstrate the new `ActionsPage` markdown feature. +- ecbec4ec4c: Internal refactor to match new options pattern in the experimental backend system. +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-scaffolder-common@1.2.4 + - @backstage/catalog-client@1.3.0 + - @backstage/backend-tasks@0.4.1 + - @backstage/plugin-catalog-node@1.3.1 + - @backstage/plugin-catalog-backend@1.7.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9 + +## 1.10.0-next.2 + +### Patch Changes + +- 2fadff2a25: Change scaffolder task actions to include markdown to demonstrate the new `ActionsPage` markdown feature. +- b44eb68bcb: This patch adds changes to provide examples alongside scaffolder task actions. + + The `createTemplateAction` function now takes a list of examples e.g. + + ```typescript + const actionExamples = [ + { + description: 'Example 1', + example: yaml.stringify({ + steps: [ + { + action: 'test:action', + id: 'test', + input: { + input1: 'value', + }, + }, + ], + }), + }, + ]; + + export function createTestAction() { + return createTemplateAction({ + id: 'test:action', + examples: [ + { + description: 'Example 1', + examples: actionExamples + } + ], + ..., + }); + ``` + + These examples can be retrieved later from the api. + + ```bash + curl http://localhost:7007/api/scaffolder/v2/actions + ``` + + ```json + [ + { + "id": "test:action", + "examples": [ + { + "description": "Example 1", + "example": "steps:\n - action: test:action\n id: test\n input:\n input1: value\n" + } + ], + "schema": { + "input": { + "type": "object", + "properties": { + "input1": { + "title": "Input 1", + "type": "string" + } + } + } + } + } + ] + ``` + +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-catalog-backend@1.7.0-next.2 + - @backstage/plugin-catalog-node@1.3.1-next.2 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.4-next.1 + +## 1.10.0-next.1 + +### Minor Changes + +- 04a2048fb8: Allow custom repository roles to be configured on github repos +- a69664faee: Add Github repository support for squash merge commit title and message options + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-catalog-backend@1.7.0-next.1 + - @backstage/plugin-catalog-node@1.3.1-next.1 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-scaffolder-common@1.2.4-next.1 + +## 1.9.1-next.0 + +### Patch Changes + +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-scaffolder-common@1.2.4-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/plugin-catalog-backend@1.7.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/backend-plugin-api@0.2.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/plugin-catalog-node@1.3.1-next.0 + ## 1.9.0 ### Minor Changes diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 69ef893dc3..7f8ab0ad79 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -96,6 +96,14 @@ export function createDebugLogAction(): TemplateAction<{ listWorkspace?: boolean | undefined; }>; +// @public +export function createFetchCatalogEntityAction(options: { + catalogClient: CatalogApi; +}): TemplateAction<{ + entityRef: string; + optional?: boolean | undefined; +}>; + // @public export function createFetchPlainAction(options: { reader: UrlReader; @@ -119,6 +127,7 @@ export function createFetchTemplateAction(options: { copyWithoutRender?: string[] | undefined; copyWithoutTemplating?: string[] | undefined; cookiecutterCompat?: boolean | undefined; + replace?: boolean | undefined; }>; // @public @@ -195,6 +204,12 @@ export function createGithubRepoCreateAction(options: { gitAuthorEmail?: string | undefined; allowRebaseMerge?: boolean | undefined; allowSquashMerge?: boolean | undefined; + squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined; + squashMergeCommitMessage?: + | 'PR_BODY' + | 'COMMIT_MESSAGES' + | 'BLANK' + | undefined; allowMergeCommit?: boolean | undefined; allowAutoMerge?: boolean | undefined; requireCodeOwnerReviews?: boolean | undefined; @@ -205,6 +220,14 @@ export function createGithubRepoCreateAction(options: { apps?: string[] | undefined; } | undefined; + requiredApprovingReviewCount?: number | undefined; + restrictions?: + | { + users: string[]; + teams: string[]; + apps?: string[] | undefined; + } + | undefined; requiredStatusCheckContexts?: string[] | undefined; requireBranchesToBeUpToDate?: boolean | undefined; requiredConversationResolution?: boolean | undefined; @@ -213,11 +236,11 @@ export function createGithubRepoCreateAction(options: { | ( | { user: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { team: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { username: string; @@ -230,6 +253,7 @@ export function createGithubRepoCreateAction(options: { hasIssues?: boolean | undefined; token?: string | undefined; topics?: string[] | undefined; + requireCommitSigning?: boolean | undefined; }>; // @public @@ -255,11 +279,20 @@ export function createGithubRepoPushAction(options: { apps?: string[]; } | undefined; + requiredApprovingReviewCount?: number | undefined; + restrictions?: + | { + users: string[]; + teams: string[]; + apps?: string[]; + } + | undefined; requiredStatusCheckContexts?: string[] | undefined; requireBranchesToBeUpToDate?: boolean | undefined; requiredConversationResolution?: boolean | undefined; sourcePath?: string | undefined; token?: string | undefined; + requiredCommitSigning?: boolean | undefined; }>; // @public @@ -335,6 +368,9 @@ export function createPublishBitbucketServerAction(options: { sourcePath?: string | undefined; enableLFS?: boolean | undefined; token?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; }>; // @public @@ -383,6 +419,12 @@ export function createPublishGithubAction(options: { gitAuthorEmail?: string | undefined; allowRebaseMerge?: boolean | undefined; allowSquashMerge?: boolean | undefined; + squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined; + squashMergeCommitMessage?: + | 'PR_BODY' + | 'COMMIT_MESSAGES' + | 'BLANK' + | undefined; allowMergeCommit?: boolean | undefined; allowAutoMerge?: boolean | undefined; sourcePath?: string | undefined; @@ -393,6 +435,14 @@ export function createPublishGithubAction(options: { apps?: string[]; } | undefined; + requiredApprovingReviewCount?: number | undefined; + restrictions?: + | { + users: string[]; + teams: string[]; + apps?: string[]; + } + | undefined; requireCodeOwnerReviews?: boolean | undefined; dismissStaleReviews?: boolean | undefined; requiredStatusCheckContexts?: string[] | undefined; @@ -403,11 +453,11 @@ export function createPublishGithubAction(options: { | ( | { user: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { team: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { username: string; @@ -420,6 +470,7 @@ export function createPublishGithubAction(options: { hasIssues?: boolean | undefined; token?: string | undefined; topics?: string[] | undefined; + requiredCommitSigning?: boolean | undefined; }>; // @public @@ -613,7 +664,7 @@ export type RunCommandOptions = { }; // @alpha -export const scaffolderCatalogModule: (options?: undefined) => BackendFeature; +export const scaffolderCatalogModule: () => BackendFeature; // @public (undocumented) export class ScaffolderEntitiesProcessor implements CatalogProcessor { @@ -843,6 +894,10 @@ export class TaskWorker { export type TemplateAction = { id: string; description?: string; + examples?: { + description: string; + example: string; + }[]; supportsDryRun?: boolean; schema?: { input?: Schema; diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index ef77b8c0f3..8a98ea4a3d 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.9.0", + "version": "1.10.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/sample-templates/bitbucket-demo/template.yaml b/plugins/scaffolder-backend/sample-templates/bitbucket-demo/template.yaml index 58955582d2..0a7c841d8f 100644 --- a/plugins/scaffolder-backend/sample-templates/bitbucket-demo/template.yaml +++ b/plugins/scaffolder-backend/sample-templates/bitbucket-demo/template.yaml @@ -49,8 +49,8 @@ spec: description: Owner of the component ui:field: OwnerPicker ui:options: - allowedKinds: - - Group + catalogFilter: + kind: Group steps: - id: fetch-base diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index 8a9da38bf2..71472abda6 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -16,9 +16,9 @@ import { createBackendPlugin, coreServices, - loggerToWinstonLogger, createExtensionPoint, } from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { catalogServiceRef } from '@backstage/plugin-catalog-node'; import { TemplateFilter, TemplateGlobal } from './lib'; @@ -70,72 +70,74 @@ export const scaffolderActionsExtensionPoint = * Catalog plugin * @alpha */ -export const scaffolderPlugin = createBackendPlugin({ - id: 'scaffolder', - register(env, options: ScaffolderPluginOptions) { - const actionsExtensions = new ScaffolderActionsExtensionPointImpl(); - env.registerExtensionPoint( - scaffolderActionsExtensionPoint, - actionsExtensions, - ); +export const scaffolderPlugin = createBackendPlugin( + (options: ScaffolderPluginOptions) => ({ + id: 'scaffolder', + register(env) { + const actionsExtensions = new ScaffolderActionsExtensionPointImpl(); + env.registerExtensionPoint( + scaffolderActionsExtensionPoint, + actionsExtensions, + ); - env.registerInit({ - deps: { - logger: coreServices.logger, - config: coreServices.config, - reader: coreServices.urlReader, - permissions: coreServices.permissions, - database: coreServices.database, - httpRouter: coreServices.httpRouter, - catalogClient: catalogServiceRef, - }, - async init({ - logger, - config, - reader, - database, - httpRouter, - catalogClient, - }) { - const { - additionalTemplateFilters, - taskBroker, - taskWorkers, - additionalTemplateGlobals, - } = options; - const log = loggerToWinstonLogger(logger); + env.registerInit({ + deps: { + logger: coreServices.logger, + config: coreServices.config, + reader: coreServices.urlReader, + permissions: coreServices.permissions, + database: coreServices.database, + httpRouter: coreServices.httpRouter, + catalogClient: catalogServiceRef, + }, + async init({ + logger, + config, + reader, + database, + httpRouter, + catalogClient, + }) { + const { + additionalTemplateFilters, + taskBroker, + taskWorkers, + additionalTemplateGlobals, + } = options; + const log = loggerToWinstonLogger(logger); - const actions = options.actions || [ - ...actionsExtensions.actions, - ...createBuiltinActions({ - integrations: ScmIntegrations.fromConfig(config), + const actions = options.actions || [ + ...actionsExtensions.actions, + ...createBuiltinActions({ + integrations: ScmIntegrations.fromConfig(config), + catalogClient, + reader, + config, + additionalTemplateFilters, + additionalTemplateGlobals, + }), + ]; + + const actionIds = actions.map(action => action.id).join(', '); + log.info( + `Starting scaffolder with the following actions enabled ${actionIds}`, + ); + + const router = await createRouter({ + logger: log, + config, + database, catalogClient, reader, - config, + actions, + taskBroker, + taskWorkers, additionalTemplateFilters, additionalTemplateGlobals, - }), - ]; - - const actionIds = actions.map(action => action.id).join(', '); - log.info( - `Starting scaffolder with the following actions enabled ${actionIds}`, - ); - - const router = await createRouter({ - logger: log, - config, - database, - catalogClient, - reader, - actions, - taskBroker, - taskWorkers, - additionalTemplateFilters, - additionalTemplateGlobals, - }); - httpRouter.use(router); - }, - }); - }, -}); + }); + httpRouter.use(router); + }, + }); + }, + }), +); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts new file mode 100644 index 0000000000..f8bdf2bdcb --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts @@ -0,0 +1,112 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { PassThrough } from 'stream'; +import os from 'os'; +import { getVoidLogger } from '@backstage/backend-common'; +import { CatalogApi } from '@backstage/catalog-client'; +import { Entity } from '@backstage/catalog-model'; +import { createFetchCatalogEntityAction } from './fetch'; + +describe('catalog:fetch', () => { + const getEntityByRef = jest.fn(); + const catalogClient = { + getEntityByRef: getEntityByRef, + }; + + const action = createFetchCatalogEntityAction({ + catalogClient: catalogClient as unknown as CatalogApi, + }); + + const mockContext = { + workspacePath: os.tmpdir(), + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + secrets: { backstageToken: 'secret' }, + }; + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should return entity from catalog', async () => { + getEntityByRef.mockReturnValueOnce({ + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + } as Entity); + + await action.handler({ + ...mockContext, + input: { + entityRef: 'component:default/test', + }, + }); + + expect(getEntityByRef).toHaveBeenCalledWith('component:default/test', { + token: 'secret', + }); + expect(mockContext.output).toHaveBeenCalledWith('entity', { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + }); + }); + + it('should return null if entity not in catalog and optional is true', async () => { + getEntityByRef.mockImplementationOnce(() => { + throw new Error('Not found'); + }); + + await action.handler({ + ...mockContext, + input: { + entityRef: 'component:default/test', + optional: true, + }, + }); + + expect(getEntityByRef).toHaveBeenCalledWith('component:default/test', { + token: 'secret', + }); + expect(mockContext.output).toHaveBeenCalledWith('entity', null); + }); + + it('should throw error if entity not in catalog and optional is false', async () => { + getEntityByRef.mockImplementationOnce(() => { + throw new Error('Not found'); + }); + + await expect( + action.handler({ + ...mockContext, + input: { + entityRef: 'component:default/test', + }, + }), + ).rejects.toThrow('Not found'); + + expect(getEntityByRef).toHaveBeenCalledWith('component:default/test', { + token: 'secret', + }); + expect(mockContext.output).not.toHaveBeenCalled(); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts new file mode 100644 index 0000000000..c45eb62fce --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts @@ -0,0 +1,99 @@ +/* + * 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 { CatalogApi } from '@backstage/catalog-client'; +import { createTemplateAction } from '../../createTemplateAction'; +import yaml from 'yaml'; + +const id = 'catalog:fetch'; + +const examples = [ + { + description: 'Fetch entity by reference', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'fetch', + name: 'Fetch catalog entity', + input: { + entityRef: 'component:default/name', + }, + }, + ], + }), + }, +]; + +/** + * Returns entity from the catalog by entity reference. + * @public + */ +export function createFetchCatalogEntityAction(options: { + catalogClient: CatalogApi; +}) { + const { catalogClient } = options; + + return createTemplateAction<{ entityRef: string; optional?: boolean }>({ + id, + description: 'Returns entity from the catalog by entity reference', + examples, + schema: { + input: { + required: ['entityRef'], + type: 'object', + properties: { + entityRef: { + type: 'string', + title: 'Entity reference', + description: 'Entity reference of the entity to get', + }, + optional: { + title: 'Optional', + description: + 'Permit the entity to optionally exist. Default: false', + type: 'boolean', + }, + }, + }, + output: { + type: 'object', + properties: { + entity: { + title: 'Entity found by the entity reference', + type: 'object', + description: + 'Object containing same values used in the Entity schema.', + }, + }, + }, + }, + async handler(ctx) { + const { entityRef, optional } = ctx.input; + let entity; + try { + entity = await catalogClient.getEntityByRef(entityRef, { + token: ctx.secrets?.backstageToken, + }); + } catch (e) { + if (!optional) { + throw e; + } + } + ctx.output('entity', entity ?? null); + }, + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/index.ts index 1cd683dcf5..2aeb3f4a32 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/index.ts @@ -16,3 +16,4 @@ export { createCatalogRegisterAction } from './register'; export { createCatalogWriteAction } from './write'; +export { createFetchCatalogEntityAction } from './fetch'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts index 4b9f883706..48fec3db03 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts @@ -19,6 +19,28 @@ import { ScmIntegrations } from '@backstage/integration'; import { CatalogApi } from '@backstage/catalog-client'; import { stringifyEntityRef } from '@backstage/catalog-model'; import { createTemplateAction } from '../../createTemplateAction'; +import yaml from 'yaml'; + +const id = 'catalog:register'; + +const examples = [ + { + description: 'Register with the catalog', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'register-with-catalog', + name: 'Register with the catalog', + input: { + catalogInfoUrl: + 'http://github.com/backstage/backstage/blob/master/catalog-info.yaml', + }, + }, + ], + }), + }, +]; /** * Registers entities from a catalog descriptor file in the workspace into the software catalog. @@ -34,9 +56,10 @@ export function createCatalogRegisterAction(options: { | { catalogInfoUrl: string; optional?: boolean } | { repoContentsUrl: string; catalogInfoPath?: string; optional?: boolean } >({ - id: 'catalog:register', + id, description: 'Registers entities from a catalog descriptor file in the workspace into the software catalog.', + examples, schema: { input: { oneOf: [ diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts index da758898dc..5257839f2d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts @@ -20,14 +20,47 @@ import * as yaml from 'yaml'; import { Entity } from '@backstage/catalog-model'; import { resolveSafeChildPath } from '@backstage/backend-common'; +const id = 'catalog:write'; + +const examples = [ + { + description: 'Write a catalog yaml file', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'create-catalog-info-file', + name: 'Create catalog file', + input: { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'test', + annotations: {}, + }, + spec: { + type: 'service', + lifecycle: 'production', + owner: 'default/owner', + }, + }, + }, + }, + ], + }), + }, +]; + /** * Writes a catalog descriptor file containing the provided entity to a path in the workspace. * @public */ export function createCatalogWriteAction() { return createTemplateAction<{ filePath?: string; entity: Entity }>({ - id: 'catalog:write', + id, description: 'Writes the catalog-info.yaml for your template', + examples, schema: { input: { type: 'object', diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index e388a70f00..7e954295a1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -26,6 +26,7 @@ import { JsonObject } from '@backstage/types'; import { createCatalogRegisterAction, createCatalogWriteAction, + createFetchCatalogEntityAction, } from './catalog'; import { TemplateFilter, TemplateGlobal } from '../../../lib'; @@ -160,6 +161,7 @@ export const createBuiltinActions = ( }), createDebugLogAction(), createCatalogRegisterAction({ catalogClient, integrations }), + createFetchCatalogEntityAction({ catalogClient }), createCatalogWriteAction(), createFilesystemDeleteAction(), createFilesystemRenameAction(), diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.test.ts index c53caff018..6b7ad8816f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.test.ts @@ -20,6 +20,7 @@ import os from 'os'; import { Writable } from 'stream'; import { createDebugLogAction } from './log'; import { join } from 'path'; +import yaml from 'yaml'; describe('debug:log', () => { const logStream = { @@ -91,4 +92,43 @@ describe('debug:log', () => { expect.stringContaining('Hello Backstage!'), ); }); + + it('should log the workspace content from an example, if active', async () => { + const example = action.examples?.find( + sample => sample.description === 'List the workspace directory', + )?.example as string; + expect(typeof example).toEqual('string'); + const context = { + ...mockContext, + ...yaml.parse(example).steps[0], + }; + + await action.handler(context); + + expect(logStream.write).toHaveBeenCalledTimes(1); + expect(logStream.write).toHaveBeenCalledWith( + expect.stringContaining('README.md'), + ); + expect(logStream.write).toHaveBeenCalledWith( + expect.stringContaining(join('a-directory', 'index.md')), + ); + }); + + it('should log message from an example', async () => { + const example = action.examples?.find( + sample => sample.description === 'Write a debug message', + )?.example as string; + + const context = { + ...mockContext, + ...yaml.parse(example).steps[0], + }; + + await action.handler(context); + + expect(logStream.write).toHaveBeenCalledTimes(1); + expect(logStream.write).toHaveBeenCalledWith( + expect.stringContaining('Hello Backstage!'), + ); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts index 99d030b772..3863623563 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts @@ -17,6 +17,42 @@ import { readdir, stat } from 'fs-extra'; import { relative, join } from 'path'; import { createTemplateAction } from '../../createTemplateAction'; +import yaml from 'yaml'; + +const id = 'debug:log'; + +const examples = [ + { + description: 'Write a debug message', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'write-debug-line', + name: 'Write "Hello Backstage!" log line', + input: { + message: 'Hello Backstage!', + }, + }, + ], + }), + }, + { + description: 'List the workspace directory', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'write-workspace-directory', + name: 'List the workspace directory', + input: { + listWorkspace: true, + }, + }, + ], + }), + }, +]; /** * Writes a message into the log or lists all files in the workspace @@ -30,9 +66,10 @@ import { createTemplateAction } from '../../createTemplateAction'; */ export function createDebugLogAction() { return createTemplateAction<{ message?: string; listWorkspace?: boolean }>({ - id: 'debug:log', + id, description: 'Writes a message into the log or lists all files in the workspace.', + examples, schema: { input: { type: 'object', diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts index 50ec94e099..86d5f17803 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts @@ -39,7 +39,6 @@ describe('fetchContent helper', () => { const readTree = jest.fn(); const reader: UrlReader = { - read: jest.fn(), readUrl: jest.fn(), readTree, search: jest.fn(), diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts index 1595578666..0469ffec06 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts @@ -34,7 +34,6 @@ describe('fetch:plain', () => { ); const reader: UrlReader = { readUrl: jest.fn(), - read: jest.fn(), readTree: jest.fn(), search: jest.fn(), }; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts index 9dc82068c0..b3b984f544 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts @@ -33,7 +33,7 @@ export function createFetchPlainAction(options: { return createTemplateAction<{ url: string; targetPath?: string }>({ id: 'fetch:plain', description: - "Downloads content and places it in the workspace, or optionally in a subdirectory specified by the 'targetPath' input option.", + 'Downloads content and places it in the workspace, or optionally in a subdirectory specified by the `targetPath` input option.', schema: { input: { type: 'object', diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts index 6b03290e1e..6658e1915d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts @@ -669,4 +669,81 @@ describe('fetch:template', () => { ).resolves.toEqual('test-project: 1234'); }); }); + + describe('with replacement of existing files', () => { + let context: ActionContext; + + beforeEach(async () => { + context = mockContext({ + values: { + name: 'test-project', + count: 1234, + }, + replace: true, + }); + + mockFetchContents.mockImplementation(({ outputPath }) => { + mockFs({ + ...realFiles, + [joinPath(workspacePath, 'target')]: { + 'static-content.txt': 'static-content', + }, + [outputPath]: { + 'static-content.txt': '${{ values.name }}: ${{ values.count }}', + }, + }); + + return Promise.resolve(); + }); + + await action.handler(context); + }); + + afterEach(() => { + mockFs.restore(); + }); + + it('overwrites existing file', async () => { + await expect( + fs.readFile(`${workspacePath}/target/static-content.txt`, 'utf-8'), + ).resolves.toEqual('test-project: 1234'); + }); + }); + + describe('without replacement of existing files', () => { + let context: ActionContext; + + beforeEach(async () => { + context = mockContext({ + values: { + name: 'test-project', + count: 1234, + }, + targetPath: './target', + replace: false, + }); + + mockFetchContents.mockImplementation(({ outputPath }) => { + mockFs({ + ...realFiles, + [joinPath(workspacePath, 'target')]: { + 'static-content.txt': 'static-content', + }, + [outputPath]: { + 'static-content.txt': '${{ values.name }}: ${{ values.count }}', + }, + }); + + return Promise.resolve(); + }); + + await action.handler(context); + }); + + it('keeps existing file', async () => { + await expect( + fs.readFile(`${workspacePath}/target/static-content.txt`, 'utf-8'), + ).resolves.toEqual('static-content'); + }); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index d71997d496..81b3f4577c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -62,10 +62,11 @@ export function createFetchTemplateAction(options: { copyWithoutRender?: string[]; copyWithoutTemplating?: string[]; cookiecutterCompat?: boolean; + replace?: boolean; }>({ id: 'fetch:template', description: - "Downloads a skeleton, templates variables into file and directory names and content, and places the result in the workspace, or optionally in a subdirectory specified by the 'targetPath' input option.", + 'Downloads a skeleton, templates variables into file and directory names and content, and places the result in the workspace, or optionally in a subdirectory specified by the `targetPath` input option.', schema: { input: { type: 'object', @@ -118,6 +119,12 @@ export function createFetchTemplateAction(options: { 'If set, only files with the given extension will be templated. If set to `true`, the default extension `.njk` is used.', type: ['string', 'boolean'], }, + replace: { + title: 'Replace files', + description: + 'If set, replace files in targetPath instead of skipping existing ones.', + type: 'boolean', + }, }, }, }, @@ -261,7 +268,7 @@ export function createFetchTemplateAction(options: { } const outputPath = resolveSafeChildPath(outputDir, localOutputPath); - if (fs.existsSync(outputPath)) { + if (fs.existsSync(outputPath) && !ctx.input.replace) { continue; } diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts index 3c37f28ccd..824db27e84 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts @@ -106,6 +106,8 @@ describe('github:repo:create', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -126,6 +128,8 @@ describe('github:repo:create', () => { private: false, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -147,6 +151,8 @@ describe('github:repo:create', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -169,6 +175,8 @@ describe('github:repo:create', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_message: 'COMMIT_MESSAGES', + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -194,6 +202,8 @@ describe('github:repo:create', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_message: 'COMMIT_MESSAGES', + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -222,6 +232,8 @@ describe('github:repo:create', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -242,6 +254,8 @@ describe('github:repo:create', () => { private: false, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -263,6 +277,8 @@ describe('github:repo:create', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -285,6 +301,8 @@ describe('github:repo:create', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_message: 'COMMIT_MESSAGES', + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -310,6 +328,8 @@ describe('github:repo:create', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_message: 'COMMIT_MESSAGES', + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts index 598e3314fb..835fc79238 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts @@ -49,6 +49,8 @@ export function createGithubRepoCreateAction(options: { gitAuthorEmail?: string; allowRebaseMerge?: boolean; allowSquashMerge?: boolean; + squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE'; + squashMergeCommitMessage?: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK'; allowMergeCommit?: boolean; allowAutoMerge?: boolean; requireCodeOwnerReviews?: boolean; @@ -57,6 +59,12 @@ export function createGithubRepoCreateAction(options: { teams?: string[]; apps?: string[]; }; + requiredApprovingReviewCount?: number; + restrictions?: { + users: string[]; + teams: string[]; + apps?: string[]; + }; requiredStatusCheckContexts?: string[]; requireBranchesToBeUpToDate?: boolean; requiredConversationResolution?: boolean; @@ -64,11 +72,11 @@ export function createGithubRepoCreateAction(options: { collaborators?: Array< | { user: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { team: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { /** @deprecated This field is deprecated in favor of team */ @@ -81,6 +89,7 @@ export function createGithubRepoCreateAction(options: { hasIssues?: boolean; token?: string; topics?: string[]; + requireCommitSigning?: boolean; }>({ id: 'github:repo:create', description: 'Creates a GitHub repository.', @@ -95,6 +104,8 @@ export function createGithubRepoCreateAction(options: { access: inputProps.access, requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, + requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, + restrictions: inputProps.restrictions, requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, requiredConversationResolution: @@ -103,6 +114,8 @@ export function createGithubRepoCreateAction(options: { deleteBranchOnMerge: inputProps.deleteBranchOnMerge, allowMergeCommit: inputProps.allowMergeCommit, allowSquashMerge: inputProps.allowSquashMerge, + squashMergeCommitTitle: inputProps.squashMergeCommitTitle, + squashMergeCommitMessage: inputProps.squashMergeCommitMessage, allowRebaseMerge: inputProps.allowRebaseMerge, allowAutoMerge: inputProps.allowAutoMerge, collaborators: inputProps.collaborators, @@ -111,6 +124,7 @@ export function createGithubRepoCreateAction(options: { hasIssues: inputProps.hasIssues, token: inputProps.token, topics: inputProps.topics, + requiredCommitSigning: inputProps.requiredCommitSigning, }, }, output: { @@ -131,6 +145,8 @@ export function createGithubRepoCreateAction(options: { deleteBranchOnMerge = false, allowMergeCommit = true, allowSquashMerge = true, + squashMergeCommitTitle = 'COMMIT_OR_PR_TITLE', + squashMergeCommitMessage = 'COMMIT_MESSAGES', allowRebaseMerge = true, allowAutoMerge = false, collaborators, @@ -165,6 +181,8 @@ export function createGithubRepoCreateAction(options: { deleteBranchOnMerge, allowMergeCommit, allowSquashMerge, + squashMergeCommitTitle, + squashMergeCommitMessage, allowRebaseMerge, allowAutoMerge, access, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts index f8b45093e6..24777163d4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts @@ -287,6 +287,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -309,6 +313,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -331,6 +339,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); }); @@ -356,6 +368,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -378,6 +394,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -400,6 +420,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: false, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); }); @@ -425,6 +449,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -449,6 +477,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -472,6 +504,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -496,6 +532,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); }); @@ -540,6 +580,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -562,6 +606,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: true, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -584,6 +632,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); }); @@ -609,6 +661,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -631,6 +687,10 @@ describe('github:repo:push', () => { requiredConversationResolution: true, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); await action.handler({ @@ -653,6 +713,10 @@ describe('github:repo:push', () => { requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + requiredCommitSigning: false, + restrictions: undefined, }); }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts index 9d470790fa..5a5ffc015c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts @@ -57,11 +57,20 @@ export function createGithubRepoPushAction(options: { apps?: string[]; } | undefined; + requiredApprovingReviewCount?: number; + restrictions?: + | { + users: string[]; + teams: string[]; + apps?: string[]; + } + | undefined; requiredStatusCheckContexts?: string[]; requireBranchesToBeUpToDate?: boolean; requiredConversationResolution?: boolean; sourcePath?: string; token?: string; + requiredCommitSigning?: boolean; }>({ id: 'github:repo:push', description: @@ -76,6 +85,8 @@ export function createGithubRepoPushAction(options: { dismissStaleReviews: inputProps.dismissStaleReviews, requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, + requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, + restrictions: inputProps.restrictions, requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, requiredConversationResolution: inputProps.requiredConversationResolution, @@ -87,6 +98,7 @@ export function createGithubRepoPushAction(options: { gitAuthorEmail: inputProps.gitAuthorEmail, sourcePath: inputProps.sourcePath, token: inputProps.token, + requiredCommitSigning: inputProps.requiredCommitSigning, }, }, output: { @@ -109,10 +121,13 @@ export function createGithubRepoPushAction(options: { requireCodeOwnerReviews = false, dismissStaleReviews = false, bypassPullRequestAllowances, + requiredApprovingReviewCount = 1, + restrictions, requiredStatusCheckContexts = [], requireBranchesToBeUpToDate = true, requiredConversationResolution = false, token: providedToken, + requiredCommitSigning = false, } = ctx.input; const { owner, repo } = parseRepoUrl(repoUrl, integrations); @@ -148,6 +163,8 @@ export function createGithubRepoPushAction(options: { repo, requireCodeOwnerReviews, bypassPullRequestAllowances, + requiredApprovingReviewCount, + restrictions, requiredStatusCheckContexts, requireBranchesToBeUpToDate, requiredConversationResolution, @@ -157,6 +174,7 @@ export function createGithubRepoPushAction(options: { gitAuthorName, gitAuthorEmail, dismissStaleReviews, + requiredCommitSigning, ); ctx.output('remoteUrl', remoteUrl); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts index 499826ee6b..dae5e16374 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts @@ -102,6 +102,8 @@ export async function createGithubRepoWithCollaboratorsAndTopics( deleteBranchOnMerge: boolean, allowMergeCommit: boolean, allowSquashMerge: boolean, + squashMergeCommitTitle: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined, + squashMergeCommitMessage: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK' | undefined, allowRebaseMerge: boolean, allowAutoMerge: boolean, access: string | undefined, @@ -109,11 +111,11 @@ export async function createGithubRepoWithCollaboratorsAndTopics( | ( | { user: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { team: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { /** @deprecated This field is deprecated in favor of team */ @@ -144,6 +146,8 @@ export async function createGithubRepoWithCollaboratorsAndTopics( delete_branch_on_merge: deleteBranchOnMerge, allow_merge_commit: allowMergeCommit, allow_squash_merge: allowSquashMerge, + squash_merge_commit_title: squashMergeCommitTitle, + squash_merge_commit_message: squashMergeCommitMessage, allow_rebase_merge: allowRebaseMerge, allow_auto_merge: allowAutoMerge, homepage: homepage, @@ -158,6 +162,8 @@ export async function createGithubRepoWithCollaboratorsAndTopics( delete_branch_on_merge: deleteBranchOnMerge, allow_merge_commit: allowMergeCommit, allow_squash_merge: allowSquashMerge, + squash_merge_commit_title: squashMergeCommitTitle, + squash_merge_commit_message: squashMergeCommitMessage, allow_rebase_merge: allowRebaseMerge, allow_auto_merge: allowAutoMerge, homepage: homepage, @@ -265,6 +271,14 @@ export async function initRepoPushAndProtect( apps?: string[]; } | undefined, + requiredApprovingReviewCount: number, + restrictions: + | { + users: string[]; + teams: string[]; + apps?: string[]; + } + | undefined, requiredStatusCheckContexts: string[], requireBranchesToBeUpToDate: boolean, requiredConversationResolution: boolean, @@ -274,6 +288,7 @@ export async function initRepoPushAndProtect( gitAuthorName?: string, gitAuthorEmail?: string, dismissStaleReviews?: boolean, + requiredCommitSigning?: boolean, ) { const gitAuthorInfo = { name: gitAuthorName @@ -310,12 +325,15 @@ export async function initRepoPushAndProtect( logger, defaultBranch, bypassPullRequestAllowances, + requiredApprovingReviewCount, + restrictions, requireCodeOwnerReviews, requiredStatusCheckContexts, requireBranchesToBeUpToDate, requiredConversationResolution, enforceAdmins: protectEnforceAdmins, dismissStaleReviews: dismissStaleReviews, + requiredCommitSigning: requiredCommitSigning, }); } catch (e) { assertError(e); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts index 07dd0f8163..b1286953a6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts @@ -94,6 +94,17 @@ const allowSquashMerge = { type: 'boolean', description: `Allow squash merges. The default value is 'true'`, }; +const squashMergeCommitTitle = { + title: 'Default squash merge commit title', + enum: ['PR_TITLE', 'COMMIT_OR_PR_TITLE'], + description: `Sets the default value for a squash merge commit title. The default value is 'COMMIT_OR_PR_TITLE'`, +}; +const squashMergeCommitMessage = { + title: 'Default squash merge commit message', + enum: ['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'], + description: `Sets the default value for a squash merge commit message. The default value is 'COMMIT_MESSAGES'`, +}; + const allowRebaseMerge = { title: 'Allow Rebase Merges', type: 'boolean', @@ -116,7 +127,6 @@ const collaborators = { access: { type: 'string', description: 'The type of access for the user', - enum: ['push', 'pull', 'admin', 'maintain', 'triage'], }, user: { type: 'string', @@ -215,10 +225,52 @@ const sourcePath = { type: 'string', }; +const requiredApprovingReviewCount = { + title: 'Required approving review count', + type: 'number', + description: `Specify the number of reviewers required to approve pull requests. Use a number between 1 and 6 or 0 to not require reviewers. Defaults to 1.`, +}; + +const restrictions = { + title: 'Restrict who can push to the protected branch', + description: + 'Restrict who can push to the protected branch. User, app, and team restrictions are only available for organization-owned repositories.', + type: 'object', + additionalProperties: false, + properties: { + apps: { + type: 'array', + items: { + type: 'string', + }, + }, + users: { + type: 'array', + items: { + type: 'string', + }, + }, + teams: { + type: 'array', + items: { + type: 'string', + }, + }, + }, +}; + +const requiredCommitSigning = { + title: 'Require commit signing', + type: 'boolean', + description: `Require commit signing so that you must sign commits on this branch.`, +}; + export { access }; export { allowMergeCommit }; export { allowRebaseMerge }; export { allowSquashMerge }; +export { squashMergeCommitTitle }; +export { squashMergeCommitMessage }; export { allowAutoMerge }; export { collaborators }; export { defaultBranch }; @@ -231,6 +283,8 @@ export { homepage }; export { protectDefaultBranch }; export { protectEnforceAdmins }; export { bypassPullRequestAllowances }; +export { requiredApprovingReviewCount }; +export { restrictions }; export { repoUrl }; export { repoVisibility }; export { requireCodeOwnerReviews }; @@ -244,3 +298,4 @@ export { hasWiki }; export { sourcePath }; export { token }; export { topics }; +export { requiredCommitSigning }; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts index 74e5d4580b..8bed279a1b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts @@ -190,11 +190,18 @@ type BranchProtectionOptions = { teams?: string[]; apps?: string[]; }; + requiredApprovingReviewCount?: number; + restrictions?: { + users: string[]; + teams: string[]; + apps?: string[]; + }; requireBranchesToBeUpToDate?: boolean; requiredConversationResolution?: boolean; defaultBranch?: string; enforceAdmins?: boolean; dismissStaleReviews?: boolean; + requiredCommitSigning?: boolean; }; export const enableBranchProtectionOnDefaultRepoBranch = async ({ @@ -204,12 +211,15 @@ export const enableBranchProtectionOnDefaultRepoBranch = async ({ logger, requireCodeOwnerReviews, bypassPullRequestAllowances, + requiredApprovingReviewCount, + restrictions, requiredStatusCheckContexts = [], requireBranchesToBeUpToDate = true, requiredConversationResolution = false, defaultBranch = 'master', enforceAdmins = true, dismissStaleReviews = false, + requiredCommitSigning = false, }: BranchProtectionOptions): Promise => { const tryOnce = async () => { try { @@ -231,16 +241,24 @@ export const enableBranchProtectionOnDefaultRepoBranch = async ({ strict: requireBranchesToBeUpToDate, contexts: requiredStatusCheckContexts, }, - restrictions: null, + restrictions: restrictions ?? null, enforce_admins: enforceAdmins, required_pull_request_reviews: { - required_approving_review_count: 1, + required_approving_review_count: requiredApprovingReviewCount, require_code_owner_reviews: requireCodeOwnerReviews, bypass_pull_request_allowances: bypassPullRequestAllowances, dismiss_stale_reviews: dismissStaleReviews, }, required_conversation_resolution: requiredConversationResolution, }); + + if (requiredCommitSigning) { + await client.rest.repos.createCommitSignatureProtection({ + owner, + repo: repoName, + branch: defaultBranch, + }); + } } catch (e) { assertError(e); if ( diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.test.ts index 52f445098b..6b4fa3d781 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.test.ts @@ -375,7 +375,11 @@ describe('publish:bitbucketServer', () => { defaultBranch: 'master', auth: { token: 'thing' }, logger: mockContext.logger, - gitAuthorInfo: {}, + commitMessage: 'initial commit', + gitAuthorInfo: { + email: undefined, + name: undefined, + }, }); }); @@ -429,7 +433,11 @@ describe('publish:bitbucketServer', () => { defaultBranch: 'master', auth: { username: 'test-user', password: 'test-password' }, logger: mockContext.logger, - gitAuthorInfo: {}, + commitMessage: 'initial commit', + gitAuthorInfo: { + email: undefined, + name: undefined, + }, }); }); @@ -481,7 +489,11 @@ describe('publish:bitbucketServer', () => { defaultBranch: 'main', auth: { token: 'thing' }, logger: mockContext.logger, - gitAuthorInfo: {}, + commitMessage: 'initial commit', + gitAuthorInfo: { + email: undefined, + name: undefined, + }, }); }); @@ -555,6 +567,7 @@ describe('publish:bitbucketServer', () => { auth: { token: 'thing' }, logger: mockContext.logger, defaultBranch: 'master', + commitMessage: 'initial commit', gitAuthorInfo: { name: 'Test', email: 'example@example.com' }, }); }); @@ -574,7 +587,7 @@ describe('publish:bitbucketServer', () => { ], }, scaffolder: { - defaultCommitMessage: 'Test commit message', + defaultCommitMessage: 'initial commit', }, }); @@ -626,7 +639,7 @@ describe('publish:bitbucketServer', () => { auth: { token: 'thing' }, logger: mockContext.logger, defaultBranch: 'master', - commitMessage: 'Test commit message', + commitMessage: 'initial commit', gitAuthorInfo: { email: undefined, name: undefined }, }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.ts index d0cde4ad31..8c96c14463 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.ts @@ -130,6 +130,9 @@ export function createPublishBitbucketServerAction(options: { sourcePath?: string; enableLFS?: boolean; token?: string; + gitCommitMessage?: string; + gitAuthorName?: string; + gitAuthorEmail?: string; }>({ id: 'publish:bitbucketServer', description: @@ -174,6 +177,21 @@ export function createPublishBitbucketServerAction(options: { description: 'The token to use for authorization to BitBucket Server', }, + gitCommitMessage: { + title: 'Git Commit Message', + type: 'string', + description: `Sets the commit message on the repository. The default value is 'initial commit'`, + }, + gitAuthorName: { + title: 'Author Name', + type: 'string', + description: `Sets the author name for the commit. The default value is 'Scaffolder'`, + }, + gitAuthorEmail: { + title: 'Author Email', + type: 'string', + description: `Sets the author email for the commit.`, + }, }, }, output: { @@ -197,6 +215,9 @@ export function createPublishBitbucketServerAction(options: { defaultBranch = 'master', repoVisibility = 'private', enableLFS = false, + gitCommitMessage = 'initial commit', + gitAuthorName, + gitAuthorEmail, } = ctx.input; const { project, repo, host } = parseRepoUrl(repoUrl, integrations); @@ -241,8 +262,12 @@ export function createPublishBitbucketServerAction(options: { }); const gitAuthorInfo = { - name: config.getOptionalString('scaffolder.defaultAuthor.name'), - email: config.getOptionalString('scaffolder.defaultAuthor.email'), + name: gitAuthorName + ? gitAuthorName + : config.getOptionalString('scaffolder.defaultAuthor.name'), + email: gitAuthorEmail + ? gitAuthorEmail + : config.getOptionalString('scaffolder.defaultAuthor.email'), }; const auth = authConfig.token @@ -260,9 +285,9 @@ export function createPublishBitbucketServerAction(options: { auth, defaultBranch, logger: ctx.logger, - commitMessage: config.getOptionalString( - 'scaffolder.defaultCommitMessage', - ), + commitMessage: gitCommitMessage + ? gitCommitMessage + : config.getOptionalString('scaffolder.defaultCommitMessage'), gitAuthorInfo, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts index 68e6521187..c2681ed527 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts @@ -111,6 +111,8 @@ describe('publish:github', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -131,6 +133,8 @@ describe('publish:github', () => { private: false, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -152,6 +156,8 @@ describe('publish:github', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -174,6 +180,8 @@ describe('publish:github', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_message: 'COMMIT_MESSAGES', + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -199,6 +207,8 @@ describe('publish:github', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_message: 'COMMIT_MESSAGES', + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -227,6 +237,8 @@ describe('publish:github', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -247,6 +259,8 @@ describe('publish:github', () => { private: false, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -268,6 +282,8 @@ describe('publish:github', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', + squash_merge_commit_message: 'COMMIT_MESSAGES', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -290,6 +306,8 @@ describe('publish:github', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_message: 'COMMIT_MESSAGES', + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -315,6 +333,8 @@ describe('publish:github', () => { private: true, delete_branch_on_merge: false, allow_squash_merge: true, + squash_merge_commit_message: 'COMMIT_MESSAGES', + squash_merge_commit_title: 'COMMIT_OR_PR_TITLE', allow_merge_commit: true, allow_rebase_merge: true, allow_auto_merge: false, @@ -768,11 +788,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -790,11 +814,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: true, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -812,11 +840,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); }); @@ -840,11 +872,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -862,11 +898,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: false, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -884,11 +924,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); }); @@ -912,11 +956,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -936,11 +984,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, - requiredStatusCheckContexts: ['statusCheck'], + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -959,11 +1011,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: ['statusCheck'], requireBranchesToBeUpToDate: false, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -981,11 +1037,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); }); @@ -1064,11 +1124,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -1086,11 +1150,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: true, + requiredCommitSigning: false, }); await action.handler({ @@ -1108,11 +1176,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); }); it('should call enableBranchProtectionOnDefaultRepoBranch with the correct values of requiredConversationResolution', async () => { @@ -1135,11 +1207,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -1157,11 +1233,15 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: true, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, }); await action.handler({ @@ -1179,11 +1259,567 @@ describe('publish:github', () => { logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, requiredStatusCheckContexts: [], requireBranchesToBeUpToDate: true, requiredConversationResolution: false, enforceAdmins: true, dismissStaleReviews: false, + requiredCommitSigning: false, + }); + }); + it('should call enableBranchProtectionOnDefaultRepoBranch with the correct values of requiredApprovingReviewCount', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + name: 'repo', + }, + }); + + await action.handler(mockContext); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + requiredApprovingReviewCount: 2, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 2, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + requiredApprovingReviewCount: 0, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 0, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + }); + it('should call enableBranchProtectionOnDefaultRepoBranch with the correct values of restrictions', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + name: 'repo', + }, + }); + + await action.handler(mockContext); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + restrictions: { + users: ['user'], + teams: [], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: { + users: ['user'], + teams: [], + }, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + restrictions: { + users: [], + teams: ['team'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: { + users: [], + teams: ['team'], + }, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + restrictions: { + users: [], + teams: [], + apps: ['app'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: { + users: [], + teams: [], + apps: ['app'], + }, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + restrictions: { + users: ['user'], + teams: ['team'], + apps: ['app'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: { + users: ['user'], + teams: ['team'], + apps: ['app'], + }, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + restrictions: { + users: ['user1', 'user2'], + teams: ['team1', 'team2'], + apps: ['app1', 'app2'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: { + users: ['user1', 'user2'], + teams: ['team1', 'team2'], + apps: ['app1', 'app2'], + }, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + }); + it('should call enableBranchProtectionOnDefaultRepoBranch with the correct values of requiredCommitSigning', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + name: 'repo', + }, + }); + + await action.handler(mockContext); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + requiredCommitSigning: false, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + requiredCommitSigning: true, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: true, + }); + }); + it('should call enableBranchProtectionOnDefaultRepoBranch with the correct values of bypassPullRequestAllowances', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + name: 'repo', + }, + }); + + await action.handler(mockContext); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: undefined, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + bypassPullRequestAllowances: { + users: ['user'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: { + users: ['user'], + }, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + bypassPullRequestAllowances: { + teams: ['team'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: { + teams: ['team'], + }, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + bypassPullRequestAllowances: { + apps: ['app'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: { + apps: ['app'], + }, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + bypassPullRequestAllowances: { + users: ['user'], + teams: ['team'], + apps: ['app'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: { + users: ['user'], + teams: ['team'], + apps: ['app'], + }, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + bypassPullRequestAllowances: { + users: ['user1', 'user2'], + teams: ['team1', 'team2'], + apps: ['app1', 'app2'], + }, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repo', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + bypassPullRequestAllowances: { + users: ['user1', 'user2'], + teams: ['team1', 'team2'], + apps: ['app1', 'app2'], + }, + requiredApprovingReviewCount: 1, + restrictions: undefined, + requiredStatusCheckContexts: [], + requireBranchesToBeUpToDate: true, + requiredConversationResolution: false, + enforceAdmins: true, + dismissStaleReviews: false, + requiredCommitSigning: false, }); }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts index edb1c699d7..add6fcc79c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts @@ -57,6 +57,8 @@ export function createPublishGithubAction(options: { gitAuthorEmail?: string; allowRebaseMerge?: boolean; allowSquashMerge?: boolean; + squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE'; + squashMergeCommitMessage?: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK'; allowMergeCommit?: boolean; allowAutoMerge?: boolean; sourcePath?: string; @@ -67,6 +69,14 @@ export function createPublishGithubAction(options: { apps?: string[]; } | undefined; + requiredApprovingReviewCount?: number; + restrictions?: + | { + users: string[]; + teams: string[]; + apps?: string[]; + } + | undefined; requireCodeOwnerReviews?: boolean; dismissStaleReviews?: boolean; requiredStatusCheckContexts?: string[]; @@ -76,11 +86,11 @@ export function createPublishGithubAction(options: { collaborators?: Array< | { user: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { team: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + access: string; } | { /** @deprecated This field is deprecated in favor of team */ @@ -93,6 +103,7 @@ export function createPublishGithubAction(options: { hasIssues?: boolean | undefined; token?: string; topics?: string[]; + requiredCommitSigning?: boolean; }>({ id: 'publish:github', description: @@ -107,6 +118,8 @@ export function createPublishGithubAction(options: { homepage: inputProps.homepage, access: inputProps.access, bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, + requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, + restrictions: inputProps.restrictions, requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, dismissStaleReviews: inputProps.dismissStaleReviews, requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, @@ -123,6 +136,8 @@ export function createPublishGithubAction(options: { gitAuthorEmail: inputProps.gitAuthorEmail, allowMergeCommit: inputProps.allowMergeCommit, allowSquashMerge: inputProps.allowSquashMerge, + squashMergeCommitTitle: inputProps.squashMergeCommitTitle, + squashMergeCommitMessage: inputProps.squashMergeCommitMessage, allowRebaseMerge: inputProps.allowRebaseMerge, allowAutoMerge: inputProps.allowAutoMerge, sourcePath: inputProps.sourcePath, @@ -132,6 +147,7 @@ export function createPublishGithubAction(options: { hasIssues: inputProps.hasIssues, token: inputProps.token, topics: inputProps.topics, + requiredCommitSigning: inputProps.requiredCommitSigning, }, }, output: { @@ -151,6 +167,8 @@ export function createPublishGithubAction(options: { requireCodeOwnerReviews = false, dismissStaleReviews = false, bypassPullRequestAllowances, + requiredApprovingReviewCount = 1, + restrictions, requiredStatusCheckContexts = [], requireBranchesToBeUpToDate = true, requiredConversationResolution = false, @@ -164,6 +182,8 @@ export function createPublishGithubAction(options: { gitAuthorEmail, allowMergeCommit = true, allowSquashMerge = true, + squashMergeCommitTitle = 'COMMIT_OR_PR_TITLE', + squashMergeCommitMessage = 'COMMIT_MESSAGES', allowRebaseMerge = true, allowAutoMerge = false, collaborators, @@ -172,6 +192,7 @@ export function createPublishGithubAction(options: { hasIssues = undefined, topics, token: providedToken, + requiredCommitSigning = false, } = ctx.input; const octokitOptions = await getOctokitOptions({ @@ -198,6 +219,8 @@ export function createPublishGithubAction(options: { deleteBranchOnMerge, allowMergeCommit, allowSquashMerge, + squashMergeCommitTitle, + squashMergeCommitMessage, allowRebaseMerge, allowAutoMerge, access, @@ -225,6 +248,8 @@ export function createPublishGithubAction(options: { repo, requireCodeOwnerReviews, bypassPullRequestAllowances, + requiredApprovingReviewCount, + restrictions, requiredStatusCheckContexts, requireBranchesToBeUpToDate, requiredConversationResolution, @@ -234,6 +259,7 @@ export function createPublishGithubAction(options: { gitAuthorName, gitAuthorEmail, dismissStaleReviews, + requiredCommitSigning, ); ctx.output('remoteUrl', remoteUrl); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/types.ts b/plugins/scaffolder-backend/src/scaffolder/actions/types.ts index 666f7a0d50..0912cc038b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/types.ts @@ -66,6 +66,7 @@ export type ActionContext = { export type TemplateAction = { id: string; description?: string; + examples?: { description: string; example: string }[]; supportsDryRun?: boolean; schema?: { input?: Schema; diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index e741961ddc..9ff8d43625 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -292,6 +292,7 @@ export async function createRouter( return { id: action.id, description: action.description, + examples: action.examples, schema: action.schema, }; }); diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 355f125b9b..a74ea5b13e 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-scaffolder-common +## 1.2.4 + +### Patch Changes + +- 011bd518b7: Fixed spelling mistakes in documentation. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/types@1.0.2 + +## 1.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/types@1.0.2 + +## 1.2.4-next.0 + +### Patch Changes + +- 011bd518b7: Fixed spelling mistakes in documentation. +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/types@1.0.2 + ## 1.2.3 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index a2f4ae5bcf..e1ba605c30 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-common", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", - "version": "1.2.3", + "version": "1.2.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index 1c71790736..7c06fe2b99 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -15,7 +15,7 @@ */ import type { EntityMeta, UserEntity } from '@backstage/catalog-model'; -import type { JsonValue, JsonObject } from '@backstage/types'; +import type { JsonObject, JsonValue } from '@backstage/types'; /** * Information about a template that is stored on a task specification. @@ -51,7 +51,7 @@ export type TemplateInfo = { */ export interface TaskStep { /** - * A unqiue identifier for this step. + * A unique identifier for this step. */ id: string; /** diff --git a/plugins/scaffolder-react/.eslintrc.js b/plugins/scaffolder-react/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/scaffolder-react/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md new file mode 100644 index 0000000000..013cd393a3 --- /dev/null +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -0,0 +1,41 @@ +# @backstage/plugin-scaffolder-react + +## 1.0.0 + +### Major Changes + +- b4955ed7b9: Re-home some of the common types, components, hooks and `scaffolderApiRef` for the `@backstage/plugin-scaffolder` to this package for easy re-use across things that want to interact with the `scaffolder`. + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-scaffolder-common@1.2.4 + - @backstage/catalog-client@1.3.0 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.0.0-next.0 + +### Major Changes + +- b4955ed7b9: Re-home some of the common types, components, hooks and `scaffolderApiRef` for the `@backstage/plugin-scaffolder` to this package for easy re-use across things that want to interact with the `scaffolder`. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-scaffolder-common@1.2.4-next.1 diff --git a/plugins/scaffolder-react/README.md b/plugins/scaffolder-react/README.md new file mode 100644 index 0000000000..1db37d5b23 --- /dev/null +++ b/plugins/scaffolder-react/README.md @@ -0,0 +1,12 @@ +# Scaffolder React + +This is shared code of the frontend part of the default Scaffolder plugin. + +It will implement the core API for working with the Scaffolder, and +supplies components that can be reused by third-party plugins. + +## Links + +- [Frontend part of the plugin](https://github.com/backstage/backstage/tree/master/plugins/scaffolder) +- [Backend part of the plugin](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend) +- [The Backstage homepage](https://backstage.io) diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md new file mode 100644 index 0000000000..85ba2c937a --- /dev/null +++ b/plugins/scaffolder-react/api-report.md @@ -0,0 +1,461 @@ +## API Report File for "@backstage/plugin-scaffolder-react" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { ApiHolder } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/core-plugin-api'; +import { Dispatch } from 'react'; +import { Extension } from '@backstage/core-plugin-api'; +import { FieldProps } from '@rjsf/core'; +import { FieldProps as FieldProps_2 } from '@rjsf/utils'; +import { FieldValidation } from '@rjsf/core'; +import { FieldValidation as FieldValidation_2 } from '@rjsf/utils'; +import type { FormProps as FormProps_2 } from '@rjsf/core-v5'; +import { IconComponent } from '@backstage/core-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { JSONSchema7 } from 'json-schema'; +import { JsonValue } from '@backstage/types'; +import { Observable } from '@backstage/types'; +import { PropsWithChildren } from 'react'; +import { default as React_2 } from 'react'; +import { ReactNode } from 'react'; +import { SetStateAction } from 'react'; +import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { TaskStep } from '@backstage/plugin-scaffolder-common'; +import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { UIOptionsType } from '@rjsf/utils'; +import { UiSchema } from '@rjsf/utils'; + +// @public +export type Action = { + id: string; + description?: string; + schema?: { + input?: JSONSchema7; + output?: JSONSchema7; + }; + examples?: ActionExample[]; +}; + +// @public +export type ActionExample = { + description: string; + example: string; +}; + +// @alpha +export const createFieldValidation: () => FieldValidation_2; + +// @alpha +export function createNextScaffolderFieldExtension< + TReturnValue = unknown, + TInputProps extends UIOptionsType = {}, +>( + options: NextFieldExtensionOptions, +): Extension>; + +// @public +export function createScaffolderFieldExtension< + TReturnValue = unknown, + TInputProps = unknown, +>( + options: FieldExtensionOptions, +): Extension>; + +// @public +export type CustomFieldExtensionSchema = { + returnValue: JSONSchema7; + uiOptions?: JSONSchema7; +}; + +// @public +export type CustomFieldValidator = ( + data: TFieldReturnValue, + field: FieldValidation, + context: { + apiHolder: ApiHolder; + }, +) => void | Promise; + +// @alpha (undocumented) +export const EmbeddableWorkflow: (props: WorkflowProps) => JSX.Element; + +// @alpha +export const extractSchemaFromStep: (inputStep: JsonObject) => { + uiSchema: UiSchema; + schema: JsonObject; +}; + +// @public +export type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null; + +// @public +export interface FieldExtensionComponentProps< + TFieldReturnValue, + TUiOptions extends {} = {}, +> extends FieldProps { + // (undocumented) + uiSchema: FieldProps['uiSchema'] & { + 'ui:options'?: TUiOptions; + }; +} + +// @public +export type FieldExtensionOptions< + TFieldReturnValue = unknown, + TInputProps = unknown, +> = { + name: string; + component: ( + props: FieldExtensionComponentProps, + ) => JSX.Element | null; + validation?: CustomFieldValidator; + schema?: CustomFieldExtensionSchema; +}; + +// @alpha +export type FormProps = Pick< + FormProps_2, + 'transformErrors' | 'noHtml5Validate' +>; + +// @public +export type ListActionsResponse = Array; + +// @public +export type LogEvent = { + type: 'log' | 'completion'; + body: { + message: string; + stepId?: string; + status?: ScaffolderTaskStatus; + }; + createdAt: string; + id: string; + taskId: string; +}; + +// @alpha +export type NextCustomFieldValidator = ( + data: TFieldReturnValue, + field: FieldValidation_2, + context: { + apiHolder: ApiHolder; + formData: JsonObject; + }, +) => void | Promise; + +// @alpha +export interface NextFieldExtensionComponentProps< + TFieldReturnValue, + TUiOptions = {}, +> extends PropsWithChildren> { + // (undocumented) + uiSchema?: UiSchema & { + 'ui:options'?: TUiOptions & UIOptionsType; + }; +} + +// @alpha +export type NextFieldExtensionOptions< + TFieldReturnValue = unknown, + TInputProps = unknown, +> = { + name: string; + component: ( + props: NextFieldExtensionComponentProps, + ) => JSX.Element | null; + validation?: NextCustomFieldValidator; + schema?: CustomFieldExtensionSchema; +}; + +// @alpha +export interface ParsedTemplateSchema { + // (undocumented) + description?: string; + // (undocumented) + mergedSchema: JsonObject; + // (undocumented) + schema: JsonObject; + // (undocumented) + title: string; + // (undocumented) + uiSchema: UiSchema; +} + +// @alpha +export const ReviewState: (props: ReviewStateProps) => JSX.Element; + +// @alpha +export type ReviewStateProps = { + schemas: ParsedTemplateSchema[]; + formState: JsonObject; +}; + +// @public +export interface ScaffolderApi { + // (undocumented) + dryRun?(options: ScaffolderDryRunOptions): Promise; + // (undocumented) + getIntegrationsList( + options: ScaffolderGetIntegrationsListOptions, + ): Promise; + // (undocumented) + getTask(taskId: string): Promise; + // (undocumented) + getTemplateParameterSchema( + templateRef: string, + ): Promise; + listActions(): Promise; + // (undocumented) + listTasks?(options: { filterByOwnership: 'owned' | 'all' }): Promise<{ + tasks: ScaffolderTask[]; + }>; + scaffold( + options: ScaffolderScaffoldOptions, + ): Promise; + // (undocumented) + streamLogs(options: ScaffolderStreamLogsOptions): Observable; +} + +// @public (undocumented) +export const scaffolderApiRef: ApiRef; + +// @public (undocumented) +export interface ScaffolderDryRunOptions { + // (undocumented) + directoryContents: { + path: string; + base64Content: string; + }[]; + // (undocumented) + secrets?: Record; + // (undocumented) + template: JsonValue; + // (undocumented) + values: JsonObject; +} + +// @public (undocumented) +export interface ScaffolderDryRunResponse { + // (undocumented) + directoryContents: Array<{ + path: string; + base64Content: string; + executable: boolean; + }>; + // (undocumented) + log: Array>; + // (undocumented) + output: ScaffolderTaskOutput; + // (undocumented) + steps: TaskStep[]; +} + +// @public +export const ScaffolderFieldExtensions: React_2.ComponentType< + React_2.PropsWithChildren<{}> +>; + +// @public +export interface ScaffolderGetIntegrationsListOptions { + // (undocumented) + allowedHosts: string[]; +} + +// @public +export interface ScaffolderGetIntegrationsListResponse { + // (undocumented) + integrations: { + type: string; + title: string; + host: string; + }[]; +} + +// @public (undocumented) +export type ScaffolderOutputLink = { + title?: string; + icon?: string; + url?: string; + entityRef?: string; +}; + +// @public +export interface ScaffolderScaffoldOptions { + // (undocumented) + secrets?: Record; + // (undocumented) + templateRef: string; + // (undocumented) + values: Record; +} + +// @public +export interface ScaffolderScaffoldResponse { + // (undocumented) + taskId: string; +} + +// @public +export interface ScaffolderStreamLogsOptions { + // (undocumented) + after?: number; + // (undocumented) + taskId: string; +} + +// @public +export type ScaffolderTask = { + id: string; + spec: TaskSpec; + status: 'failed' | 'completed' | 'processing' | 'open' | 'cancelled'; + lastHeartbeatAt: string; + createdAt: string; +}; + +// @public (undocumented) +export type ScaffolderTaskOutput = { + links?: ScaffolderOutputLink[]; +} & { + [key: string]: unknown; +}; + +// @public +export type ScaffolderTaskStatus = + | 'open' + | 'processing' + | 'failed' + | 'completed' + | 'skipped'; + +// @public +export interface ScaffolderUseTemplateSecrets { + // (undocumented) + secrets: Record; + // (undocumented) + setSecrets: (input: Record) => void; +} + +// @public +export const SecretsContextProvider: ({ + children, +}: PropsWithChildren<{}>) => JSX.Element; + +// @alpha +export const Stepper: (stepperProps: StepperProps) => JSX.Element; + +// @alpha +export type StepperProps = { + manifest: TemplateParameterSchema; + extensions: NextFieldExtensionOptions[]; + templateName?: string; + FormProps?: FormProps; + initialState?: Record; + onCreate: (values: Record) => Promise; + components?: { + ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element; + createButtonText?: ReactNode; + reviewButtonText?: ReactNode; + }; +}; + +// @alpha +export const TemplateCard: (props: TemplateCardProps) => JSX.Element; + +// @alpha +export interface TemplateCardProps { + // (undocumented) + additionalLinks?: { + icon: IconComponent; + text: string; + url: string; + }[]; + // (undocumented) + onSelected?: (template: TemplateEntityV1beta3) => void; + // (undocumented) + template: TemplateEntityV1beta3; +} + +// @alpha +export const TemplateGroup: (props: TemplateGroupProps) => JSX.Element; + +// @alpha +export interface TemplateGroupProps { + // (undocumented) + components?: { + CardComponent?: React_2.ComponentType; + }; + // (undocumented) + onSelected: (template: TemplateEntityV1beta3) => void; + // (undocumented) + templates: { + template: TemplateEntityV1beta3; + additionalLinks?: { + icon: IconComponent; + text: string; + url: string; + }[]; + }[]; + // (undocumented) + title: React_2.ReactNode; +} + +// @public +export type TemplateParameterSchema = { + title: string; + description?: string; + steps: Array<{ + title: string; + description?: string; + schema: JsonObject; + }>; +}; + +// @public +export const useCustomFieldExtensions: < + TComponentDataType = FieldExtensionOptions, +>( + outlet: React.ReactNode, +) => TComponentDataType[]; + +// @alpha +export const useFormDataFromQuery: ( + initialState?: Record, +) => [Record, Dispatch>>]; + +// @alpha (undocumented) +export const useTemplateParameterSchema: (templateRef: string) => { + manifest: TemplateParameterSchema | undefined; + loading: boolean; + error: Error | undefined; +}; + +// @alpha +export const useTemplateSchema: (manifest: TemplateParameterSchema) => { + steps: ParsedTemplateSchema[]; +}; + +// @public +export const useTemplateSecrets: () => ScaffolderUseTemplateSecrets; + +// @alpha (undocumented) +export const Workflow: (workflowProps: WorkflowProps) => JSX.Element | null; + +// @alpha (undocumented) +export type WorkflowProps = { + title?: string; + description?: string; + namespace: string; + templateName: string; + onError(error: Error | undefined): JSX.Element | null; +} & Pick< + StepperProps, + 'extensions' | 'FormProps' | 'components' | 'onCreate' | 'initialState' +>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json new file mode 100644 index 0000000000..93ffd18d51 --- /dev/null +++ b/plugins/scaffolder-react/package.json @@ -0,0 +1,86 @@ +{ + "name": "@backstage/plugin-scaffolder-react", + "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", + "version": "1.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", + "alphaTypes": "dist/index.alpha.d.ts" + }, + "backstage": { + "role": "web-library" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-react" + }, + "keywords": [ + "backstage" + ], + "scripts": { + "build": "backstage-cli package build --experimental-type-build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean", + "start": "backstage-cli package start" + }, + "dependencies": { + "@backstage/catalog-client": "workspace:^", + "@backstage/catalog-model": "workspace:^", + "@backstage/core-components": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/plugin-catalog-react": "workspace:^", + "@backstage/plugin-scaffolder-common": "workspace:^", + "@backstage/theme": "workspace:^", + "@backstage/types": "workspace:^", + "@backstage/version-bridge": "workspace:^", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.57", + "@rjsf/core": "^3.2.1", + "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16", + "@rjsf/material-ui": "^3.2.1", + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.16", + "@rjsf/utils": "5.0.0-beta.16", + "@rjsf/validator-ajv6": "5.0.0-beta.16", + "@types/json-schema": "^7.0.9", + "classnames": "^2.2.6", + "json-schema": "^0.4.0", + "json-schema-library": "^7.3.9", + "lodash": "^4.17.21", + "qs": "^6.9.4", + "react-use": "^17.2.4", + "zen-observable": "^0.10.0", + "zod": "~3.18.0", + "zod-to-json-schema": "~3.18.0" + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0", + "react": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/core-app-api": "workspace:^", + "@backstage/plugin-catalog": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3", + "@testing-library/react-hooks": "^8.0.0", + "@testing-library/user-event": "^14.0.0" + }, + "files": [ + "dist", + "alpha" + ] +} diff --git a/packages/backend-plugin-api/src/services/helpers/index.ts b/plugins/scaffolder-react/src/api/index.ts similarity index 90% rename from packages/backend-plugin-api/src/services/helpers/index.ts rename to plugins/scaffolder-react/src/api/index.ts index 24336c1af2..fa8d758afb 100644 --- a/packages/backend-plugin-api/src/services/helpers/index.ts +++ b/plugins/scaffolder-react/src/api/index.ts @@ -13,5 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -export { loggerToWinstonLogger } from './loggerToWinstonLogger'; +export * from './ref'; +export * from './types'; diff --git a/packages/backend-plugin-api/src/services/definitions/databaseServiceRef.ts b/plugins/scaffolder-react/src/api/ref.ts similarity index 63% rename from packages/backend-plugin-api/src/services/definitions/databaseServiceRef.ts rename to plugins/scaffolder-react/src/api/ref.ts index aaea5d304f..c4b7853556 100644 --- a/packages/backend-plugin-api/src/services/definitions/databaseServiceRef.ts +++ b/plugins/scaffolder-react/src/api/ref.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import { PluginDatabaseManager } from '@backstage/backend-common'; -import { createServiceRef } from '../system/types'; +import { createApiRef } from '@backstage/core-plugin-api'; +import { ScaffolderApi } from './types'; +import { getOrCreateGlobalSingleton } from '@backstage/version-bridge'; /** @public */ -export type DatabaseService = PluginDatabaseManager; - -/** - * @public - */ -export const databaseServiceRef = createServiceRef({ - id: 'core.database', -}); +export const scaffolderApiRef = getOrCreateGlobalSingleton( + 'scaffolder:scaffolder-api-ref', + () => + createApiRef({ + id: 'plugin.scaffolder.service', + }), +); diff --git a/plugins/scaffolder/src/types.ts b/plugins/scaffolder-react/src/api/types.ts similarity index 92% rename from plugins/scaffolder/src/types.ts rename to plugins/scaffolder-react/src/api/types.ts index acb0f0e114..0a517e7bff 100644 --- a/plugins/scaffolder/src/types.ts +++ b/plugins/scaffolder-react/src/api/types.ts @@ -16,6 +16,7 @@ import { TaskSpec, TaskStep } from '@backstage/plugin-scaffolder-common'; import { JsonObject, JsonValue, Observable } from '@backstage/types'; import { JSONSchema7 } from 'json-schema'; +import { TemplateParameterSchema } from '../types'; /** * The status of each task in a Scaffolder Job @@ -43,18 +44,36 @@ export type ScaffolderTask = { }; /** - * The response shape for the `listActions` call to the `scaffolder-backend` + * A single action example * * @public */ -export type ListActionsResponse = Array<{ +export type ActionExample = { + description: string; + example: string; +}; + +/** + * The response shape for a single action in the `listActions` call to the `scaffolder-backend` + * + * @public + */ +export type Action = { id: string; description?: string; schema?: { input?: JSONSchema7; output?: JSONSchema7; }; -}>; + examples?: ActionExample[]; +}; + +/** + * The response shape for the `listActions` call to the `scaffolder-backend` + * + * @public + */ +export type ListActionsResponse = Array; /** @public */ export type ScaffolderOutputLink = { @@ -71,22 +90,6 @@ export type ScaffolderTaskOutput = { [key: string]: unknown; }; -/** - * The shape of each entry of parameters which gets rendered - * as a separate step in the wizard input - * - * @public - */ -export type TemplateParameterSchema = { - title: string; - description?: string; - steps: Array<{ - title: string; - description?: string; - schema: JsonObject; - }>; -}; - /** * The shape of a `LogEvent` message from the `scaffolder-backend` * @@ -171,7 +174,6 @@ export interface ScaffolderDryRunResponse { steps: TaskStep[]; output: ScaffolderTaskOutput; } - /** * An API to interact with the scaffolder backend. * diff --git a/plugins/scaffolder/src/extensions/index.tsx b/plugins/scaffolder-react/src/extensions/index.tsx similarity index 62% rename from plugins/scaffolder/src/extensions/index.tsx rename to plugins/scaffolder-react/src/extensions/index.tsx index a3a4fdf57b..33442f6697 100644 --- a/plugins/scaffolder/src/extensions/index.tsx +++ b/plugins/scaffolder-react/src/extensions/index.tsx @@ -20,19 +20,12 @@ import { CustomFieldValidator, FieldExtensionOptions, FieldExtensionComponentProps, - NextCustomFieldValidator, - NextFieldExtensionOptions, - NextFieldExtensionComponentProps, } from './types'; import { Extension, attachComponentData } from '@backstage/core-plugin-api'; -import { UIOptionsType } from '@rjsf/utils'; - -export const FIELD_EXTENSION_WRAPPER_KEY = 'scaffolder.extensions.wrapper.v1'; -export const FIELD_EXTENSION_KEY = 'scaffolder.extensions.field.v1'; +import { FIELD_EXTENSION_KEY, FIELD_EXTENSION_WRAPPER_KEY } from './keys'; /** * A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps - * * @public */ export type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null; @@ -63,39 +56,14 @@ export function createScaffolderFieldExtension< }; } -/** - * Method for creating field extensions that can be used in the scaffolder - * frontend form. - * @alpha - */ -export function createNextScaffolderFieldExtension< - TReturnValue = unknown, - TInputProps extends UIOptionsType = {}, ->( - options: NextFieldExtensionOptions, -): Extension> { - return { - expose() { - const FieldExtensionDataHolder: any = () => null; - - attachComponentData( - FieldExtensionDataHolder, - FIELD_EXTENSION_KEY, - options, - ); - - return FieldExtensionDataHolder; - }, - }; -} - /** * The Wrapping component for defining fields extensions inside * * @public */ -export const ScaffolderFieldExtensions: React.ComponentType = - (): JSX.Element | null => null; +export const ScaffolderFieldExtensions: React.ComponentType< + React.PropsWithChildren<{}> +> = (): JSX.Element | null => null; attachComponentData( ScaffolderFieldExtensions, @@ -108,9 +76,4 @@ export type { CustomFieldValidator, FieldExtensionOptions, FieldExtensionComponentProps, - NextCustomFieldValidator, - NextFieldExtensionOptions, - NextFieldExtensionComponentProps, }; - -export { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from './default'; diff --git a/plugins/scaffolder-react/src/extensions/keys.ts b/plugins/scaffolder-react/src/extensions/keys.ts new file mode 100644 index 0000000000..f035e9c1c2 --- /dev/null +++ b/plugins/scaffolder-react/src/extensions/keys.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const FIELD_EXTENSION_WRAPPER_KEY = 'scaffolder.extensions.wrapper.v1'; +/** + * The key used to store the field extension data for any `` component + */ +export const FIELD_EXTENSION_KEY = 'scaffolder.extensions.field.v1'; diff --git a/plugins/scaffolder-react/src/extensions/types.ts b/plugins/scaffolder-react/src/extensions/types.ts new file mode 100644 index 0000000000..a9ed854afa --- /dev/null +++ b/plugins/scaffolder-react/src/extensions/types.ts @@ -0,0 +1,72 @@ +/* + * 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 { ApiHolder } from '@backstage/core-plugin-api'; +import { FieldValidation, FieldProps } from '@rjsf/core'; +import { JSONSchema7 } from 'json-schema'; + +/** + * Field validation type for Custom Field Extensions. + * + * @public + */ +export type CustomFieldValidator = ( + data: TFieldReturnValue, + field: FieldValidation, + context: { apiHolder: ApiHolder }, +) => void | Promise; + +/** + * Type for the Custom Field Extension schema. + * + * @public + */ +export type CustomFieldExtensionSchema = { + returnValue: JSONSchema7; + uiOptions?: JSONSchema7; +}; + +/** + * Type for the Custom Field Extension with the + * name and components and validation function. + * + * @public + */ +export type FieldExtensionOptions< + TFieldReturnValue = unknown, + TInputProps = unknown, +> = { + name: string; + component: ( + props: FieldExtensionComponentProps, + ) => JSX.Element | null; + validation?: CustomFieldValidator; + schema?: CustomFieldExtensionSchema; +}; + +/** + * Type for field extensions and being able to type + * incoming props easier. + * + * @public + */ +export interface FieldExtensionComponentProps< + TFieldReturnValue, + TUiOptions extends {} = {}, +> extends FieldProps { + uiSchema: FieldProps['uiSchema'] & { + 'ui:options'?: TUiOptions; + }; +} diff --git a/plugins/scaffolder-react/src/hooks/index.ts b/plugins/scaffolder-react/src/hooks/index.ts new file mode 100644 index 0000000000..022fe7c38c --- /dev/null +++ b/plugins/scaffolder-react/src/hooks/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { useCustomFieldExtensions } from './useCustomFieldExtensions'; diff --git a/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts new file mode 100644 index 0000000000..7e0aafd53f --- /dev/null +++ b/plugins/scaffolder-react/src/hooks/useCustomFieldExtensions.ts @@ -0,0 +1,41 @@ +/* + * 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 { useElementFilter } from '@backstage/core-plugin-api'; +import { FieldExtensionOptions } from '../extensions'; +import { + FIELD_EXTENSION_KEY, + FIELD_EXTENSION_WRAPPER_KEY, +} from '../extensions/keys'; + +/** + * Hook that returns all custom field extensions from the current outlet. + * @public + */ +export const useCustomFieldExtensions = < + TComponentDataType = FieldExtensionOptions, +>( + outlet: React.ReactNode, +) => { + return useElementFilter(outlet, elements => + elements + .selectByComponentData({ + key: FIELD_EXTENSION_WRAPPER_KEY, + }) + .findComponentData({ + key: FIELD_EXTENSION_KEY, + }), + ); +}; diff --git a/plugins/scaffolder-react/src/index.ts b/plugins/scaffolder-react/src/index.ts new file mode 100644 index 0000000000..41a1298b37 --- /dev/null +++ b/plugins/scaffolder-react/src/index.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './extensions'; +export * from './types'; +export * from './secrets'; +export * from './api'; +export * from './hooks'; + +export * from './next'; +export type { FormProps } from './next'; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/ReviewState.test.tsx b/plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.test.tsx similarity index 98% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/ReviewState.test.tsx rename to plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.test.tsx index c03df8f73c..0f56a32d1d 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/ReviewState.test.tsx +++ b/plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.test.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { ReviewState } from './ReviewState'; import { render } from '@testing-library/react'; -import { ParsedTemplateSchema } from './useTemplateSchema'; +import { ParsedTemplateSchema } from '../../hooks/useTemplateSchema'; describe('ReviewState', () => { it('should render the text as normal with no options', () => { diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/ReviewState.tsx b/plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.tsx similarity index 87% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/ReviewState.tsx rename to plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.tsx index f39a26622a..52ad80c4c2 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/ReviewState.tsx +++ b/plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.tsx @@ -16,14 +16,22 @@ import React from 'react'; import { StructuredMetadataTable } from '@backstage/core-components'; import { JsonObject } from '@backstage/types'; -import { ParsedTemplateSchema } from './useTemplateSchema'; import { Draft07 as JSONSchema } from 'json-schema-library'; +import { ParsedTemplateSchema } from '../../hooks/useTemplateSchema'; -interface ReviewStateProps { +/** + * The props for the {@link ReviewState} component. + * @alpha + */ +export type ReviewStateProps = { schemas: ParsedTemplateSchema[]; formState: JsonObject; -} +}; +/** + * The component used by the {@link Stepper} to render the review step. + * @alpha + */ export const ReviewState = (props: ReviewStateProps) => { const reviewData = Object.fromEntries( Object.entries(props.formState).map(([key, value]) => { diff --git a/plugins/scaffolder-react/src/next/components/ReviewState/index.ts b/plugins/scaffolder-react/src/next/components/ReviewState/index.ts new file mode 100644 index 0000000000..1bde4685d8 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/ReviewState/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { ReviewState, type ReviewStateProps } from './ReviewState'; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.test.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx similarity index 63% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.test.tsx rename to plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx index af86abf1c6..5dbce3243f 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.test.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx @@ -20,6 +20,7 @@ import { renderInTestApp } from '@backstage/test-utils'; import { act, fireEvent } from '@testing-library/react'; import type { RJSFValidationError } from '@rjsf/utils'; import { JsonValue } from '@backstage/types'; +import { NextFieldExtensionComponentProps } from '../../extensions'; describe('Stepper', () => { it('should render the step titles for each step of the manifest', async () => { @@ -32,7 +33,7 @@ describe('Stepper', () => { }; const { getByText } = await renderInTestApp( - , + , ); for (const step of manifest.steps) { @@ -50,7 +51,7 @@ describe('Stepper', () => { }; const { getByRole } = await renderInTestApp( - , + , ); expect(getByRole('button', { name: 'Next' })).toBeInTheDocument(); @@ -90,7 +91,7 @@ describe('Stepper', () => { }; const { getByRole } = await renderInTestApp( - , + , ); await fireEvent.change(getByRole('textbox', { name: 'name' }), { @@ -110,6 +111,98 @@ describe('Stepper', () => { ); }); + it('should merge nested formData correctly in multiple steps', async () => { + const Repo = ({ + onChange, + }: NextFieldExtensionComponentProps<{ repository: string }, any>) => ( + onChange({ repository: e.target.value })} + defaultValue="" + /> + ); + + const Owner = ({ + onChange, + }: NextFieldExtensionComponentProps<{ owner: string }, any>) => ( + onChange({ owner: e.target.value })} + defaultValue="" + /> + ); + + const manifest: TemplateParameterSchema = { + steps: [ + { + title: 'Step 1', + schema: { + properties: { + first: { + type: 'object', + 'ui:field': 'Repo', + }, + }, + }, + }, + { + title: 'Step 2', + schema: { + properties: { + second: { + type: 'object', + 'ui:field': 'Owner', + }, + }, + }, + }, + ], + title: 'React JSON Schema Form Test', + }; + + const onCreate = jest.fn(async (values: Record) => { + expect(values).toEqual({ + first: { repository: 'Repo' }, + second: { owner: 'Owner' }, + }); + }); + + const { getByRole } = await renderInTestApp( + , + ); + + await fireEvent.change(getByRole('textbox', { name: 'repo' }), { + target: { value: 'Repo' }, + }); + + await act(async () => { + await fireEvent.click(getByRole('button', { name: 'Next' })); + }); + + await fireEvent.change(getByRole('textbox', { name: 'owner' }), { + target: { value: 'Owner' }, + }); + + await act(async () => { + await fireEvent.click(getByRole('button', { name: 'Review' })); + }); + + await act(async () => { + await fireEvent.click(getByRole('button', { name: 'Create' })); + }); + + expect(onCreate).toHaveBeenCalled(); + }); + it('should render custom field extensions properly', async () => { const MockComponent = () => { return

im a custom field extension

; @@ -136,7 +229,7 @@ describe('Stepper', () => { , ); @@ -173,7 +266,7 @@ describe('Stepper', () => { , ); @@ -215,7 +308,7 @@ describe('Stepper', () => { }); const { getByRole } = await renderInTestApp( - , + , ); expect(getByRole('textbox', { name: 'firstName' })).toHaveValue('John'); @@ -238,12 +331,12 @@ describe('Stepper', () => { title: 'initialize formData', }; - const onComplete = jest.fn(async (values: Record) => { + const onCreate = jest.fn(async (values: Record) => { expect(values).toHaveProperty('firstName'); }); const { getByRole } = await renderInTestApp( - , + , ); await act(async () => { @@ -259,4 +352,44 @@ describe('Stepper', () => { // flush promises return new Promise(process.nextTick); }); + + it('should override the Create and Review button text', async () => { + const manifest: TemplateParameterSchema = { + title: 'Custom Fields', + steps: [ + { + title: 'Test', + schema: { + properties: { + name: { + type: 'string', + }, + }, + }, + }, + ], + }; + + const { getByRole } = await renderInTestApp( + Make, + reviewButtonText: Inspect, + }} + />, + ); + + await act(async () => { + await fireEvent.click(getByRole('button', { name: 'Inspect' })); + }); + + expect(getByRole('button', { name: 'Make' })).toBeInTheDocument(); + + await act(async () => { + await fireEvent.click(getByRole('button', { name: 'Make' })); + }); + }); }); diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx similarity index 73% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.tsx rename to plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index 3d5cb1bfd2..950c9720de 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -13,11 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - useAnalytics, - useApiHolder, - useRouteRefParams, -} from '@backstage/core-plugin-api'; +import { useAnalytics, useApiHolder } from '@backstage/core-plugin-api'; import { JsonValue } from '@backstage/types'; import { Stepper as MuiStepper, @@ -26,19 +22,17 @@ import { Button, makeStyles, } from '@material-ui/core'; -import { withTheme } from '@rjsf/core-v5'; +import { type IChangeEvent, withTheme } from '@rjsf/core-v5'; import { ErrorSchema, FieldValidation } from '@rjsf/utils'; -import React, { useMemo, useState } from 'react'; -import { NextFieldExtensionOptions } from '../../../extensions'; +import React, { useCallback, useMemo, useState, type ReactNode } from 'react'; +import { NextFieldExtensionOptions } from '../../extensions'; import { TemplateParameterSchema } from '../../../types'; import { createAsyncValidators } from './createAsyncValidators'; -import { useTemplateSchema } from './useTemplateSchema'; -import { ReviewState } from './ReviewState'; +import type { FormProps } from '../../types'; +import { ReviewState, type ReviewStateProps } from '../ReviewState'; +import { useTemplateSchema } from '../../hooks/useTemplateSchema'; +import { useFormDataFromQuery } from '../../hooks/useFormDataFromQuery'; import validator from '@rjsf/validator-ajv6'; -import { selectedTemplateRouteRef } from '../../../routes'; -import { getDefaultFormState } from '@rjsf/utils'; -import { useFormData } from './useFormData'; -import { FormProps } from '../../types'; const useStyles = makeStyles(theme => ({ backButton: { @@ -55,11 +49,22 @@ const useStyles = makeStyles(theme => ({ }, })); +/** + * The Props for {@link Stepper} component + * @alpha + */ export type StepperProps = { manifest: TemplateParameterSchema; extensions: NextFieldExtensionOptions[]; - onComplete: (values: Record) => Promise; + templateName?: string; FormProps?: FormProps; + initialState?: Record; + onCreate: (values: Record) => Promise; + components?: { + ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element; + createButtonText?: ReactNode; + reviewButtonText?: ReactNode; + }; }; // TODO(blam): We require here, as the types in this package depend on @rjsf/core explicitly @@ -67,13 +72,24 @@ export type StepperProps = { // of the re-writing we're doing. Once we've migrated, we can import this the exact same as before. const Form = withTheme(require('@rjsf/material-ui-v5').Theme); -export const Stepper = (props: StepperProps) => { - const { templateName } = useRouteRefParams(selectedTemplateRouteRef); +/** + * The `Stepper` component is the Wizard that is rendered when a user selects a template + * @alpha + */ + +export const Stepper = (stepperProps: StepperProps) => { + const { components = {}, ...props } = stepperProps; + const { + ReviewStateComponent = ReviewState, + createButtonText = 'Create', + reviewButtonText = 'Review', + } = components; + const analytics = useAnalytics(); const { steps } = useTemplateSchema(props.manifest); const apiHolder = useApiHolder(); const [activeStep, setActiveStep] = useState(0); - const [formState, setFormState] = useFormData(); + const [formState, setFormState] = useFormDataFromQuery(props.initialState); const [errors, setErrors] = useState< undefined | Record @@ -102,6 +118,12 @@ export const Stepper = (props: StepperProps) => { setActiveStep(prevActiveStep => prevActiveStep - 1); }; + const handleChange = useCallback( + (e: IChangeEvent) => + setFormState(current => ({ ...current, ...e.formData })), + [setFormState], + ); + const handleNext = async ({ formData, }: { @@ -111,18 +133,7 @@ export const Stepper = (props: StepperProps) => { // to display it's own loading? Or should we grey out the entire form. setErrors(undefined); - const schema = steps[activeStep]?.schema; - const rootSchema = steps[activeStep]?.mergedSchema; - - const newFormData = getDefaultFormState( - validator, - schema, - formData, - rootSchema, - true, - ); - - const returnedValidation = await validation(newFormData); + const returnedValidation = await validation(formData); const hasErrors = Object.values(returnedValidation).some( i => i.__errors?.length, @@ -138,7 +149,7 @@ export const Stepper = (props: StepperProps) => { return stepNum; }); } - setFormState(current => ({ ...current, ...newFormData })); + setFormState(current => ({ ...current, ...formData })); }; return ( @@ -165,6 +176,7 @@ export const Stepper = (props: StepperProps) => { onSubmit={handleNext} fields={extensions} showErrorList={false} + onChange={handleChange} {...(props.FormProps ?? {})} >
@@ -176,13 +188,13 @@ export const Stepper = (props: StepperProps) => { Back
) : ( <> - +
diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/createAsyncValidators.test.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts similarity index 98% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/createAsyncValidators.test.ts rename to plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts index a4a937e6fe..6ad14e3cc4 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/createAsyncValidators.test.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { JsonObject } from '@backstage/types'; -import { NextCustomFieldValidator } from '../../../extensions'; +import { NextCustomFieldValidator } from '../../extensions'; import { createAsyncValidators } from './createAsyncValidators'; describe('createAsyncValidators', () => { diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/createAsyncValidators.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts similarity index 94% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/createAsyncValidators.ts rename to plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts index 6483ce2393..79466ee602 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/createAsyncValidators.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts @@ -17,9 +17,9 @@ import { FieldValidation } from '@rjsf/utils'; import { JsonObject } from '@backstage/types'; import { ApiHolder } from '@backstage/core-plugin-api'; -import { NextCustomFieldValidator } from '../../../extensions'; import { Draft07 as JSONSchema } from 'json-schema-library'; -import { createFieldValidation } from './schema'; +import { createFieldValidation } from '../../lib'; +import { NextCustomFieldValidator } from '../../extensions'; export const createAsyncValidators = ( rootSchema: JsonObject, diff --git a/plugins/scaffolder-react/src/next/components/Stepper/index.ts b/plugins/scaffolder-react/src/next/components/Stepper/index.ts new file mode 100644 index 0000000000..daa47f078e --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/Stepper/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { Stepper, type StepperProps } from './Stepper'; diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardHeader.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/CardHeader.test.tsx similarity index 100% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardHeader.test.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/CardHeader.test.tsx diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardHeader.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/CardHeader.tsx similarity index 100% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardHeader.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/CardHeader.tsx diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardLink.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/CardLink.tsx similarity index 100% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardLink.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/CardLink.tsx diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx similarity index 91% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.test.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx index 4648d47af1..2d5b203cfb 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx @@ -25,9 +25,9 @@ import { } from '@backstage/test-utils'; import { TemplateCard } from './TemplateCard'; import React from 'react'; -import { nextRouteRef } from '../../../routes'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { RELATION_OWNED_BY } from '@backstage/catalog-model'; +import { fireEvent } from '@testing-library/react'; describe('TemplateCard', () => { it('should render the card title', async () => { @@ -54,7 +54,6 @@ describe('TemplateCard', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, ); expect(getByText('bob')).toBeInTheDocument(); @@ -84,7 +83,6 @@ describe('TemplateCard', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, ); const description = getByText('hello'); @@ -115,7 +113,6 @@ describe('TemplateCard', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, ); expect(getByText('No description')).toBeInTheDocument(); @@ -145,7 +142,6 @@ describe('TemplateCard', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, ); for (const tag of mockTemplate.metadata.tags!) { @@ -185,7 +181,6 @@ describe('TemplateCard', () => { , { mountedRoutes: { - '/': nextRouteRef, '/catalog/:kind/:namespace/:name': entityRouteRef, }, }, @@ -198,7 +193,7 @@ describe('TemplateCard', () => { ); }); - it('should render the choose button to navigate to the selected template', async () => { + it('should call the onSelected handler when clicking the choose button', async () => { const mockTemplate: TemplateEntityV1beta3 = { apiVersion: 'scaffolder.backstage.io/v1beta3', kind: 'Template', @@ -208,6 +203,7 @@ describe('TemplateCard', () => { type: 'service', }, }; + const mockOnSelected = jest.fn(); const { getByRole } = await renderInTestApp( { ], ]} > - + , { mountedRoutes: { - '/': nextRouteRef, '/catalog/:kind/:namespace/:name': entityRouteRef, }, }, ); expect(getByRole('button', { name: 'Choose' })).toBeInTheDocument(); - expect(getByRole('button', { name: 'Choose' })).toHaveAttribute( - 'href', - '/templates/default/bob', - ); + + fireEvent.click(getByRole('button', { name: 'Choose' })); + + expect(mockOnSelected).toHaveBeenCalledWith(mockTemplate); }); }); diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx similarity index 74% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx index 67b50ba8d6..6f89808405 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx @@ -13,14 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - DEFAULT_NAMESPACE, - parseEntityRef, - RELATION_OWNED_BY, - stringifyEntityRef, -} from '@backstage/catalog-model'; -import { Button, MarkdownContent, UserIcon } from '@backstage/core-components'; -import { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api'; +import { RELATION_OWNED_BY } from '@backstage/catalog-model'; +import { MarkdownContent, UserIcon } from '@backstage/core-components'; +import { IconComponent, useApp } from '@backstage/core-plugin-api'; import { EntityRefLinks, getEntityRelations, @@ -34,15 +29,12 @@ import { CardContent, Chip, Divider, + Button, Grid, makeStyles, } from '@material-ui/core'; import LanguageIcon from '@material-ui/icons/Language'; import React from 'react'; -import { - nextSelectedTemplateRouteRef, - viewTechDocRouteRef, -} from '../../../routes'; import { CardHeader } from './CardHeader'; import { CardLink } from './CardLink'; @@ -83,48 +75,32 @@ const useStyles = makeStyles(theme => ({ })); /** - * The Props for the Template Card component + * The Props for the {@link TemplateCard} component * @alpha */ export interface TemplateCardProps { template: TemplateEntityV1beta3; - deprecated?: boolean; + additionalLinks?: { + icon: IconComponent; + text: string; + url: string; + }[]; + + onSelected?: (template: TemplateEntityV1beta3) => void; } /** - * The Template Card component that is rendered in a list for each template + * The `TemplateCard` component that is rendered in a list for each template * @alpha */ export const TemplateCard = (props: TemplateCardProps) => { const { template } = props; const styles = useStyles(); const ownedByRelations = getEntityRelations(template, RELATION_OWNED_BY); - const templateRoute = useRouteRef(nextSelectedTemplateRouteRef); - const { name, namespace } = parseEntityRef( - stringifyEntityRef(props.template), - ); - const href = templateRoute({ - templateName: name, - namespace: namespace, - }); - const app = useApp(); const iconResolver = (key?: string): IconComponent => key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon; - // TechDocs Link - const viewTechDoc = useRouteRef(viewTechDocRouteRef); - const viewTechDocsAnnotation = - template.metadata.annotations?.['backstage.io/techdocs-ref']; - const viewTechDocsLink = - !!viewTechDocsAnnotation && - !!viewTechDoc && - viewTechDoc({ - namespace: template.metadata.namespace || DEFAULT_NAMESPACE, - kind: template.kind, - name: template.metadata.name, - }); - return ( @@ -159,22 +135,18 @@ export const TemplateCard = (props: TemplateCardProps) => { )} - {(!!viewTechDocsLink || template.metadata.links?.length) && ( + {(props.additionalLinks || template.metadata.links?.length) && ( <> - {viewTechDocsLink && ( + {props.additionalLinks?.map(({ icon, text, url }) => ( - + - )} + ))} {template.metadata.links?.map(({ url, icon, title }) => ( { )}
- diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/index.ts b/plugins/scaffolder-react/src/next/components/TemplateCard/index.ts new file mode 100644 index 0000000000..529aa938e4 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { TemplateCard, type TemplateCardProps } from './TemplateCard'; diff --git a/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.test.tsx new file mode 100644 index 0000000000..02756839c9 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.test.tsx @@ -0,0 +1,176 @@ +/* + * 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. + */ +jest.mock('../TemplateCard', () => ({ TemplateCard: jest.fn(() => null) })); + +import React from 'react'; +import { TemplateGroup } from './TemplateGroup'; +import { render } from '@testing-library/react'; +import { TemplateCard } from '../TemplateCard'; +import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; + +describe('TemplateGroup', () => { + it('should return a message when no templates are passed in', async () => { + const { getByText } = render( + , + ); + + expect( + getByText(/No templates found that match your filter/), + ).toBeInTheDocument(); + }); + + it('should render a card for each template with the template being passed as a prop', () => { + const mockOnSelected = jest.fn(); + const mockTemplates: { template: TemplateEntityV1beta3 }[] = [ + { + template: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { name: 'test' }, + spec: { + parameters: [], + steps: [], + type: 'website', + }, + }, + }, + { + template: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { name: 'test2' }, + spec: { + parameters: [], + steps: [], + type: 'service', + }, + }, + }, + ]; + + render( + , + ); + + expect(TemplateCard).toHaveBeenCalledTimes(2); + + for (const { template } of mockTemplates) { + expect(TemplateCard).toHaveBeenCalledWith( + expect.objectContaining({ template, onSelected: mockOnSelected }), + {}, + ); + } + }); + + it('should use the passed in TemplateCard prop to render the template card', () => { + const mockTemplateCardComponent = jest.fn(() => null); + const mockOnSelected = jest.fn(); + const mockTemplates: { template: TemplateEntityV1beta3 }[] = [ + { + template: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { name: 'test' }, + spec: { + parameters: [], + steps: [], + type: 'website', + }, + }, + }, + { + template: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { name: 'test2' }, + spec: { + parameters: [], + steps: [], + type: 'service', + }, + }, + }, + ]; + + render( + , + ); + + expect(mockTemplateCardComponent).toHaveBeenCalledTimes(2); + + for (const { template } of mockTemplates) { + expect(mockTemplateCardComponent).toHaveBeenCalledWith( + expect.objectContaining({ + onSelected: mockOnSelected, + template, + }), + {}, + ); + } + }); + + it('should render the title when no templates passed', () => { + const { getByText } = render( + , + ); + expect(getByText('Test')).toBeInTheDocument(); + }); + + it('should render the title when there are templates in the list', () => { + const mockTemplates: { template: TemplateEntityV1beta3 }[] = [ + { + template: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { name: 'test' }, + spec: { parameters: [], steps: [], type: 'website' }, + }, + }, + ]; + + const { getByText } = render( + , + ); + + expect(getByText('Test')).toBeInTheDocument(); + }); + + it('should allow for passing through a user given title component', () => { + const TitleComponent =

Im a custom header

; + const { getByText } = render( + , + ); + + expect(getByText('Im a custom header')).toBeInTheDocument(); + }); +}); diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.tsx similarity index 67% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.tsx rename to plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.tsx index 4344c195ae..8134ea256d 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.tsx @@ -22,19 +22,41 @@ import { Link, } from '@backstage/core-components'; import { Typography } from '@material-ui/core'; -import { TemplateCard, TemplateCardProps } from './TemplateCard'; import { stringifyEntityRef } from '@backstage/catalog-model'; +import { TemplateCardProps, TemplateCard } from '../TemplateCard'; +import { IconComponent } from '@backstage/core-plugin-api'; +/** + * The props for the {@link TemplateGroup} component. + * @alpha + */ export interface TemplateGroupProps { - templates: TemplateEntityV1beta3[]; + templates: { + template: TemplateEntityV1beta3; + additionalLinks?: { + icon: IconComponent; + text: string; + url: string; + }[]; + }[]; + onSelected: (template: TemplateEntityV1beta3) => void; title: React.ReactNode; components?: { CardComponent?: React.ComponentType; }; } +/** + * The `TemplateGroup` component is used to display a group of templates with a title. + * @alpha + */ export const TemplateGroup = (props: TemplateGroupProps) => { - const { templates, title, components: { CardComponent } = {} } = props; + const { + templates, + title, + components: { CardComponent } = {}, + onSelected, + } = props; const titleComponent = typeof title === 'string' ? : title; @@ -59,8 +81,13 @@ export const TemplateGroup = (props: TemplateGroupProps) => { {titleComponent} - {templates.map(template => ( - + {templates.map(({ template, additionalLinks }) => ( + ))} diff --git a/plugins/scaffolder-react/src/next/components/TemplateGroup/index.ts b/plugins/scaffolder-react/src/next/components/TemplateGroup/index.ts new file mode 100644 index 0000000000..3fd27c84ed --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateGroup/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { TemplateGroup, type TemplateGroupProps } from './TemplateGroup'; diff --git a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx new file mode 100644 index 0000000000..03604881d2 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx @@ -0,0 +1,144 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ApiProvider } from '@backstage/core-app-api'; +import { + MockAnalyticsApi, + renderInTestApp, + TestApiRegistry, +} from '@backstage/test-utils'; +import { act, fireEvent } from '@testing-library/react'; +import React from 'react'; +import { Workflow } from './Workflow'; +import { analyticsApiRef } from '@backstage/core-plugin-api'; +import { ScaffolderApi } from '../../../api/types'; +import { scaffolderApiRef } from '../../../api/ref'; + +const scaffolderApiMock: jest.Mocked = { + scaffold: jest.fn(), + getTemplateParameterSchema: jest.fn(), + getIntegrationsList: jest.fn(), + getTask: jest.fn(), + streamLogs: jest.fn(), + listActions: jest.fn(), + listTasks: jest.fn(), +}; + +const analyticsMock = new MockAnalyticsApi(); +const apis = TestApiRegistry.from( + [scaffolderApiRef, scaffolderApiMock], + [analyticsApiRef, analyticsMock], +); + +describe('', () => { + it('should complete a workflow', async () => { + const onCreate = jest.fn(); + const onError = jest.fn(); + scaffolderApiMock.scaffold.mockResolvedValue({ taskId: 'xyz' }); + + scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue({ + steps: [ + { + title: 'Step 1', + schema: { + properties: { + name: { + type: 'string', + }, + }, + }, + }, + { + title: 'Step 2', + schema: { + properties: { + age: { + type: 'string', + }, + }, + }, + }, + ], + title: 'React JSON Schema Form Test', + }); + + const { getByRole, getAllByRole, getByText } = await renderInTestApp( + + ( +

This is a different wrapper for the review page

+ ), + reviewButtonText: Onwards, + createButtonText: Make, + }} + extensions={[]} + /> +
, + ); + + // Test template title is overriden + expect(getByRole('heading', { level: 2 }).innerHTML).toBe( + 'Different title than template', + ); + + const nameInput = getByRole('textbox', { + name: 'name', + }) as HTMLInputElement; + + expect(nameInput).toBeInTheDocument(); + + expect(nameInput.value).toBe('prefilled-name'); + + await act(async () => { + fireEvent.click(getByRole('button', { name: 'Next' })); + }); + + const ageInput = getByRole('textbox', { name: 'age' }) as HTMLInputElement; + + expect(ageInput.value).toBe('53'); + + await act(async () => { + fireEvent.click(getByRole('button', { name: 'Onwards' })); + }); + + expect( + getByText('This is a different wrapper for the review page'), + ).toBeDefined(); + + await act(async () => { + fireEvent.click(getAllByRole('button')[1] as HTMLButtonElement); + }); + + expect(onCreate).toHaveBeenCalledWith({ + name: 'prefilled-name', + age: '53', + }); + }); +}); diff --git a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.tsx b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.tsx new file mode 100644 index 0000000000..cca69ab7b3 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.tsx @@ -0,0 +1,114 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { useEffect } from 'react'; +import { + Content, + InfoCard, + MarkdownContent, + Progress, +} from '@backstage/core-components'; +import { stringifyEntityRef } from '@backstage/catalog-model'; +import { makeStyles } from '@material-ui/core'; +import { BackstageTheme } from '@backstage/theme'; +import { errorApiRef, useApi } from '@backstage/core-plugin-api'; +import { useTemplateParameterSchema } from '../../hooks/useTemplateParameterSchema'; +import { Stepper, type StepperProps } from '../Stepper/Stepper'; +import { SecretsContextProvider } from '../../../secrets/SecretsContext'; + +const useStyles = makeStyles(() => ({ + markdown: { + /** to make the styles for React Markdown not leak into the description */ + '& :first-child': { + marginTop: 0, + }, + '& :last-child': { + marginBottom: 0, + }, + }, +})); + +/** + * @alpha + */ +export type WorkflowProps = { + title?: string; + description?: string; + namespace: string; + templateName: string; + onError(error: Error | undefined): JSX.Element | null; +} & Pick< + StepperProps, + 'extensions' | 'FormProps' | 'components' | 'onCreate' | 'initialState' +>; + +/** + * @alpha + */ +export const Workflow = (workflowProps: WorkflowProps): JSX.Element | null => { + const { title, description, namespace, templateName, ...props } = + workflowProps; + + const styles = useStyles(); + const templateRef = stringifyEntityRef({ + kind: 'Template', + namespace: namespace, + name: templateName, + }); + + const errorApi = useApi(errorApiRef); + + const { loading, manifest, error } = useTemplateParameterSchema(templateRef); + + useEffect(() => { + if (error) { + errorApi.post(new Error(`Failed to load template, ${error}`)); + } + }, [error, errorApi]); + + if (error) { + return props.onError(error); + } + + return ( + + {loading && } + {manifest && ( + + } + noPadding + titleTypographyProps={{ component: 'h2' }} + > + + + )} + + ); +}; + +/** + * @alpha + */ +export const EmbeddableWorkflow = (props: WorkflowProps) => ( + + + +); diff --git a/plugins/scaffolder-react/src/next/components/Workflow/index.ts b/plugins/scaffolder-react/src/next/components/Workflow/index.ts new file mode 100644 index 0000000000..193a6417fc --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/Workflow/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { Workflow, EmbeddableWorkflow, type WorkflowProps } from './Workflow'; diff --git a/plugins/scaffolder-react/src/next/components/index.ts b/plugins/scaffolder-react/src/next/components/index.ts new file mode 100644 index 0000000000..babe3b4dcb --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './Stepper'; +export * from './TemplateCard'; +export * from './ReviewState'; +export * from './TemplateGroup'; +export * from './Workflow'; diff --git a/plugins/scaffolder-react/src/next/extensions/index.tsx b/plugins/scaffolder-react/src/next/extensions/index.tsx new file mode 100644 index 0000000000..ee9b1cd326 --- /dev/null +++ b/plugins/scaffolder-react/src/next/extensions/index.tsx @@ -0,0 +1,57 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + NextCustomFieldValidator, + NextFieldExtensionOptions, + NextFieldExtensionComponentProps, +} from './types'; +import { Extension, attachComponentData } from '@backstage/core-plugin-api'; +import { UIOptionsType } from '@rjsf/utils'; +import { FieldExtensionComponent } from '../../extensions'; +import { FIELD_EXTENSION_KEY } from '../../extensions/keys'; + +/** + * Method for creating field extensions that can be used in the scaffolder + * frontend form. + * @alpha + */ +export function createNextScaffolderFieldExtension< + TReturnValue = unknown, + TInputProps extends UIOptionsType = {}, +>( + options: NextFieldExtensionOptions, +): Extension> { + return { + expose() { + const FieldExtensionDataHolder: any = () => null; + + attachComponentData( + FieldExtensionDataHolder, + FIELD_EXTENSION_KEY, + options, + ); + + return FieldExtensionDataHolder; + }, + }; +} + +export type { + NextCustomFieldValidator, + NextFieldExtensionOptions, + NextFieldExtensionComponentProps, +}; diff --git a/plugins/scaffolder/src/extensions/types.ts b/plugins/scaffolder-react/src/next/extensions/types.ts similarity index 60% rename from plugins/scaffolder/src/extensions/types.ts rename to plugins/scaffolder-react/src/next/extensions/types.ts index 5e133c676b..27778b0420 100644 --- a/plugins/scaffolder/src/extensions/types.ts +++ b/plugins/scaffolder-react/src/next/extensions/types.ts @@ -14,7 +14,6 @@ * limitations under the License. */ import { ApiHolder } from '@backstage/core-plugin-api'; -import { FieldValidation, FieldProps } from '@rjsf/core'; import { UIOptionsType, FieldProps as FieldPropsV5, @@ -22,62 +21,8 @@ import { FieldValidation as FieldValidationV5, } from '@rjsf/utils'; import { PropsWithChildren } from 'react'; -import { JSONSchema7 } from 'json-schema'; import { JsonObject } from '@backstage/types'; - -/** - * Field validation type for Custom Field Extensions. - * - * @public - */ -export type CustomFieldValidator = ( - data: TFieldReturnValue, - field: FieldValidation, - context: { apiHolder: ApiHolder }, -) => void | Promise; - -/** - * Type for the Custom Field Extension schema. - * - * @public - */ -export type CustomFieldExtensionSchema = { - returnValue: JSONSchema7; - uiOptions?: JSONSchema7; -}; - -/** - * Type for the Custom Field Extension with the - * name and components and validation function. - * - * @public - */ -export type FieldExtensionOptions< - TFieldReturnValue = unknown, - TInputProps = unknown, -> = { - name: string; - component: ( - props: FieldExtensionComponentProps, - ) => JSX.Element | null; - validation?: CustomFieldValidator; - schema?: CustomFieldExtensionSchema; -}; - -/** - * Type for field extensions and being able to type - * incoming props easier. - * - * @public - */ -export interface FieldExtensionComponentProps< - TFieldReturnValue, - TUiOptions extends {} = {}, -> extends FieldProps { - uiSchema: FieldProps['uiSchema'] & { - 'ui:options'?: TUiOptions; - }; -} +import { CustomFieldExtensionSchema } from '../../extensions'; /** * Type for Field Extension Props for RJSF v5 diff --git a/plugins/scaffolder-react/src/next/hooks/index.ts b/plugins/scaffolder-react/src/next/hooks/index.ts new file mode 100644 index 0000000000..ca8ce10eff --- /dev/null +++ b/plugins/scaffolder-react/src/next/hooks/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { useFormDataFromQuery } from './useFormDataFromQuery'; +export { + useTemplateSchema, + type ParsedTemplateSchema, +} from './useTemplateSchema'; +export { useTemplateParameterSchema } from './useTemplateParameterSchema'; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useFormData.ts b/plugins/scaffolder-react/src/next/hooks/useFormDataFromQuery.ts similarity index 76% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useFormData.ts rename to plugins/scaffolder-react/src/next/hooks/useFormDataFromQuery.ts index 1500216688..966a8fe8f4 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useFormData.ts +++ b/plugins/scaffolder-react/src/next/hooks/useFormDataFromQuery.ts @@ -14,11 +14,22 @@ * limitations under the License. */ +import { JsonValue } from '@backstage/types'; import qs from 'qs'; import { useState } from 'react'; -export const useFormData = () => { +/** + * This hook is used to get the formData from the query string. + * @alpha + */ +export const useFormDataFromQuery = ( + initialState?: Record, +) => { return useState>(() => { + if (initialState) { + return initialState; + } + const query = qs.parse(window.location.search, { ignoreQueryPrefix: true, }); diff --git a/plugins/scaffolder-react/src/next/hooks/useTemplateParameterSchema.ts b/plugins/scaffolder-react/src/next/hooks/useTemplateParameterSchema.ts new file mode 100644 index 0000000000..36b8b1e0bc --- /dev/null +++ b/plugins/scaffolder-react/src/next/hooks/useTemplateParameterSchema.ts @@ -0,0 +1,32 @@ +import { useApi } from '@backstage/core-plugin-api'; + +/* + * 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 useAsync from 'react-use/lib/useAsync'; +import { scaffolderApiRef } from '../../api/ref'; + +/** + * @alpha + */ +export const useTemplateParameterSchema = (templateRef: string) => { + const scaffolderApi = useApi(scaffolderApiRef); + const { value, loading, error } = useAsync( + () => scaffolderApi.getTemplateParameterSchema(templateRef), + [scaffolderApi, templateRef], + ); + + return { manifest: value, loading, error }; +}; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useTemplateSchema.test.tsx b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx similarity index 99% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useTemplateSchema.test.tsx rename to plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx index 9be6faa0fa..153c48468d 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useTemplateSchema.test.tsx +++ b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { TemplateParameterSchema } from '../../../types'; import { useTemplateSchema } from './useTemplateSchema'; import { renderHook } from '@testing-library/react-hooks'; import { TestApiProvider } from '@backstage/test-utils'; import React from 'react'; import { featureFlagsApiRef } from '@backstage/core-plugin-api'; +import { TemplateParameterSchema } from '../../types'; describe('useTemplateSchema', () => { it('should generate the correct schema', () => { diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useTemplateSchema.ts b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts similarity index 84% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useTemplateSchema.ts rename to plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts index 6aad6baa96..2b2e48cf68 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/useTemplateSchema.ts +++ b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts @@ -16,9 +16,13 @@ import { featureFlagsApiRef, useApi } from '@backstage/core-plugin-api'; import { JsonObject } from '@backstage/types'; import { UiSchema } from '@rjsf/utils'; -import { TemplateParameterSchema } from '../../../types'; -import { extractSchemaFromStep } from './schema'; +import { TemplateParameterSchema } from '../../types'; +import { extractSchemaFromStep } from '../lib'; +/** + * This is the parsed template schema that is returned from the {@link useTemplateSchema} hook. + * @alpha + */ export interface ParsedTemplateSchema { uiSchema: UiSchema; mergedSchema: JsonObject; @@ -26,6 +30,13 @@ export interface ParsedTemplateSchema { title: string; description?: string; } + +/** + * This hook will parse the template schema and return the steps with the + * parsed schema and uiSchema. Filtering out any steps or properties that + * are not enabled with feature flags. + * @alpha + */ export const useTemplateSchema = ( manifest: TemplateParameterSchema, ): { steps: ParsedTemplateSchema[] } => { diff --git a/plugins/scaffolder-react/src/next/index.ts b/plugins/scaffolder-react/src/next/index.ts new file mode 100644 index 0000000000..ea009ea556 --- /dev/null +++ b/plugins/scaffolder-react/src/next/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './components'; +export * from './extensions'; +export type { FormProps } from './types'; +export * from './lib'; +export * from './hooks'; diff --git a/plugins/scaffolder-react/src/next/lib/index.ts b/plugins/scaffolder-react/src/next/lib/index.ts new file mode 100644 index 0000000000..f42c4c8ab3 --- /dev/null +++ b/plugins/scaffolder-react/src/next/lib/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { extractSchemaFromStep, createFieldValidation } from './schema'; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/schema.test.ts b/plugins/scaffolder-react/src/next/lib/schema.test.ts similarity index 100% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/schema.test.ts rename to plugins/scaffolder-react/src/next/lib/schema.test.ts diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/schema.ts b/plugins/scaffolder-react/src/next/lib/schema.ts similarity index 100% rename from plugins/scaffolder/src/next/TemplateWizardPage/Stepper/schema.ts rename to plugins/scaffolder-react/src/next/lib/schema.ts index 4c647bc045..e8b819be4b 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/schema.ts +++ b/plugins/scaffolder-react/src/next/lib/schema.ts @@ -99,8 +99,8 @@ function extractUiSchema(schema: JsonObject, uiSchema: JsonObject) { } /** - * @alpha * Takes a step from a Backstage Template Manifest and converts it to a JSON Schema and UI Schema for rjsf + * @alpha */ export const extractSchemaFromStep = ( inputStep: JsonObject, @@ -112,8 +112,8 @@ export const extractSchemaFromStep = ( }; /** - * @alpha * Creates a field validation object for use in react jsonschema form + * @alpha */ export const createFieldValidation = (): FieldValidation => { const fieldValidation: FieldValidation = { diff --git a/packages/backend-plugin-api/src/services/definitions/pluginMetadataServiceRef.ts b/plugins/scaffolder-react/src/next/types.ts similarity index 69% rename from packages/backend-plugin-api/src/services/definitions/pluginMetadataServiceRef.ts rename to plugins/scaffolder-react/src/next/types.ts index 4c1ecb130e..32d0fe85f0 100644 --- a/packages/backend-plugin-api/src/services/definitions/pluginMetadataServiceRef.ts +++ b/plugins/scaffolder-react/src/next/types.ts @@ -13,21 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { createServiceRef } from '../system/types'; +import type { FormProps as SchemaFormProps } from '@rjsf/core-v5'; /** - * @public + * Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderpage` + * + * @alpha */ -export interface PluginMetadataService { - getId(): string; -} - -/** - * @public - */ -export const pluginMetadataServiceRef = createServiceRef( - { - id: 'core.plugin-metadata', - }, -); +export type FormProps = Pick< + SchemaFormProps, + 'transformErrors' | 'noHtml5Validate' +>; diff --git a/plugins/scaffolder/src/components/secrets/SecretsContext.test.tsx b/plugins/scaffolder-react/src/secrets/SecretsContext.test.tsx similarity index 77% rename from plugins/scaffolder/src/components/secrets/SecretsContext.test.tsx rename to plugins/scaffolder-react/src/secrets/SecretsContext.test.tsx index 3b84c074d7..593fbd908b 100644 --- a/plugins/scaffolder/src/components/secrets/SecretsContext.test.tsx +++ b/plugins/scaffolder-react/src/secrets/SecretsContext.test.tsx @@ -13,12 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useContext } from 'react'; -import { - useTemplateSecrets, - SecretsContextProvider, - SecretsContext, -} from './SecretsContext'; +import React from 'react'; +import { useTemplateSecrets, SecretsContextProvider } from './SecretsContext'; import { renderHook, act } from '@testing-library/react-hooks'; describe('SecretsContext', () => { @@ -26,7 +22,6 @@ describe('SecretsContext', () => { const { result } = renderHook( () => ({ hook: useTemplateSecrets(), - context: useContext(SecretsContext), }), { wrapper: ({ children }) => ( @@ -34,10 +29,10 @@ describe('SecretsContext', () => { ), }, ); - expect(result.current.context?.secrets.foo).toEqual(undefined); + expect(result.current.hook?.secrets.foo).toEqual(undefined); act(() => result.current.hook.setSecrets({ foo: 'bar' })); - expect(result.current.context?.secrets.foo).toEqual('bar'); + expect(result.current.hook?.secrets.foo).toEqual('bar'); }); }); diff --git a/plugins/scaffolder/src/components/secrets/SecretsContext.tsx b/plugins/scaffolder-react/src/secrets/SecretsContext.tsx similarity index 71% rename from plugins/scaffolder/src/components/secrets/SecretsContext.tsx rename to plugins/scaffolder-react/src/secrets/SecretsContext.tsx index b425a72233..af5c2393cd 100644 --- a/plugins/scaffolder/src/components/secrets/SecretsContext.tsx +++ b/plugins/scaffolder-react/src/secrets/SecretsContext.tsx @@ -13,36 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { + createVersionedContext, + createVersionedValueMap, +} from '@backstage/version-bridge'; import React, { useState, useCallback, useContext, - createContext, PropsWithChildren, } from 'react'; +/** + * The contents of the `SecretsContext` + */ type SecretsContextContents = { secrets: Record; setSecrets: React.Dispatch>>; }; /** - * The actual context object. + * The context to hold the Secrets. */ -export const SecretsContext = createContext( - undefined, -); +const SecretsContext = createVersionedContext<{ + 1: SecretsContextContents; +}>('secrets-context'); /** * The Context Provider that holds the state for the secrets. - * * @public */ export const SecretsContextProvider = ({ children }: PropsWithChildren<{}>) => { const [secrets, setSecrets] = useState>({}); return ( - + {children} ); @@ -54,21 +61,24 @@ export const SecretsContextProvider = ({ children }: PropsWithChildren<{}>) => { */ export interface ScaffolderUseTemplateSecrets { setSecrets: (input: Record) => void; + secrets: Record; } /** - * Hook to access the secrets context. + * Hook to access the secrets context to be able to set secrets that are + * passed to the Scaffolder backend. * @public */ export const useTemplateSecrets = (): ScaffolderUseTemplateSecrets => { - const value = useContext(SecretsContext); + const value = useContext(SecretsContext)?.atVersion(1); + if (!value) { throw new Error( 'useTemplateSecrets must be used within a SecretsContextProvider', ); } - const { setSecrets: updateSecrets } = value; + const { setSecrets: updateSecrets, secrets = {} } = value; const setSecrets = useCallback( (input: Record) => { @@ -77,5 +87,5 @@ export const useTemplateSecrets = (): ScaffolderUseTemplateSecrets => { [updateSecrets], ); - return { setSecrets }; + return { setSecrets, secrets }; }; diff --git a/plugins/scaffolder-react/src/secrets/index.ts b/plugins/scaffolder-react/src/secrets/index.ts new file mode 100644 index 0000000000..0b8a09cd97 --- /dev/null +++ b/plugins/scaffolder-react/src/secrets/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { + useTemplateSecrets, + SecretsContextProvider, + type ScaffolderUseTemplateSecrets, +} from './SecretsContext'; diff --git a/plugins/adr/src/hooks/index.ts b/plugins/scaffolder-react/src/setupTests.ts similarity index 94% rename from plugins/adr/src/hooks/index.ts rename to plugins/scaffolder-react/src/setupTests.ts index d5aa102fb8..326d2ed212 100644 --- a/plugins/adr/src/hooks/index.ts +++ b/plugins/scaffolder-react/src/setupTests.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './useOctokitRequest'; +import '@testing-library/jest-dom'; diff --git a/packages/backend-plugin-api/src/services/definitions/configServiceRef.ts b/plugins/scaffolder-react/src/types.ts similarity index 65% rename from packages/backend-plugin-api/src/services/definitions/configServiceRef.ts rename to plugins/scaffolder-react/src/types.ts index 15e9cb9aa6..f644fbeb64 100644 --- a/packages/backend-plugin-api/src/services/definitions/configServiceRef.ts +++ b/plugins/scaffolder-react/src/types.ts @@ -14,18 +14,20 @@ * limitations under the License. */ -import { Config } from '@backstage/config'; -import { createServiceRef } from '../system/types'; +import { JsonObject } from '@backstage/types'; /** + * The shape of each entry of parameters which gets rendered + * as a separate step in the wizard input + * * @public */ -export type ConfigService = Config; - -/** - * @public - */ -export const configServiceRef = createServiceRef({ - id: 'core.root.config', - scope: 'root', -}); +export type TemplateParameterSchema = { + title: string; + description?: string; + steps: Array<{ + title: string; + description?: string; + schema: JsonObject; + }>; +}; diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index e742e2c6ff..0d25838d22 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,259 @@ # @backstage/plugin-scaffolder +## 1.10.0 + +### Minor Changes + +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +- b4955ed7b9: - **Deprecation** - Deprecated the following exports, please import them directly from `@backstage/plugin-scaffolder-react` instead + + ``` + createScaffolderFieldExtension + ScaffolderFieldExtensions + useTemplateSecrets + scaffolderApiRef + ScaffolderApi + ScaffolderUseTemplateSecrets + TemplateParameterSchema + CustomFieldExtensionSchema + CustomFieldValidator + FieldExtensionOptions + FieldExtensionComponentProps + FieldExtensionComponent + ListActionsResponse + LogEvent + ScaffolderDryRunOptions + ScaffolderDryRunResponse + ScaffolderGetIntegrationsListOptions + ScaffolderGetIntegrationsListResponse + ScaffolderOutputlink + ScaffolderScaffoldOptions + ScaffolderScaffoldResponse + ScaffolderStreamLogsOptions + ScaffolderTask + ScaffolderTaskOutput + ScaffolderTaskStatus + ``` + + - **Deprecation** - Deprecated the `rootRouteRef` export, this should now be used from `scaffolderPlugin.routes.root` + + - The following `/alpha` types have removed from this package and moved to the `@backstage/plugin-scaffolder-react/alpha` package + + ``` + createNextScaffolderFieldExtension + FormProps + NextCustomFieldValidator + NextFieldExtensionComponentProps + NextFieldExtensionOptions + ``` + +### Patch Changes + +- 3c112f6967: rollback `@rjsf/validator-ajv8` to `@rjsf/validator-v6` +- 2fadff2a25: Render the scaffolder action description using the `MarkdownContent` component. This will allow the page to show richer content to describe scaffolder actions. +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- 223e2c5f03: add `onChange` handler to`Stepper` component +- 659c92a1dc: Updated dependency `use-immer` to `^0.8.0`. +- 489935d625: Show action example yaml on the scaffolder actions documentation page. +- b8269de9f1: Explicitly declaring children as optional props to facilitate react 18 changes +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-scaffolder-common@1.2.4 + - @backstage/catalog-client@1.3.0 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-scaffolder-react@1.0.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.9 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.10 + +## 1.10.0-next.2 + +### Minor Changes + +- b4955ed7b9: - **Deprecation** - Deprecated the following exports, please import them directly from `@backstage/plugin-scaffolder-react` instead + + ``` + createScaffolderFieldExtension + ScaffolderFieldExtensions + useTemplateSecrets + scaffolderApiRef + ScaffolderApi + ScaffolderUseTemplateSecrets + TemplateParameterSchema + CustomFieldExtensionSchema + CustomFieldValidator + FieldExtensionOptions + FieldExtensionComponentProps + FieldExtensionComponent + ListActionsResponse + LogEvent + ScaffolderDryRunOptions + ScaffolderDryRunResponse + ScaffolderGetIntegrationsListOptions + ScaffolderGetIntegrationsListResponse + ScaffolderOutputlink + ScaffolderScaffoldOptions + ScaffolderScaffoldResponse + ScaffolderStreamLogsOptions + ScaffolderTask + ScaffolderTaskOutput + ScaffolderTaskStatus + ``` + + - **Deprecation** - Deprecated the `rootRouteRef` export, this should now be used from `scaffolderPlugin.routes.root` + + - The following `/alpha` types have removed from this package and moved to the `@backstage/plugin-scaffolder-react/alpha` package + + ``` + createNextScaffolderFieldExtension + FormProps + NextCustomFieldValidator + NextFieldExtensionComponentProps + NextFieldExtensionOptions + ``` + +### Patch Changes + +- 2fadff2a25: Render the scaffolder action description using the `MarkdownContent` component. This will allow the page to show richer content to describe scaffolder actions. +- 659c92a1dc: Updated dependency `use-immer` to `^0.8.0`. +- 489935d625: Show action example yaml on the scaffolder actions documentation page. +- b8269de9f1: Explicitly declaring children as optional props to facilitate react 18 changes +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.0.0-next.0 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/plugin-permission-react@0.4.9-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-react@1.1.9-next.2 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-scaffolder-common@1.2.4-next.1 + +## 1.10.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-react@1.1.9-next.1 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-permission-react@0.4.9-next.0 + - @backstage/plugin-scaffolder-common@1.2.4-next.1 + +## 1.10.0-next.0 + +### Minor Changes + +- e4c0240445: Added `catalogFilter` field to OwnerPicker and EntityPicker components to support filtering options by any field(s) of an entity. + + The `allowedKinds` field has been deprecated. Use `catalogFilter` instead. This field allows users to specify a filter on the shape of [EntityFilterQuery](https://github.com/backstage/backstage/blob/774c42003782121d3d6b2aa5f2865d53370c160e/packages/catalog-client/src/types/api.ts#L74), which can be passed into the CatalogClient. See examples below: + + - Get all entities of kind `Group` + + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + ``` + + - Get entities of kind `Group` and spec.type `team` + ```yaml + owner: + title: Owner + type: string + description: Owner of the component + ui:field: OwnerPicker + ui:options: + catalogFilter: + - kind: Group + spec.type: team + ``` + +### Patch Changes + +- 3c112f6967: rollback `@rjsf/validator-ajv8` to `@rjsf/validator-v6` +- 223e2c5f03: add `onChange` handler to`Stepper` component +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-scaffolder-common@1.2.4-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/integration-react@1.1.9-next.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.10-next.0 + - @backstage/plugin-permission-react@0.4.8 + +## 1.9.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/integration-react@1.1.8 + - @backstage/plugin-catalog-react@1.2.3 + ## 1.9.0 ### Minor Changes diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 3fe1208ba9..82a8dfd8d3 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -9,85 +9,83 @@ import { ApiHolder } from '@backstage/core-plugin-api'; import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { ComponentType } from 'react'; +import { createScaffolderFieldExtension as createScaffolderFieldExtension_2 } from '@backstage/plugin-scaffolder-react'; +import { CustomFieldExtensionSchema as CustomFieldExtensionSchema_2 } from '@backstage/plugin-scaffolder-react'; +import { CustomFieldValidator as CustomFieldValidator_2 } from '@backstage/plugin-scaffolder-react'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; import { Extension } from '@backstage/core-plugin-api'; import { ExternalRouteRef } from '@backstage/core-plugin-api'; import { FetchApi } from '@backstage/core-plugin-api'; -import { FieldProps } from '@rjsf/core'; -import { FieldProps as FieldProps_2 } from '@rjsf/utils'; +import { FieldExtensionComponent as FieldExtensionComponent_2 } from '@backstage/plugin-scaffolder-react'; +import { FieldExtensionComponentProps as FieldExtensionComponentProps_2 } from '@backstage/plugin-scaffolder-react'; +import { FieldExtensionOptions as FieldExtensionOptions_2 } from '@backstage/plugin-scaffolder-react'; import { FieldValidation } from '@rjsf/core'; -import { FieldValidation as FieldValidation_2 } from '@rjsf/utils'; import type { FormProps as FormProps_2 } from '@rjsf/core'; import type { FormProps as FormProps_3 } from '@rjsf/core-v5'; import { IdentityApi } from '@backstage/core-plugin-api'; import { JsonObject } from '@backstage/types'; -import { JSONSchema7 } from 'json-schema'; -import { JsonValue } from '@backstage/types'; +import { ListActionsResponse as ListActionsResponse_2 } from '@backstage/plugin-scaffolder-react'; +import { LogEvent as LogEvent_2 } from '@backstage/plugin-scaffolder-react'; import { Observable } from '@backstage/types'; import { PathParams } from '@backstage/core-plugin-api'; import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; +import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; +import { ScaffolderApi as ScaffolderApi_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderDryRunOptions as ScaffolderDryRunOptions_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderDryRunResponse as ScaffolderDryRunResponse_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderGetIntegrationsListOptions as ScaffolderGetIntegrationsListOptions_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderGetIntegrationsListResponse as ScaffolderGetIntegrationsListResponse_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderOutputLink } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderScaffoldOptions as ScaffolderScaffoldOptions_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderScaffoldResponse as ScaffolderScaffoldResponse_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderStreamLogsOptions as ScaffolderStreamLogsOptions_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderTask as ScaffolderTask_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderTaskOutput as ScaffolderTaskOutput_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderTaskStatus as ScaffolderTaskStatus_2 } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderUseTemplateSecrets as ScaffolderUseTemplateSecrets_2 } from '@backstage/plugin-scaffolder-react'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { SubRouteRef } from '@backstage/core-plugin-api'; -import { TaskSpec } from '@backstage/plugin-scaffolder-common'; -import { TaskStep } from '@backstage/plugin-scaffolder-common'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { UIOptionsType } from '@rjsf/utils'; +import { TemplateParameterSchema as TemplateParameterSchema_2 } from '@backstage/plugin-scaffolder-react'; import { UiSchema } from '@rjsf/utils'; import { z } from 'zod'; -// @alpha -export function createNextScaffolderFieldExtension< - TReturnValue = unknown, - TInputProps extends UIOptionsType = {}, ->( - options: NextFieldExtensionOptions, -): Extension>; - -// @public -export function createScaffolderFieldExtension< - TReturnValue = unknown, - TInputProps = unknown, ->( - options: FieldExtensionOptions, -): Extension>; +// @public @deprecated (undocumented) +export const createScaffolderFieldExtension: typeof createScaffolderFieldExtension_2; // @public export function createScaffolderLayout( options: LayoutOptions, ): Extension>; -// @public -export type CustomFieldExtensionSchema = { - returnValue: JSONSchema7; - uiOptions?: JSONSchema7; -}; +// @public @deprecated (undocumented) +export type CustomFieldExtensionSchema = CustomFieldExtensionSchema_2; + +// @public @deprecated (undocumented) +export type CustomFieldValidator = + CustomFieldValidator_2; // @public -export type CustomFieldValidator = ( - data: TFieldReturnValue, - field: FieldValidation, - context: { - apiHolder: ApiHolder; - }, -) => void | Promise; - -// @public -export const EntityNamePickerFieldExtension: FieldExtensionComponent< +export const EntityNamePickerFieldExtension: FieldExtensionComponent_2< string, {} >; // @public -export const EntityPickerFieldExtension: FieldExtensionComponent< +export const EntityPickerFieldExtension: FieldExtensionComponent_2< string, { defaultKind?: string | undefined; defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; allowArbitraryValues?: boolean | undefined; + catalogFilter?: + | Record + | Record[] + | undefined; } >; @@ -99,6 +97,10 @@ export const EntityPickerFieldSchema: FieldSchema< defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; allowArbitraryValues?: boolean | undefined; + catalogFilter?: + | Record + | Record[] + | undefined; } >; @@ -107,7 +109,7 @@ export type EntityPickerUiOptions = typeof EntityPickerFieldSchema.uiOptionsType; // @public -export const EntityTagsPickerFieldExtension: FieldExtensionComponent< +export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< string[], { showCounts?: boolean | undefined; @@ -130,44 +132,30 @@ export const EntityTagsPickerFieldSchema: FieldSchema< export type EntityTagsPickerUiOptions = typeof EntityTagsPickerFieldSchema.uiOptionsType; -// @public -export type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null; +// @public @deprecated (undocumented) +export type FieldExtensionComponent<_TReturnValue, _TInputProps> = + FieldExtensionComponent_2<_TReturnValue, _TInputProps>; -// @public -export interface FieldExtensionComponentProps< +// @public @deprecated (undocumented) +export type FieldExtensionComponentProps< TFieldReturnValue, TUiOptions extends {} = {}, -> extends FieldProps { - // (undocumented) - uiSchema: FieldProps['uiSchema'] & { - 'ui:options'?: TUiOptions; - }; -} +> = FieldExtensionComponentProps_2; -// @public -export type FieldExtensionOptions< - TFieldReturnValue = unknown, - TInputProps = unknown, -> = { - name: string; - component: ( - props: FieldExtensionComponentProps, - ) => JSX.Element | null; - validation?: CustomFieldValidator; - schema?: CustomFieldExtensionSchema; -}; +// @public @deprecated (undocumented) +export type FieldExtensionOptions = FieldExtensionOptions_2; // @public export interface FieldSchema { // (undocumented) - readonly schema: CustomFieldExtensionSchema; + readonly schema: CustomFieldExtensionSchema_2; // (undocumented) - readonly type: FieldExtensionComponentProps; + readonly type: FieldExtensionComponentProps_2; // (undocumented) readonly uiOptionsType: TUiOptions; } -// @alpha +// @alpha @deprecated export type FormProps = Pick< FormProps_3, 'transformErrors' | 'noHtml5Validate' @@ -187,28 +175,11 @@ export interface LayoutOptions

{ // @public export type LayoutTemplate = FormProps_2['ObjectFieldTemplate']; -// @public -export type ListActionsResponse = Array<{ - id: string; - description?: string; - schema?: { - input?: JSONSchema7; - output?: JSONSchema7; - }; -}>; +// @public @deprecated (undocumented) +export type ListActionsResponse = ListActionsResponse_2; -// @public -export type LogEvent = { - type: 'log' | 'completion'; - body: { - message: string; - stepId?: string; - status?: ScaffolderTaskStatus; - }; - createdAt: string; - id: string; - taskId: string; -}; +// @public @deprecated (undocumented) +export type LogEvent = LogEvent_2; // @public export function makeFieldSchemaFromZod< @@ -224,40 +195,6 @@ export function makeFieldSchemaFromZod< : never >; -// @alpha -export type NextCustomFieldValidator = ( - data: TFieldReturnValue, - field: FieldValidation_2, - context: { - apiHolder: ApiHolder; - formData: JsonObject; - }, -) => void | Promise; - -// @alpha -export interface NextFieldExtensionComponentProps< - TFieldReturnValue, - TUiOptions = {}, -> extends PropsWithChildren> { - // (undocumented) - uiSchema?: UiSchema & { - 'ui:options'?: TUiOptions & UIOptionsType; - }; -} - -// @alpha -export type NextFieldExtensionOptions< - TFieldReturnValue = unknown, - TInputProps = unknown, -> = { - name: string; - component: ( - props: NextFieldExtensionComponentProps, - ) => JSX.Element | null; - validation?: NextCustomFieldValidator; - schema?: CustomFieldExtensionSchema; -}; - // @alpha (undocumented) export const nextRouteRef: RouteRef; @@ -278,13 +215,18 @@ export const NextScaffolderPage: ( props: PropsWithChildren, ) => JSX.Element; +// @alpha (undocumented) +export const nextScaffolderTaskRouteRef: SubRouteRef< + PathParams<'/tasks/:taskId'> +>; + // @alpha (undocumented) export const nextSelectedTemplateRouteRef: SubRouteRef< PathParams<'/templates/:namespace/:templateName'> >; // @public -export const OwnedEntityPickerFieldExtension: FieldExtensionComponent< +export const OwnedEntityPickerFieldExtension: FieldExtensionComponent_2< string, { defaultKind?: string | undefined; @@ -310,12 +252,16 @@ export type OwnedEntityPickerUiOptions = typeof OwnedEntityPickerFieldSchema.uiOptionsType; // @public -export const OwnerPickerFieldExtension: FieldExtensionComponent< +export const OwnerPickerFieldExtension: FieldExtensionComponent_2< string, { defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; allowArbitraryValues?: boolean | undefined; + catalogFilter?: + | Record + | Record[] + | undefined; } >; @@ -326,6 +272,10 @@ export const OwnerPickerFieldSchema: FieldSchema< defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; allowArbitraryValues?: boolean | undefined; + catalogFilter?: + | Record + | Record[] + | undefined; } >; @@ -342,14 +292,14 @@ export const repoPickerValidation: ( ) => void; // @public -export const RepoUrlPickerFieldExtension: FieldExtensionComponent< +export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< string, { - allowedOwners?: string[] | undefined; + allowedHosts?: string[] | undefined; allowedOrganizations?: string[] | undefined; + allowedOwners?: string[] | undefined; allowedProjects?: string[] | undefined; allowedRepos?: string[] | undefined; - allowedHosts?: string[] | undefined; requestUserCredentials?: | { additionalScopes?: @@ -371,11 +321,11 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent< export const RepoUrlPickerFieldSchema: FieldSchema< string, { - allowedOwners?: string[] | undefined; + allowedHosts?: string[] | undefined; allowedOrganizations?: string[] | undefined; + allowedOwners?: string[] | undefined; allowedProjects?: string[] | undefined; allowedRepos?: string[] | undefined; - allowedHosts?: string[] | undefined; requestUserCredentials?: | { additionalScopes?: @@ -411,7 +361,7 @@ export type ReviewStepProps = { }[]; }; -// @public (undocumented) +// @public @deprecated (undocumented) export const rootRouteRef: RouteRef; // @public @@ -441,37 +391,14 @@ export type RouterProps = { }; }; -// @public -export interface ScaffolderApi { - // (undocumented) - dryRun?(options: ScaffolderDryRunOptions): Promise; - // (undocumented) - getIntegrationsList( - options: ScaffolderGetIntegrationsListOptions, - ): Promise; - // (undocumented) - getTask(taskId: string): Promise; - // (undocumented) - getTemplateParameterSchema( - templateRef: string, - ): Promise; - listActions(): Promise; - // (undocumented) - listTasks?(options: { filterByOwnership: 'owned' | 'all' }): Promise<{ - tasks: ScaffolderTask[]; - }>; - scaffold( - options: ScaffolderScaffoldOptions, - ): Promise; - // (undocumented) - streamLogs(options: ScaffolderStreamLogsOptions): Observable; -} +// @public @deprecated (undocumented) +export type ScaffolderApi = ScaffolderApi_2; + +// @public @deprecated (undocumented) +export const scaffolderApiRef: ApiRef; // @public -export const scaffolderApiRef: ApiRef; - -// @public -export class ScaffolderClient implements ScaffolderApi { +export class ScaffolderClient implements ScaffolderApi_2 { constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi; @@ -480,90 +407,57 @@ export class ScaffolderClient implements ScaffolderApi { useLongPollingLogs?: boolean; }); // (undocumented) - dryRun(options: ScaffolderDryRunOptions): Promise; + dryRun( + options: ScaffolderDryRunOptions_2, + ): Promise; // (undocumented) getIntegrationsList( - options: ScaffolderGetIntegrationsListOptions, - ): Promise; + options: ScaffolderGetIntegrationsListOptions_2, + ): Promise; // (undocumented) - getTask(taskId: string): Promise; + getTask(taskId: string): Promise; // (undocumented) getTemplateParameterSchema( templateRef: string, - ): Promise; + ): Promise; // (undocumented) - listActions(): Promise; + listActions(): Promise; // (undocumented) listTasks(options: { filterByOwnership: 'owned' | 'all' }): Promise<{ - tasks: ScaffolderTask[]; + tasks: ScaffolderTask_2[]; }>; + // (undocumented) scaffold( - options: ScaffolderScaffoldOptions, - ): Promise; + options: ScaffolderScaffoldOptions_2, + ): Promise; // (undocumented) - streamLogs(options: ScaffolderStreamLogsOptions): Observable; + streamLogs(options: ScaffolderStreamLogsOptions_2): Observable; } -// @public (undocumented) -export interface ScaffolderDryRunOptions { - // (undocumented) - directoryContents: { - path: string; - base64Content: string; - }[]; - // (undocumented) - secrets?: Record; - // (undocumented) - template: JsonValue; - // (undocumented) - values: JsonObject; -} +// @public @deprecated (undocumented) +export type ScaffolderDryRunOptions = ScaffolderDryRunOptions_2; -// @public (undocumented) -export interface ScaffolderDryRunResponse { - // (undocumented) - directoryContents: Array<{ - path: string; - base64Content: string; - executable: boolean; - }>; - // (undocumented) - log: Array>; - // (undocumented) - output: ScaffolderTaskOutput; - // (undocumented) - steps: TaskStep[]; -} +// @public @deprecated (undocumented) +export type ScaffolderDryRunResponse = ScaffolderDryRunResponse_2; -// @public -export const ScaffolderFieldExtensions: React_2.ComponentType; +// @public @deprecated (undocumented) +export const ScaffolderFieldExtensions: ComponentType<{ + children?: ReactNode; +}>; -// @public -export interface ScaffolderGetIntegrationsListOptions { - // (undocumented) - allowedHosts: string[]; -} +// @public @deprecated (undocumented) +export type ScaffolderGetIntegrationsListOptions = + ScaffolderGetIntegrationsListOptions_2; -// @public -export interface ScaffolderGetIntegrationsListResponse { - // (undocumented) - integrations: { - type: string; - title: string; - host: string; - }[]; -} +// @public @deprecated (undocumented) +export type ScaffolderGetIntegrationsListResponse = + ScaffolderGetIntegrationsListResponse_2; // @public export const ScaffolderLayouts: React.ComponentType; -// @public (undocumented) -export type ScaffolderOutputLink = { - title?: string; - icon?: string; - url?: string; - entityRef?: string; -}; +// @public @deprecated (undocumented) +export type ScaffolderOutputlink = ScaffolderOutputLink; // @public export const ScaffolderPage: (props: RouterProps) => JSX.Element; @@ -572,6 +466,10 @@ export const ScaffolderPage: (props: RouterProps) => JSX.Element; export const scaffolderPlugin: BackstagePlugin< { root: RouteRef; + selectedTemplate: SubRouteRef< + PathParams<'/templates/:namespace/:templateName'> + >; + ongoingTask: SubRouteRef>; }, { registerComponent: ExternalRouteRef; @@ -587,64 +485,26 @@ export const scaffolderPlugin: BackstagePlugin< {} >; -// @public -export interface ScaffolderScaffoldOptions { - // (undocumented) - secrets?: Record; - // (undocumented) - templateRef: string; - // (undocumented) - values: Record; -} +// @public @deprecated (undocumented) +export type ScaffolderScaffoldOptions = ScaffolderScaffoldOptions_2; -// @public -export interface ScaffolderScaffoldResponse { - // (undocumented) - taskId: string; -} +// @public @deprecated (undocumented) +export type ScaffolderScaffoldResponse = ScaffolderScaffoldResponse_2; -// @public -export interface ScaffolderStreamLogsOptions { - // (undocumented) - after?: number; - // (undocumented) - taskId: string; -} +// @public @deprecated (undocumented) +export type ScaffolderStreamLogsOptions = ScaffolderStreamLogsOptions_2; -// @public -export type ScaffolderTask = { - id: string; - spec: TaskSpec; - status: 'failed' | 'completed' | 'processing' | 'open' | 'cancelled'; - lastHeartbeatAt: string; - createdAt: string; -}; +// @public @deprecated (undocumented) +export type ScaffolderTask = ScaffolderTask_2; -// @public (undocumented) -export type ScaffolderTaskOutput = { - links?: ScaffolderOutputLink[]; -} & { - [key: string]: unknown; -}; +// @public @deprecated (undocumented) +export type ScaffolderTaskOutput = ScaffolderTaskOutput_2; -// @public -export type ScaffolderTaskStatus = - | 'open' - | 'processing' - | 'failed' - | 'completed' - | 'skipped'; +// @public @deprecated (undocumented) +export type ScaffolderTaskStatus = ScaffolderTaskStatus_2; -// @public -export interface ScaffolderUseTemplateSecrets { - // (undocumented) - setSecrets: (input: Record) => void; -} - -// @public (undocumented) -export const selectedTemplateRouteRef: SubRouteRef< - PathParams<'/templates/:namespace/:templateName'> ->; +// @public @deprecated (undocumented) +export type ScaffolderUseTemplateSecrets = ScaffolderUseTemplateSecrets_2; // @public export const TaskPage: ({ loadingText }: TaskPageProps) => JSX.Element; @@ -660,20 +520,12 @@ export type TemplateGroupFilter = { filter: (entity: Entity) => boolean; }; -// @public -export type TemplateParameterSchema = { - title: string; - description?: string; - steps: Array<{ - title: string; - description?: string; - schema: JsonObject; - }>; -}; +// @public @deprecated (undocumented) +export type TemplateParameterSchema = TemplateParameterSchema_2; // @public export const TemplateTypePicker: () => JSX.Element | null; -// @public -export const useTemplateSecrets: () => ScaffolderUseTemplateSecrets; +// @public @deprecated (undocumented) +export const useTemplateSecrets: () => ScaffolderUseTemplateSecrets_2; ``` diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index ebc2e91511..97ee629cfa 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.9.0", + "version": "1.10.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -45,6 +45,7 @@ "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-permission-react": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", + "@backstage/plugin-scaffolder-react": "workspace:^", "@backstage/theme": "workspace:^", "@backstage/types": "workspace:^", "@codemirror/language": "^6.0.0", @@ -55,12 +56,9 @@ "@material-ui/lab": "4.0.0-alpha.57", "@react-hookz/web": "^20.0.0", "@rjsf/core": "^3.2.1", - "@rjsf/core-v5": "npm:@rjsf/core@^5.0.0-beta.14", + "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16", "@rjsf/material-ui": "^3.2.1", - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@^5.0.0-beta.14", - "@rjsf/utils": "^5.0.0-beta.14", - "@rjsf/validator-ajv6": "^5.0.0-beta.14", - "@types/json-schema": "^7.0.9", + "@rjsf/utils": "5.0.0-beta.16", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^13.0.0", @@ -72,7 +70,7 @@ "luxon": "^3.0.0", "qs": "^6.9.4", "react-use": "^17.2.4", - "use-immer": "^0.7.0", + "use-immer": "^0.8.0", "yaml": "^2.0.0", "zen-observable": "^0.10.0", "zod": "~3.18.0", @@ -94,6 +92,7 @@ "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0", "@types/humanize-duration": "^3.18.1", + "@types/json-schema": "^7.0.9", "@types/node": "^16.11.26", "cross-fetch": "^3.1.5", "event-source-polyfill": "1.0.25", diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts index 64141dd83d..15bd1925b3 100644 --- a/plugins/scaffolder/src/api.ts +++ b/plugins/scaffolder/src/api.ts @@ -16,7 +16,6 @@ import { parseEntityRef } from '@backstage/catalog-model'; import { - createApiRef, DiscoveryApi, FetchApi, IdentityApi, @@ -30,7 +29,6 @@ import { ListActionsResponse, LogEvent, ScaffolderApi, - TemplateParameterSchema, ScaffolderScaffoldOptions, ScaffolderScaffoldResponse, ScaffolderStreamLogsOptions, @@ -39,17 +37,10 @@ import { ScaffolderTask, ScaffolderDryRunOptions, ScaffolderDryRunResponse, -} from './types'; -import queryString from 'qs'; + TemplateParameterSchema, +} from '@backstage/plugin-scaffolder-react'; -/** - * Utility API reference for the {@link ScaffolderApi}. - * - * @public - */ -export const scaffolderApiRef = createApiRef({ - id: 'plugin.scaffolder.service', -}); +import queryString from 'qs'; /** * An API to interact with the scaffolder backend. @@ -149,12 +140,6 @@ export class ScaffolderClient implements ScaffolderApi { return schema; } - /** - * Executes the scaffolding of a component, given a template and its - * parameter values. - * - * @param options - The {@link ScaffolderScaffoldOptions} the scaffolding. - */ async scaffold( options: ScaffolderScaffoldOptions, ): Promise { diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx index 02f3c066ca..552d0cea6a 100644 --- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx +++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx @@ -14,12 +14,14 @@ * limitations under the License. */ import React from 'react'; -import { scaffolderApiRef } from '../../api'; import { ActionsPage } from './ActionsPage'; -import { rootRouteRef } from '../../routes'; +import { + scaffolderApiRef, + ScaffolderApi, +} from '@backstage/plugin-scaffolder-react'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { ApiProvider } from '@backstage/core-app-api'; -import { ScaffolderApi } from '../../types'; +import { rootRouteRef } from '../../routes'; const scaffolderApiMock: jest.Mocked = { scaffold: jest.fn(), diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx index 29951d7cb1..10a272b3cf 100644 --- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx +++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx @@ -13,9 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React from 'react'; +import React, { Fragment } from 'react'; import useAsync from 'react-use/lib/useAsync'; -import { scaffolderApiRef } from '../../api'; +import { + ActionExample, + scaffolderApiRef, +} from '@backstage/plugin-scaffolder-react'; import { Typography, Paper, @@ -27,10 +30,15 @@ import { TableContainer, TableHead, TableRow, + Grid, makeStyles, + Accordion, + AccordionSummary, + AccordionDetails, } from '@material-ui/core'; import { JSONSchema7, JSONSchema7Definition } from 'json-schema'; import classNames from 'classnames'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { useApi } from '@backstage/core-plugin-api'; import { @@ -39,6 +47,8 @@ import { Header, Page, ErrorPage, + CodeSnippet, + MarkdownContent, } from '@backstage/core-components'; const useStyles = makeStyles(theme => ({ @@ -67,6 +77,34 @@ const useStyles = makeStyles(theme => ({ }, })); +const ExamplesTable = (props: { examples: ActionExample[] }) => { + return ( + + {props.examples.map((example, index) => { + return ( + + + + {example.description} + + + + + + + + + ); + })} + + ); +}; + export const ActionsPage = () => { const api = useApi(scaffolderApiRef); const classes = useStyles(); @@ -110,7 +148,7 @@ export const ActionsPage = () => { <> {[props.type].flat().map(type => ( - + ))} @@ -166,7 +204,7 @@ export const ActionsPage = () => { {action.id} - {action.description} + {action.description && } {action.schema?.input && ( Input @@ -180,6 +218,18 @@ export const ActionsPage = () => { {renderTable(action.schema.output)} )} + {action.examples && ( + + }> + Examples + + + + + + + + )} ); }); diff --git a/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx b/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx index 57dde13a43..b9c5a84da3 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx @@ -24,10 +24,12 @@ import { import React from 'react'; import { identityApiRef } from '@backstage/core-plugin-api'; import { ListTasksPage } from './ListTasksPage'; -import { ScaffolderApi } from '../../types'; -import { scaffolderApiRef } from '../../api'; -import { rootRouteRef } from '../../routes'; +import { + scaffolderApiRef, + ScaffolderApi, +} from '@backstage/plugin-scaffolder-react'; import { act, fireEvent } from '@testing-library/react'; +import { rootRouteRef } from '../../routes'; describe('', () => { const catalogApi: jest.Mocked = { diff --git a/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx b/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx index 0b00879d43..1edac508d8 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx @@ -28,9 +28,10 @@ import { useApi, useRouteRef } from '@backstage/core-plugin-api'; import { CatalogFilterLayout } from '@backstage/plugin-catalog-react'; import useAsync from 'react-use/lib/useAsync'; import React, { useState } from 'react'; -import { scaffolderApiRef } from '../../api'; -import { rootRouteRef } from '../../routes'; -import { ScaffolderTask } from '../../types'; +import { + ScaffolderTask, + scaffolderApiRef, +} from '@backstage/plugin-scaffolder-react'; import { OwnerListPicker } from './OwnerListPicker'; import { CreatedAtColumn, @@ -38,6 +39,7 @@ import { TaskStatusColumn, TemplateTitleColumn, } from './columns'; +import { rootRouteRef } from '../../routes'; export interface MyTaskPageProps { initiallySelectedFilter?: 'owned' | 'all'; diff --git a/plugins/scaffolder/src/components/ListTasksPage/columns/CreatedAtColumn.tsx b/plugins/scaffolder/src/components/ListTasksPage/columns/CreatedAtColumn.tsx index 8e48d4a561..3b47287fd6 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/columns/CreatedAtColumn.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/columns/CreatedAtColumn.tsx @@ -16,6 +16,7 @@ import { DateTime, Interval } from 'luxon'; import humanizeDuration from 'humanize-duration'; import React from 'react'; +import Typography from '@material-ui/core/Typography'; export const CreatedAtColumn = ({ createdAt }: { createdAt: string }) => { const createdAtTime = DateTime.fromISO(createdAt); @@ -23,5 +24,9 @@ export const CreatedAtColumn = ({ createdAt }: { createdAt: string }) => { .toDuration() .valueOf(); - return

{humanizeDuration(formatted, { round: true })} ago

; + return ( + + {humanizeDuration(formatted, { round: true })} ago + + ); }; diff --git a/plugins/scaffolder/src/components/ListTasksPage/columns/OwnerEntityColumn.tsx b/plugins/scaffolder/src/components/ListTasksPage/columns/OwnerEntityColumn.tsx index 0c83c7cbc2..b89141392c 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/columns/OwnerEntityColumn.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/columns/OwnerEntityColumn.tsx @@ -20,6 +20,7 @@ import useAsync from 'react-use/lib/useAsync'; import { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react'; import { parseEntityRef, UserEntity } from '@backstage/catalog-model'; +import Typography from '@material-ui/core/Typography'; export const OwnerEntityColumn = ({ entityRef }: { entityRef?: string }) => { const catalogApi = useApi(catalogApiRef); @@ -30,7 +31,7 @@ export const OwnerEntityColumn = ({ entityRef }: { entityRef?: string }) => { ); if (!entityRef) { - return

Unknown

; + return Unknown; } if (loading || error) { diff --git a/plugins/scaffolder/src/components/ListTasksPage/columns/TemplateTitleColumn.test.tsx b/plugins/scaffolder/src/components/ListTasksPage/columns/TemplateTitleColumn.test.tsx index 3dc20312aa..bf06c09436 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/columns/TemplateTitleColumn.test.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/columns/TemplateTitleColumn.test.tsx @@ -18,9 +18,11 @@ import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import React from 'react'; import { TemplateTitleColumn } from './TemplateTitleColumn'; -import { scaffolderApiRef } from '../../../api'; -import { ScaffolderApi } from '../../../types'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; +import { + scaffolderApiRef, + ScaffolderApi, +} from '@backstage/plugin-scaffolder-react'; describe('', () => { const scaffolderApiMock: jest.Mocked = { diff --git a/plugins/scaffolder/src/components/ListTasksPage/columns/TemplateTitleColumn.tsx b/plugins/scaffolder/src/components/ListTasksPage/columns/TemplateTitleColumn.tsx index 0561b40392..cbac929a33 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/columns/TemplateTitleColumn.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/columns/TemplateTitleColumn.tsx @@ -15,7 +15,7 @@ */ import { useApi } from '@backstage/core-plugin-api'; import React from 'react'; -import { scaffolderApiRef } from '../../../api'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; import useAsync from 'react-use/lib/useAsync'; import { parseEntityRef } from '@backstage/catalog-model'; import { EntityRefLink } from '@backstage/plugin-catalog-react'; diff --git a/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx b/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx index 1fc63b2b61..3a1196bc0e 100644 --- a/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx +++ b/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx @@ -30,7 +30,6 @@ import { useApi, } from '@backstage/core-plugin-api'; import { FormProps, IChangeEvent, withTheme } from '@rjsf/core'; -import { UiSchema } from '@rjsf/utils'; import { Theme as MuiTheme } from '@rjsf/material-ui'; import React, { ComponentType, useState } from 'react'; import { transformSchemaToProps } from './schema'; @@ -39,8 +38,8 @@ import * as fieldOverrides from './FieldOverrides'; import { LayoutOptions } from '../../layouts'; import { ReviewStepProps } from '../types'; import { ReviewStep } from './ReviewStep'; +import { extractSchemaFromStep } from '@backstage/plugin-scaffolder-react'; import { selectedTemplateRouteRef } from '../../routes'; -import { extractSchemaFromStep } from '../../next/TemplateWizardPage/Stepper/schema'; const Form = withTheme(MuiTheme); @@ -68,11 +67,7 @@ export type MultistepJsonFormProps = { ReviewStepComponent?: ComponentType; }; -export function getSchemasFromSteps(steps: Step[]): { - uiSchema: UiSchema; - mergedSchema: JsonObject; - schema: JsonObject; -}[] { +export function getSchemasFromSteps(steps: Step[]) { return steps.map(({ schema }) => ({ mergedSchema: schema, ...extractSchemaFromStep(schema), diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index 644b26eeb8..6a2da406e0 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -22,20 +22,21 @@ import { ScaffolderPage } from './ScaffolderPage'; import { TemplatePage } from './TemplatePage'; import { TaskPage } from './TaskPage'; import { ActionsPage } from './ActionsPage'; -import { SecretsContextProvider } from './secrets/SecretsContext'; import { TemplateEditorPage } from './TemplateEditorPage'; - -import { - DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS, - FIELD_EXTENSION_KEY, - FIELD_EXTENSION_WRAPPER_KEY, - FieldExtensionOptions, -} from '../extensions'; +import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../extensions/default'; import { useElementFilter, useRouteRef, useRouteRefParams, } from '@backstage/core-plugin-api'; +import { + FieldExtensionOptions, + SecretsContextProvider, + useCustomFieldExtensions, +} from '@backstage/plugin-scaffolder-react'; +import { ListTasksPage } from './ListTasksPage'; +import { LayoutOptions, LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from '../layouts'; +import { ReviewStepProps } from './types'; import { actionsRouteRef, editRouteRef, @@ -44,9 +45,6 @@ import { scaffolderTaskRouteRef, selectedTemplateRouteRef, } from '../routes'; -import { ListTasksPage } from './ListTasksPage'; -import { LayoutOptions, LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from '../layouts'; -import { ReviewStepProps } from './types'; /** * The props for the entrypoint `ScaffolderPage` component the plugin. @@ -95,16 +93,7 @@ export const Router = (props: RouterProps) => { const outlet = useOutlet(); const TaskPageElement = TaskPageComponent ?? TaskPage; - const customFieldExtensions = useElementFilter(outlet, elements => - elements - .selectByComponentData({ - key: FIELD_EXTENSION_WRAPPER_KEY, - }) - .findComponentData({ - key: FIELD_EXTENSION_KEY, - }), - ); - + const customFieldExtensions = useCustomFieldExtensions(outlet); const fieldExtensions = [ ...customFieldExtensions, ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter( @@ -113,8 +102,9 @@ export const Router = (props: RouterProps) => { customFieldExtension => customFieldExtension.name === name, ), ), - ]; + ] as FieldExtensionOptions[]; + // todo(blam): this should also be moved to a hook in -react const customLayouts = useElementFilter(outlet, elements => elements .selectByComponentData({ diff --git a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx index 9c13db72b1..50221f3a83 100644 --- a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx +++ b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx @@ -34,12 +34,12 @@ import { UserListPicker, } from '@backstage/plugin-catalog-react'; import React, { ComponentType } from 'react'; -import { registerComponentRouteRef } from '../../routes'; import { TemplateList } from '../TemplateList'; import { TemplateTypePicker } from '../TemplateTypePicker'; import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common'; import { usePermission } from '@backstage/plugin-permission-react'; import { ScaffolderPageContextMenu } from './ScaffolderPageContextMenu'; +import { registerComponentRouteRef } from '../../routes'; export type ScaffolderPageProps = { TemplateCardComponent?: diff --git a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPageContextMenu.test.tsx b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPageContextMenu.test.tsx index 02869bb6da..66513591d0 100644 --- a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPageContextMenu.test.tsx +++ b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPageContextMenu.test.tsx @@ -18,8 +18,8 @@ import userEvent from '@testing-library/user-event'; import { renderInTestApp } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; import React from 'react'; -import { rootRouteRef } from '../../routes'; import { ScaffolderPageContextMenu } from './ScaffolderPageContextMenu'; +import { rootRouteRef } from '../../routes'; describe('ScaffolderPageContextMenu', () => { it('does not render anything if fully disabled', async () => { diff --git a/plugins/scaffolder/src/components/TaskPage/IconLink.test.tsx b/plugins/scaffolder/src/components/TaskPage/IconLink.test.tsx index f7ce850cd8..0b6092c37d 100644 --- a/plugins/scaffolder/src/components/TaskPage/IconLink.test.tsx +++ b/plugins/scaffolder/src/components/TaskPage/IconLink.test.tsx @@ -14,23 +14,15 @@ * limitations under the License. */ -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; +import { renderInTestApp } from '@backstage/test-utils'; import CloudIcon from '@material-ui/icons/Cloud'; -import { render } from '@testing-library/react'; import React from 'react'; import { IconLink } from './IconLink'; describe('IconLink', () => { - it('should render an icon link', () => { - const rendered = render( - - - , + it('should render an icon link', async () => { + const rendered = await renderInTestApp( + , ); expect(rendered.getByText('I am Link')).toBeInTheDocument(); diff --git a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx index 699ce119fb..393bd495bf 100644 --- a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx @@ -47,15 +47,18 @@ import qs from 'qs'; import React, { memo, useEffect, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import useInterval from 'react-use/lib/useInterval'; +import { + ScaffolderTaskStatus, + ScaffolderTaskOutput, +} from '@backstage/plugin-scaffolder-react'; +import { useTaskEventStream } from '../hooks/useEventStream'; +import { TaskErrors } from './TaskErrors'; +import { TaskPageLinks } from './TaskPageLinks'; import { rootRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef, } from '../../routes'; -import { ScaffolderTaskStatus, ScaffolderTaskOutput } from '../../types'; -import { useTaskEventStream } from '../hooks/useEventStream'; -import { TaskErrors } from './TaskErrors'; -import { TaskPageLinks } from './TaskPageLinks'; // typings are wrong for this library, so fallback to not parsing types. const humanizeDuration = require('humanize-duration'); diff --git a/plugins/scaffolder/src/components/TaskPage/TaskPageLinks.tsx b/plugins/scaffolder/src/components/TaskPage/TaskPageLinks.tsx index 78d6a452ea..59c1515b79 100644 --- a/plugins/scaffolder/src/components/TaskPage/TaskPageLinks.tsx +++ b/plugins/scaffolder/src/components/TaskPage/TaskPageLinks.tsx @@ -19,7 +19,7 @@ import { entityRouteRef } from '@backstage/plugin-catalog-react'; import { Box } from '@material-ui/core'; import LanguageIcon from '@material-ui/icons/Language'; import React from 'react'; -import { ScaffolderTaskOutput } from '../../types'; +import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; import { IconLink } from './IconLink'; import { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/CustomFieldExplorer.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/CustomFieldExplorer.tsx index 3510968acd..c7138efb97 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/CustomFieldExplorer.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/CustomFieldExplorer.tsx @@ -33,7 +33,7 @@ import { Theme as MuiTheme } from '@rjsf/material-ui'; import CodeMirror from '@uiw/react-codemirror'; import React, { useCallback, useMemo, useState } from 'react'; import yaml from 'yaml'; -import { FieldExtensionOptions } from '../../extensions'; +import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import * as fieldOverrides from '../MultistepJsonForm/FieldOverrides'; import { TemplateEditorForm } from './TemplateEditorForm'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunContext.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunContext.tsx index 3534b62c39..a617eebe1e 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunContext.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunContext.tsx @@ -26,8 +26,10 @@ import React, { useRef, useState, } from 'react'; -import { scaffolderApiRef } from '../../api'; -import { ScaffolderDryRunResponse } from '../../types'; +import { + scaffolderApiRef, + ScaffolderDryRunResponse, +} from '@backstage/plugin-scaffolder-react'; const MAX_CONTENT_SIZE = 64 * 1024; const CHUNK_SIZE = 32 * 1024; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResults.test.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResults.test.tsx index bc3354cc46..0267093ee6 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResults.test.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResults.test.tsx @@ -18,7 +18,7 @@ import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { act, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React, { useEffect } from 'react'; -import { scaffolderApiRef } from '../../../api'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; import { DryRunProvider, useDryRun } from '../DryRunContext'; import { DryRunResults } from './DryRunResults'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResultsList.test.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResultsList.test.tsx index 417c23c483..706f284db1 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResultsList.test.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResultsList.test.tsx @@ -18,7 +18,7 @@ import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { act, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React, { useEffect } from 'react'; -import { scaffolderApiRef } from '../../../api'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; import { DryRunProvider, useDryRun } from '../DryRunContext'; import { DryRunResultsList } from './DryRunResultsList'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResultsView.test.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResultsView.test.tsx index c709adfd68..c2d8d3a2a4 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResultsView.test.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunResults/DryRunResultsView.test.tsx @@ -19,7 +19,7 @@ import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React, { ReactNode, useEffect } from 'react'; -import { scaffolderApiRef } from '../../../api'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; import { DryRunProvider, useDryRun } from '../DryRunContext'; import { DryRunResultsView } from './DryRunResultsView'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx index 7055e42c84..dc67f687bb 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx @@ -15,7 +15,7 @@ */ import { makeStyles } from '@material-ui/core'; import React, { useState } from 'react'; -import { FieldExtensionOptions } from '../../extensions'; +import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import type { LayoutOptions } from '../../layouts'; import { TemplateDirectoryAccess } from '../../lib/filesystem'; import { DirectoryEditorProvider } from './DirectoryEditorContext'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx index 192a9696cf..c62112a89c 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx @@ -19,9 +19,11 @@ import { makeStyles } from '@material-ui/core/styles'; import React, { Component, ReactNode, useMemo, useState } from 'react'; import useDebounce from 'react-use/lib/useDebounce'; import yaml from 'yaml'; -import { FieldExtensionOptions } from '../../extensions'; +import { + FieldExtensionOptions, + TemplateParameterSchema, +} from '@backstage/plugin-scaffolder-react'; import { LayoutOptions } from '../../layouts'; -import { TemplateParameterSchema } from '../../types'; import { MultistepJsonForm } from '../MultistepJsonForm'; import { createValidator } from '../TemplatePage'; import { useDirectoryEditor } from './DirectoryEditorContext'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx index 8847b85373..20691a8e85 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx @@ -23,7 +23,7 @@ import { CustomFieldExplorer } from './CustomFieldExplorer'; import { TemplateEditorIntro } from './TemplateEditorIntro'; import { TemplateEditor } from './TemplateEditor'; import { TemplateFormPreviewer } from './TemplateFormPreviewer'; -import { FieldExtensionOptions } from '../../extensions'; +import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import type { LayoutOptions } from '../../layouts'; type Selection = diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx index 041b7797ee..884305bf64 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx @@ -32,7 +32,7 @@ import CloseIcon from '@material-ui/icons/Close'; import React, { useCallback, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import yaml from 'yaml'; -import { FieldExtensionOptions } from '../../extensions'; +import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { LayoutOptions } from '../../layouts'; import { TemplateEditorForm } from './TemplateEditorForm'; import { TemplateEditorTextArea } from './TemplateEditorTextArea'; @@ -53,8 +53,8 @@ parameters: description: Owner of the component ui:field: OwnerPicker ui:options: - allowedKinds: - - Group + catalogFilter: + kind: Group - title: Choose a location required: - repoUrl diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx index 0535df5ef4..b4358146fd 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx @@ -22,9 +22,11 @@ import { import { act, fireEvent, screen, within } from '@testing-library/react'; import React from 'react'; import { Route, Routes } from 'react-router-dom'; -import { scaffolderApiRef } from '../../api'; -import { ScaffolderApi } from '../../types'; -import { rootRouteRef } from '../../routes'; +import { + scaffolderApiRef, + ScaffolderApi, + SecretsContextProvider, +} from '@backstage/plugin-scaffolder-react'; import { TemplatePage } from './TemplatePage'; import { featureFlagsApiRef, @@ -33,6 +35,7 @@ import { } from '@backstage/core-plugin-api'; import { ApiProvider } from '@backstage/core-app-api'; import { errorApiRef } from '@backstage/core-plugin-api'; +import { rootRouteRef } from '../../routes'; jest.mock('react-router-dom', () => { return { @@ -125,7 +128,9 @@ describe('TemplatePage', () => { }); const rendered = await renderInTestApp( - + + + , { mountedRoutes: { @@ -146,7 +151,9 @@ describe('TemplatePage', () => { scaffolderApiMock.getTemplateParameterSchema.mockReturnValueOnce(promise); const rendered = await renderInTestApp( - + + + , { mountedRoutes: { @@ -187,7 +194,9 @@ describe('TemplatePage', () => { }); const { findByLabelText, findByText } = await renderInTestApp( - + + + , { mountedRoutes: { @@ -234,7 +243,14 @@ describe('TemplatePage', () => { const rendered = await renderInTestApp( - } /> + + + + } + /> This is root} /> , @@ -287,7 +303,9 @@ describe('TemplatePage', () => { const { findByText, findByLabelText, findAllByRole, findByRole } = await renderInTestApp( - + + + , { mountedRoutes: { @@ -331,7 +349,9 @@ describe('TemplatePage', () => { await renderInTestApp( - + + + , { mountedRoutes: { diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx index e5dcc5d9bf..0f484ff404 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx @@ -16,17 +16,14 @@ import { LinearProgress } from '@material-ui/core'; import { IChangeEvent } from '@rjsf/core'; import qs from 'qs'; -import React, { ComponentType, useCallback, useContext, useState } from 'react'; +import React, { ComponentType, useCallback, useState } from 'react'; import { Navigate, useNavigate } from 'react-router-dom'; import useAsync from 'react-use/lib/useAsync'; -import { scaffolderApiRef } from '../../api'; -import { FieldExtensionOptions } from '../../extensions'; -import { SecretsContext } from '../secrets/SecretsContext'; import { - rootRouteRef, - scaffolderTaskRouteRef, - selectedTemplateRouteRef, -} from '../../routes'; + FieldExtensionOptions, + scaffolderApiRef, + useTemplateSecrets, +} from '@backstage/plugin-scaffolder-react'; import { MultistepJsonForm } from '../MultistepJsonForm'; import { createValidator } from './createValidator'; @@ -42,6 +39,11 @@ import { import { stringifyEntityRef } from '@backstage/catalog-model'; import { LayoutOptions } from '../../layouts'; import { ReviewStepProps } from '../types'; +import { + rootRouteRef, + scaffolderTaskRouteRef, + selectedTemplateRouteRef, +} from '../../routes'; const useTemplateParameterSchema = (templateRef: string) => { const scaffolderApi = useApi(scaffolderApiRef); @@ -70,7 +72,7 @@ export const TemplatePage = ({ headerOptions, }: Props) => { const apiHolder = useApiHolder(); - const secretsContext = useContext(SecretsContext); + const secretsContext = useTemplateSecrets(); const errorApi = useApi(errorApiRef); const scaffolderApi = useApi(scaffolderApiRef); const { templateName, namespace } = useRouteRefParams( diff --git a/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts b/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts index f549c9e7f2..177697eda0 100644 --- a/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts +++ b/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts @@ -15,7 +15,7 @@ */ import { createValidator } from './createValidator'; -import { CustomFieldValidator } from '../../extensions'; +import { CustomFieldValidator } from '@backstage/plugin-scaffolder-react'; import { ApiHolder } from '@backstage/core-plugin-api'; import { FormValidation } from '@rjsf/core'; diff --git a/plugins/scaffolder/src/components/TemplatePage/createValidator.ts b/plugins/scaffolder/src/components/TemplatePage/createValidator.ts index 9cd1489a02..4a64481fc3 100644 --- a/plugins/scaffolder/src/components/TemplatePage/createValidator.ts +++ b/plugins/scaffolder/src/components/TemplatePage/createValidator.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { CustomFieldValidator } from '../../extensions'; +import { CustomFieldValidator } from '@backstage/plugin-scaffolder-react'; import { FormValidation } from '@rjsf/core'; import { JsonObject, JsonValue } from '@backstage/types'; import { ApiHolder } from '@backstage/core-plugin-api'; diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx index 942eef9d82..b6d6688a09 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ +import { EntityFilterQuery } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; @@ -34,7 +35,13 @@ describe('', () => { const schema = {}; const required = false; let uiSchema: { - 'ui:options': { allowedKinds?: string[]; defaultKind?: string }; + 'ui:options': { + allowedKinds?: string[]; + defaultKind?: string; + allowArbitraryValues?: boolean; + defaultNamespace?: string | false; + catalogFilter?: EntityFilterQuery; + }; }; const rawErrors: string[] = []; const formData = undefined; @@ -66,7 +73,7 @@ describe('', () => { afterEach(() => jest.resetAllMocks()); - describe('without allowedKinds', () => { + describe('without allowedKinds and catalogFilter', () => { beforeEach(() => { uiSchema = { 'ui:options': {} }; props = { @@ -136,4 +143,97 @@ describe('', () => { }); }); }); + + describe('with catalogFilter', () => { + beforeEach(() => { + uiSchema = { + 'ui:options': { + catalogFilter: [ + { + kind: ['Group'], + 'metadata.name': 'test-entity', + }, + { + kind: ['User'], + 'metadata.name': 'test-entity', + }, + ], + }, + }; + props = { + onChange, + schema, + required, + uiSchema, + rawErrors, + formData, + } as unknown as FieldProps; + + catalogApi.getEntities.mockResolvedValue({ items: entities }); + }); + + it('searches for a specific group entity', async () => { + await renderInTestApp( + + + , + ); + + expect(catalogApi.getEntities).toHaveBeenCalledWith({ + filter: [ + { + kind: ['Group'], + 'metadata.name': 'test-entity', + }, + { + kind: ['User'], + 'metadata.name': 'test-entity', + }, + ], + }); + }); + }); + + describe('catalogFilter should take precedence over allowedKinds', () => { + beforeEach(() => { + uiSchema = { + 'ui:options': { + catalogFilter: [ + { + kind: ['Group'], + 'metadata.name': 'test-group', + }, + ], + allowedKinds: ['User'], + }, + }; + props = { + onChange, + schema, + required, + uiSchema, + rawErrors, + formData, + } as unknown as FieldProps; + + catalogApi.getEntities.mockResolvedValue({ items: entities }); + }); + + it('searches for a Group entity', async () => { + await renderInTestApp( + + + , + ); + + expect(catalogApi.getEntities).toHaveBeenCalledWith({ + filter: [ + { + kind: ['Group'], + 'metadata.name': 'test-group', + }, + ], + }); + }); + }); }); diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index bc78e00576..48e60b60ad 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { type EntityFilterQuery } from '@backstage/catalog-client'; import { useApi } from '@backstage/core-plugin-api'; import { catalogApiRef, @@ -44,6 +45,11 @@ export const EntityPicker = (props: EntityPickerProps) => { idSchema, } = props; const allowedKinds = uiSchema['ui:options']?.allowedKinds; + + const catalogFilter: EntityFilterQuery | undefined = + uiSchema['ui:options']?.catalogFilter || + (allowedKinds && { kind: allowedKinds }); + const defaultKind = uiSchema['ui:options']?.defaultKind; const defaultNamespace = uiSchema['ui:options']?.defaultNamespace; @@ -51,7 +57,7 @@ export const EntityPicker = (props: EntityPickerProps) => { const { value: entities, loading } = useAsync(() => catalogApi.getEntities( - allowedKinds ? { filter: { kind: allowedKinds } } : undefined, + catalogFilter ? { filter: catalogFilter } : undefined, ), ); diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts index 9236457fc0..f83dfbf817 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts @@ -16,16 +16,28 @@ import { z } from 'zod'; import { makeFieldSchemaFromZod } from '../utils'; +/** + * @public + */ +export const entityQueryFilterExpressionSchema = z.record( + z.string().or(z.array(z.string())), +); + /** * @public */ export const EntityPickerFieldSchema = makeFieldSchemaFromZod( z.string(), z.object({ + /** + * @deprecated Use `catalogFilter` instead. + */ allowedKinds: z .array(z.string()) .optional() - .describe('List of kinds of entities to derive options from'), + .describe( + 'DEPRECATED: Use `catalogFilter` instead. List of kinds of entities to derive options from', + ), defaultKind: z .string() .optional() @@ -42,6 +54,11 @@ export const EntityPickerFieldSchema = makeFieldSchemaFromZod( .describe( 'The default namespace. Options with this namespace will not be prefixed.', ), + catalogFilter: z + .array(entityQueryFilterExpressionSchema) + .or(entityQueryFilterExpressionSchema) + .optional() + .describe('List of key-value filter expression for entities'), }), ); diff --git a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx index b78d3add9e..00508593f5 100644 --- a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ +import { type EntityFilterQuery } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; @@ -32,7 +33,15 @@ describe('', () => { const onChange = jest.fn(); const schema = {}; const required = false; - let uiSchema: { 'ui:options': { allowedKinds?: string[] } }; + let uiSchema: { + 'ui:options': { + allowedKinds?: string[]; + defaultKind?: string; + allowArbitraryValues?: boolean; + defaultNamespace?: string | false; + catalogFilter?: EntityFilterQuery; + }; + }; const rawErrors: string[] = []; const formData = undefined; @@ -63,7 +72,7 @@ describe('', () => { afterEach(() => jest.resetAllMocks()); - describe('without allowedKinds', () => { + describe('without catalogFilter and allowedKinds', () => { beforeEach(() => { uiSchema = { 'ui:options': {} }; props = { @@ -108,7 +117,7 @@ describe('', () => { catalogApi.getEntities.mockResolvedValue({ items: entities }); }); - it('searches for users and groups', async () => { + it('searches for users', async () => { await renderInTestApp( @@ -122,4 +131,93 @@ describe('', () => { }); }); }); + + describe('with catalogFilter', () => { + beforeEach(() => { + uiSchema = { + 'ui:options': { + catalogFilter: [ + { + kind: ['Group'], + 'spec.type': 'team', + }, + ], + }, + }; + props = { + onChange, + schema, + required, + uiSchema, + rawErrors, + formData, + } as unknown as FieldProps; + + catalogApi.getEntities.mockResolvedValue({ items: entities }); + }); + + it('searches for group entities of type team', async () => { + await renderInTestApp( + + + , + ); + + expect(catalogApi.getEntities).toHaveBeenCalledWith({ + filter: [ + { + kind: ['Group'], + 'spec.type': 'team', + }, + ], + }); + }); + }); + + describe('catalogFilter should take precedence over allowedKinds', () => { + beforeEach(() => { + uiSchema = { + 'ui:options': { + allowedKinds: ['User'], + catalogFilter: [ + { + kind: ['Group', 'User'], + }, + { + 'spec.type': ['team', 'business-unit'], + }, + ], + }, + }; + props = { + onChange, + schema, + required, + uiSchema, + rawErrors, + formData, + } as unknown as FieldProps; + + catalogApi.getEntities.mockResolvedValue({ items: entities }); + }); + + it('searches for users and groups or teams and business units', async () => { + await renderInTestApp( + + + , + ); + + expect(catalogApi.getEntities).toHaveBeenCalledWith({ + filter: [ + { + kind: ['Group', 'User'], + }, + { + 'spec.type': ['team', 'business-unit'], + }, + ], + }); + }); + }); }); diff --git a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.tsx b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.tsx index 1c4c356906..5c69e73e12 100644 --- a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.tsx +++ b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.tsx @@ -33,14 +33,16 @@ export const OwnerPicker = (props: OwnerPickerProps) => { } = props; const defaultNamespace = uiSchema['ui:options']?.defaultNamespace; + const allowedKinds = uiSchema['ui:options']?.allowedKinds; + + const catalogFilter = uiSchema['ui:options']?.catalogFilter || { + kind: allowedKinds || ['Group', 'User'], + }; const ownerUiSchema = { ...uiSchema, 'ui:options': { - allowedKinds: (uiSchema['ui:options']?.allowedKinds || [ - 'Group', - 'User', - ]) as string[], + catalogFilter, defaultKind: 'Group', allowArbitraryValues: uiSchema['ui:options']?.allowArbitraryValues ?? true, diff --git a/plugins/scaffolder/src/components/fields/OwnerPicker/schema.ts b/plugins/scaffolder/src/components/fields/OwnerPicker/schema.ts index 56edef1343..0dbe2fa74f 100644 --- a/plugins/scaffolder/src/components/fields/OwnerPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/OwnerPicker/schema.ts @@ -15,6 +15,7 @@ */ import { z } from 'zod'; import { makeFieldSchemaFromZod } from '../utils'; +import { entityQueryFilterExpressionSchema } from '../EntityPicker/schema'; /** * @public @@ -22,12 +23,15 @@ import { makeFieldSchemaFromZod } from '../utils'; export const OwnerPickerFieldSchema = makeFieldSchemaFromZod( z.string(), z.object({ + /** + * @deprecated Use `catalogFilter` instead. + */ allowedKinds: z .array(z.string()) .default(['Group', 'User']) .optional() .describe( - 'List of kinds of entities to derive options from. Defaults to Group and User', + 'DEPRECATED: Use `catalogFilter` instead. List of kinds of entities to derive options from. Defaults to Group and User', ), allowArbitraryValues: z .boolean() @@ -39,6 +43,11 @@ export const OwnerPickerFieldSchema = makeFieldSchemaFromZod( .describe( 'The default namespace. Options with this namespace will not be prefixed.', ), + catalogFilter: z + .array(entityQueryFilterExpressionSchema) + .or(entityQueryFilterExpressionSchema) + .optional() + .describe('List of key-value filter expression for entities'), }), ); diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.test.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.test.tsx index 7fac9f7840..1edb4fb940 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.test.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useContext } from 'react'; +import React from 'react'; import { RepoUrlPicker } from './RepoUrlPicker'; import Form from '@rjsf/core'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; @@ -23,13 +23,13 @@ import { scmAuthApiRef, ScmAuthApi, } from '@backstage/integration-react'; -import { scaffolderApiRef } from '../../../api'; -import { ScaffolderApi } from '../../../types'; import { SecretsContextProvider, - SecretsContext, -} from '../../secrets/SecretsContext'; + scaffolderApiRef, + ScaffolderApi, + useTemplateSecrets, +} from '@backstage/plugin-scaffolder-react'; import { act, fireEvent } from '@testing-library/react'; describe('RepoUrlPicker', () => { @@ -119,8 +119,10 @@ describe('RepoUrlPicker', () => { describe('requestUserCredentials', () => { it('should call the scmAuthApi with the correct params', async () => { const SecretsComponent = () => { - const value = useContext(SecretsContext); - return
{JSON.stringify(value)}
; + const { secrets } = useTemplateSecrets(); + return ( +
{JSON.stringify({ secrets })}
+ ); }; const { getAllByRole, getByTestId } = await renderInTestApp( { diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx index b9762cd69d..5a78cf6195 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx @@ -18,7 +18,7 @@ import { Progress, Select, SelectItem } from '@backstage/core-components'; import FormControl from '@material-ui/core/FormControl'; import FormHelperText from '@material-ui/core/FormHelperText'; import { useApi } from '@backstage/core-plugin-api'; -import { scaffolderApiRef } from '../../../api'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; import useAsync from 'react-use/lib/useAsync'; export const RepoUrlPickerHost = (props: { diff --git a/plugins/scaffolder/src/components/fields/utils.ts b/plugins/scaffolder/src/components/fields/utils.ts index 2d3e2aab1e..7b59f1da90 100644 --- a/plugins/scaffolder/src/components/fields/utils.ts +++ b/plugins/scaffolder/src/components/fields/utils.ts @@ -19,7 +19,7 @@ import zodToJsonSchema from 'zod-to-json-schema'; import { CustomFieldExtensionSchema, FieldExtensionComponentProps, -} from '../../extensions'; +} from '@backstage/plugin-scaffolder-react'; /** * @public diff --git a/plugins/scaffolder/src/components/hooks/useEventStream.ts b/plugins/scaffolder/src/components/hooks/useEventStream.ts index bb24c0d612..0b36c85ad8 100644 --- a/plugins/scaffolder/src/components/hooks/useEventStream.ts +++ b/plugins/scaffolder/src/components/hooks/useEventStream.ts @@ -15,13 +15,13 @@ */ import { useImmerReducer } from 'use-immer'; import { useEffect } from 'react'; -import { scaffolderApiRef } from '../../api'; import { ScaffolderTask, ScaffolderTaskStatus, ScaffolderTaskOutput, LogEvent, -} from '../../types'; + scaffolderApiRef, +} from '@backstage/plugin-scaffolder-react'; import { useApi } from '@backstage/core-plugin-api'; import { Subscription } from '@backstage/types'; diff --git a/plugins/scaffolder/src/components/index.ts b/plugins/scaffolder/src/components/index.ts index 23f49ea748..a5c17b8ab0 100644 --- a/plugins/scaffolder/src/components/index.ts +++ b/plugins/scaffolder/src/components/index.ts @@ -16,7 +16,6 @@ export * from './fields'; export type { RepoUrlPickerUiOptions } from './fields'; export { TemplateTypePicker } from './TemplateTypePicker'; -export * from './secrets'; -export { TaskPage } from './TaskPage'; +export { TaskPage, type TaskPageProps } from './TaskPage'; export type { RouterProps } from './Router'; export type { ReviewStepProps } from './types'; diff --git a/plugins/scaffolder/src/deprecated.ts b/plugins/scaffolder/src/deprecated.ts new file mode 100644 index 0000000000..201f7ac7d7 --- /dev/null +++ b/plugins/scaffolder/src/deprecated.ts @@ -0,0 +1,190 @@ +/* + * 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 file is here to re-export exports from the `@backage/plugin-scaffolder-react` package to keep backwards compatibility. + * But mark them as deprecated so that any import that is using these exports will be notified that they should use the `-react` package instead. + * It's a little awkward to get the deprecated notice to show up in the API report, which is why it's all been extracted out to this file. + */ + +import { + createScaffolderFieldExtension as createScaffolderFieldExtensionTemp, + ScaffolderFieldExtensions as ScaffolderFieldExtensionsTemp, + useTemplateSecrets as useTemplateSecretsTemp, + scaffolderApiRef as scaffolderApiRefTemp, + type ScaffolderApi as ScaffolderApiTemp, + type ScaffolderUseTemplateSecrets as ScaffolderUseTemplateSecretsTemp, + type TemplateParameterSchema as TemplateParameterSchemaTemp, + type CustomFieldExtensionSchema as CustomFieldExtensionSchemaTemp, + type CustomFieldValidator as CustomFieldValidatorTemp, + type FieldExtensionOptions as FieldExtensionOptionsTemp, + type FieldExtensionComponentProps as FieldExtensionComponentPropsTemp, + type FieldExtensionComponent as FieldExtensionComponentTemp, + type ListActionsResponse as ListActionsResponseTemp, + type LogEvent as LogEventTemp, + type ScaffolderDryRunOptions as ScaffolderDryRunOptionsTemp, + type ScaffolderDryRunResponse as ScaffolderDryRunResponseTemp, + type ScaffolderGetIntegrationsListOptions as ScaffolderGetIntegrationsListOptionsTemp, + type ScaffolderGetIntegrationsListResponse as ScaffolderGetIntegrationsListResponseTemp, + type ScaffolderOutputLink as ScaffolderOutputLinkTemp, + type ScaffolderScaffoldOptions as ScaffolderScaffoldOptionsTemp, + type ScaffolderScaffoldResponse as ScaffolderScaffoldResponseTemp, + type ScaffolderStreamLogsOptions as ScaffolderStreamLogsOptionsTemp, + type ScaffolderTask as ScaffolderTaskTemp, + type ScaffolderTaskOutput as ScaffolderTaskOutputTemp, + type ScaffolderTaskStatus as ScaffolderTaskStatusTemp, +} from '@backstage/plugin-scaffolder-react'; + +import { rootRouteRef as rootRouteRefTemp } from './routes'; + +/** + * @public + * @deprecated use import from `{@link @backstage/plugin-scaffolder#scaffolderPlugin}.routes.root` instead. + */ +export const rootRouteRef = rootRouteRefTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#createScaffolderFieldExtension} instead as this has now been moved. + */ +export const createScaffolderFieldExtension = + createScaffolderFieldExtensionTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderFieldExtensions} instead as this has now been moved. + */ +export const ScaffolderFieldExtensions = ScaffolderFieldExtensionsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#useTemplateSecrets} instead as this has now been moved. + */ +export const useTemplateSecrets = useTemplateSecretsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#scaffolderApiRef} instead as this has now been moved. + */ +export const scaffolderApiRef = scaffolderApiRefTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderApi} instead as this has now been moved. + */ +export type ScaffolderApi = ScaffolderApiTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderUseTemplateSecrets} instead as this has now been moved. + */ +export type ScaffolderUseTemplateSecrets = ScaffolderUseTemplateSecretsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#TemplateParameterSchema} instead as this has now been moved. + */ +export type TemplateParameterSchema = TemplateParameterSchemaTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#CustomFieldExtensionSchema} instead as this has now been moved. + */ +export type CustomFieldExtensionSchema = CustomFieldExtensionSchemaTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#CustomFieldValidator} instead as this has now been moved. + */ +export type CustomFieldValidator = + CustomFieldValidatorTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#FieldExtensionOptions} instead as this has now been moved. + */ +export type FieldExtensionOptions = FieldExtensionOptionsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#FieldExtensionComponentProps} instead as this has now been moved. + */ +export type FieldExtensionComponentProps< + TFieldReturnValue, + TUiOptions extends {} = {}, +> = FieldExtensionComponentPropsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#FieldExtensionComponent} instead as this has now been moved. + */ +export type FieldExtensionComponent<_TReturnValue, _TInputProps> = + FieldExtensionComponentTemp<_TReturnValue, _TInputProps>; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ListActionsResponse} instead as this has now been moved. + */ +export type ListActionsResponse = ListActionsResponseTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#LogEvent} instead as this has now been moved. + */ +export type LogEvent = LogEventTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderDryRunOptions} instead as this has now been moved. + */ +export type ScaffolderDryRunOptions = ScaffolderDryRunOptionsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderDryRunResponse} instead as this has now been moved. + */ +export type ScaffolderDryRunResponse = ScaffolderDryRunResponseTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderGetIntegrationsListOptions} instead as this has now been moved. + */ +export type ScaffolderGetIntegrationsListOptions = + ScaffolderGetIntegrationsListOptionsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderGetIntegrationsListResponse} instead as this has now been moved. + */ +export type ScaffolderGetIntegrationsListResponse = + ScaffolderGetIntegrationsListResponseTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderOutputlink} instead as this has now been moved. + */ +export type ScaffolderOutputlink = ScaffolderOutputLinkTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderScaffoldOptions} instead as this has now been moved. + */ +export type ScaffolderScaffoldOptions = ScaffolderScaffoldOptionsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderScaffoldResponse} instead as this has now been moved. + */ +export type ScaffolderScaffoldResponse = ScaffolderScaffoldResponseTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderStreamLogsOptions} instead as this has now been moved. + */ +export type ScaffolderStreamLogsOptions = ScaffolderStreamLogsOptionsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderTask} instead as this has now been moved. + */ +export type ScaffolderTask = ScaffolderTaskTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderTaskOutput} instead as this has now been moved. + */ +export type ScaffolderTaskOutput = ScaffolderTaskOutputTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderTaskStatus} instead as this has now been moved. + */ +export type ScaffolderTaskStatus = ScaffolderTaskStatusTemp; diff --git a/plugins/scaffolder/src/index.ts b/plugins/scaffolder/src/index.ts index 1ed1346176..0e2b293982 100644 --- a/plugins/scaffolder/src/index.ts +++ b/plugins/scaffolder/src/index.ts @@ -19,38 +19,16 @@ * * @packageDocumentation */ +export { ScaffolderClient } from './api'; -export { scaffolderApiRef, ScaffolderClient } from './api'; -export type { - ListActionsResponse, - LogEvent, - ScaffolderApi, - ScaffolderDryRunOptions, - ScaffolderDryRunResponse, - ScaffolderGetIntegrationsListOptions, - ScaffolderGetIntegrationsListResponse, - ScaffolderOutputLink, - ScaffolderScaffoldOptions, - ScaffolderScaffoldResponse, - ScaffolderStreamLogsOptions, - ScaffolderTask, - ScaffolderTaskOutput, - ScaffolderTaskStatus, - TemplateParameterSchema, -} from './types'; export { - createScaffolderFieldExtension, - ScaffolderFieldExtensions, -} from './extensions'; -export type { - CustomFieldExtensionSchema, - CustomFieldValidator, - FieldExtensionOptions, - FieldExtensionComponentProps, - FieldExtensionComponent, -} from './extensions'; -export { createScaffolderLayout, ScaffolderLayouts } from './layouts'; -export type { LayoutOptions, LayoutTemplate, LayoutComponent } from './layouts'; + createScaffolderLayout, + ScaffolderLayouts, + type LayoutOptions, + type LayoutTemplate, + type LayoutComponent, +} from './layouts'; + export { EntityPickerFieldExtension, EntityNamePickerFieldExtension, @@ -61,23 +39,17 @@ export { ScaffolderPage, scaffolderPlugin, } from './plugin'; + export * from './components'; -export { - rootRouteRef, - nextRouteRef, - selectedTemplateRouteRef, - nextSelectedTemplateRouteRef, -} from './routes'; -export type { TaskPageProps } from './components/TaskPage'; +export * from './deprecated'; /** next exports */ export { NextScaffolderPage } from './plugin'; -export type { NextRouterProps } from './next'; -export type { TemplateGroupFilter } from './next'; -export type { FormProps } from './next'; export { - createNextScaffolderFieldExtension, - type NextCustomFieldValidator, - type NextFieldExtensionOptions, - type NextFieldExtensionComponentProps, -} from './extensions'; + nextRouteRef, + nextScaffolderTaskRouteRef, + nextSelectedTemplateRouteRef, + type TemplateGroupFilter, + type NextRouterProps, + type FormProps, +} from './next'; diff --git a/plugins/scaffolder/src/next/Router/Router.test.tsx b/plugins/scaffolder/src/next/Router/Router.test.tsx index 89f8f6ecd3..4e5535be6c 100644 --- a/plugins/scaffolder/src/next/Router/Router.test.tsx +++ b/plugins/scaffolder/src/next/Router/Router.test.tsx @@ -21,7 +21,7 @@ import { renderInTestApp } from '@backstage/test-utils'; import { createScaffolderFieldExtension, ScaffolderFieldExtensions, -} from '../../extensions'; +} from '@backstage/plugin-scaffolder-react'; import { scaffolderPlugin } from '../../plugin'; jest.mock('../TemplateListPage', () => ({ diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 7a2d2826e7..f91e56bba7 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -18,19 +18,16 @@ import { Routes, Route, useOutlet } from 'react-router-dom'; import { TemplateListPage } from '../TemplateListPage'; import { TemplateWizardPage } from '../TemplateWizardPage'; import { - FIELD_EXTENSION_WRAPPER_KEY, - FIELD_EXTENSION_KEY, - DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS, NextFieldExtensionOptions, - FieldExtensionOptions, -} from '../../extensions'; + SecretsContextProvider, + useCustomFieldExtensions, +} from '@backstage/plugin-scaffolder-react'; -import { useElementFilter } from '@backstage/core-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups'; -import { nextSelectedTemplateRouteRef } from '../../routes'; -import { SecretsContextProvider } from '../../components/secrets/SecretsContext'; -import type { FormProps } from '../types'; +import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; +import { type FormProps } from '../types'; +import { nextSelectedTemplateRouteRef } from '../routes'; /** * The Props for the Scaffolder Router @@ -55,19 +52,9 @@ export type NextRouterProps = { */ export const Router = (props: PropsWithChildren) => { const { components: { TemplateCardComponent } = {} } = props; - const outlet = useOutlet() || props.children; - - const customFieldExtensions = useElementFilter(outlet, elements => - elements - .selectByComponentData({ - key: FIELD_EXTENSION_WRAPPER_KEY, - }) - .findComponentData({ - key: FIELD_EXTENSION_KEY, - }), - ); - + const customFieldExtensions = + useCustomFieldExtensions(outlet); const fieldExtensions = [ ...customFieldExtensions, ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter( diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.test.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.test.tsx deleted file mode 100644 index 59c6989c0d..0000000000 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.test.tsx +++ /dev/null @@ -1,143 +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. - */ -jest.mock('./TemplateCard', () => ({ TemplateCard: jest.fn(() => null) })); - -import React from 'react'; -import { TemplateGroup } from './TemplateGroup'; -import { render } from '@testing-library/react'; -import { TemplateCard } from './TemplateCard'; -import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; - -describe('TemplateGroup', () => { - it('should return a message when no templates are passed in', async () => { - const { getByText } = render(); - - expect( - getByText(/No templates found that match your filter/), - ).toBeInTheDocument(); - }); - - it('should render a card for each template with the template being passed as a prop', () => { - const mockTemplates: TemplateEntityV1beta3[] = [ - { - apiVersion: 'scaffolder.backstage.io/v1beta3', - kind: 'Template', - metadata: { name: 'test' }, - spec: { - parameters: [], - steps: [], - type: 'website', - }, - }, - { - apiVersion: 'scaffolder.backstage.io/v1beta3', - kind: 'Template', - metadata: { name: 'test2' }, - spec: { - parameters: [], - steps: [], - type: 'service', - }, - }, - ]; - - render(); - - expect(TemplateCard).toHaveBeenCalledTimes(2); - - for (const template of mockTemplates) { - expect(TemplateCard).toHaveBeenCalledWith( - expect.objectContaining({ template }), - {}, - ); - } - }); - - it('should use the passed in TemplateCard prop to render the template card', () => { - const mockTemplateCardComponent = jest.fn(() => null); - - const mockTemplates: TemplateEntityV1beta3[] = [ - { - apiVersion: 'scaffolder.backstage.io/v1beta3', - kind: 'Template', - metadata: { name: 'test' }, - spec: { - parameters: [], - steps: [], - type: 'website', - }, - }, - { - apiVersion: 'scaffolder.backstage.io/v1beta3', - kind: 'Template', - metadata: { name: 'test2' }, - spec: { - parameters: [], - steps: [], - type: 'service', - }, - }, - ]; - - render( - , - ); - - expect(mockTemplateCardComponent).toHaveBeenCalledTimes(2); - - for (const template of mockTemplates) { - expect(mockTemplateCardComponent).toHaveBeenCalledWith( - expect.objectContaining({ template }), - {}, - ); - } - }); - - it('should render the title when no templates passed', () => { - const { getByText } = render(); - expect(getByText('Test')).toBeInTheDocument(); - }); - - it('should render the title when there are templates in the list', () => { - const mockTemplates: TemplateEntityV1beta3[] = [ - { - apiVersion: 'scaffolder.backstage.io/v1beta3', - kind: 'Template', - metadata: { name: 'test' }, - spec: { parameters: [], steps: [], type: 'website' }, - }, - ]; - - const { getByText } = render( - , - ); - - expect(getByText('Test')).toBeInTheDocument(); - }); - - it('should allow for passing through a user given title component', () => { - const TitleComponent =

Im a custom header

; - const { getByText } = render( - , - ); - - expect(getByText('Im a custom header')).toBeInTheDocument(); - }); -}); diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx index 2d8cdc3150..f76c1a4ab6 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx @@ -18,26 +18,33 @@ jest.mock('@backstage/plugin-catalog-react', () => ({ useEntityList: jest.fn(), })); -jest.mock('./TemplateGroup', () => ({ +jest.mock('@backstage/plugin-scaffolder-react', () => ({ TemplateGroup: jest.fn(() => null), })); import React from 'react'; -import { render } from '@testing-library/react'; import { useEntityList } from '@backstage/plugin-catalog-react'; import { TemplateGroups } from './TemplateGroups'; -import { TestApiProvider } from '@backstage/test-utils'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { errorApiRef } from '@backstage/core-plugin-api'; -import { TemplateGroup } from './TemplateGroup'; +import { TemplateGroup } from '@backstage/plugin-scaffolder-react'; +import { nextRouteRef } from '../routes'; describe('TemplateGroups', () => { + beforeEach(() => jest.clearAllMocks()); + it('should return progress if the hook is loading', async () => { (useEntityList as jest.Mock).mockReturnValue({ loading: true }); - const { findByTestId } = render( + const { findByTestId } = await renderInTestApp( , + { + mountedRoutes: { + '/next': nextRouteRef, + }, + }, ); expect(await findByTestId('progress')).toBeInTheDocument(); @@ -51,10 +58,15 @@ describe('TemplateGroups', () => { const errorApi = { post: jest.fn(), }; - render( + await renderInTestApp( , + { + mountedRoutes: { + '/next': nextRouteRef, + }, + }, ); expect(errorApi.post).toHaveBeenCalledWith(mockError); @@ -67,10 +79,15 @@ describe('TemplateGroups', () => { error: null, }); - const { findByText } = render( + const { findByText } = await renderInTestApp( , + { + mountedRoutes: { + '/next': nextRouteRef, + }, + }, ); expect(await findByText(/No templates found/)).toBeInTheDocument(); @@ -83,10 +100,15 @@ describe('TemplateGroups', () => { error: null, }); - const { findByText } = render( + const { findByText } = await renderInTestApp( , + { + mountedRoutes: { + '/next': nextRouteRef, + }, + }, ); expect(await findByText(/No templates found/)).toBeInTheDocument(); @@ -118,14 +140,23 @@ describe('TemplateGroups', () => { error: null, }); - render( + await renderInTestApp( true }]} /> , + { + mountedRoutes: { + '/next': nextRouteRef, + }, + }, ); expect(TemplateGroup).toHaveBeenCalledWith( - expect.objectContaining({ templates: mockEntities }), + expect.objectContaining({ + templates: mockEntities.map(template => + expect.objectContaining({ template }), + ), + }), {}, ); }); @@ -156,16 +187,23 @@ describe('TemplateGroups', () => { error: null, }); - render( + await renderInTestApp( e.metadata.name === 't1' }]} /> , + { + mountedRoutes: { + '/next': nextRouteRef, + }, + }, ); expect(TemplateGroup).toHaveBeenCalledWith( - expect.objectContaining({ templates: [mockEntities[0]] }), + expect.objectContaining({ + templates: [expect.objectContaining({ template: mockEntities[0] })], + }), {}, ); }); diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx index f402c0ad19..485b0e40cd 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx @@ -13,14 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React from 'react'; -import { TemplateGroup } from './TemplateGroup'; -import { Entity } from '@backstage/catalog-model'; +import React, { useCallback } from 'react'; + +import { + Entity, + parseEntityRef, + stringifyEntityRef, +} from '@backstage/catalog-model'; import { useEntityList } from '@backstage/plugin-catalog-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { Progress, Link } from '@backstage/core-components'; +import { Progress, Link, DocsIcon } from '@backstage/core-components'; import { Typography } from '@material-ui/core'; -import { errorApiRef, useApi } from '@backstage/core-plugin-api'; +import { + errorApiRef, + useApi, + useApp, + useRouteRef, +} from '@backstage/core-plugin-api'; +import { TemplateGroup } from '@backstage/plugin-scaffolder-react'; +import { viewTechDocRouteRef } from '../../routes'; +import { nextSelectedTemplateRouteRef } from '../routes'; +import { useNavigate } from 'react-router-dom'; /** * @alpha @@ -41,6 +54,17 @@ export const TemplateGroups = (props: TemplateGroupsProps) => { const { loading, error, entities } = useEntityList(); const { groups, TemplateCardComponent } = props; const errorApi = useApi(errorApiRef); + const app = useApp(); + const viewTechDocsLink = useRouteRef(viewTechDocRouteRef); + const templateRoute = useRouteRef(nextSelectedTemplateRouteRef); + const navigate = useNavigate(); + const onSelected = useCallback( + (template: TemplateEntityV1beta3) => { + const { namespace, name } = parseEntityRef(stringifyEntityRef(template)); + navigate(templateRoute({ namespace, templateName: name })); + }, + [navigate, templateRoute], + ); if (loading) { return ; @@ -65,16 +89,41 @@ export const TemplateGroups = (props: TemplateGroupsProps) => { return ( <> - {groups.map(({ title, filter }, index) => ( - - filter(e), - )} - title={title} - components={{ CardComponent: TemplateCardComponent }} - /> - ))} + {groups.map(({ title, filter }, index) => { + const templates = entities + .filter((e): e is TemplateEntityV1beta3 => filter(e)) + .map(template => { + const { kind, namespace, name } = parseEntityRef( + stringifyEntityRef(template), + ); + const additionalLinks = + template.metadata.annotations?.['backstage.io/techdocs-ref'] && + viewTechDocsLink + ? [ + { + icon: app.getSystemIcon('docs') ?? DocsIcon, + text: 'View TechDocs', + url: viewTechDocsLink({ kind, namespace, name }), + }, + ] + : []; + + return { + template, + additionalLinks, + }; + }); + + return ( + + ); + })} ); }; diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.test.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.test.tsx index 26e2994c8a..41e7897819 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.test.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.test.tsx @@ -25,7 +25,7 @@ import { TestApiProvider, } from '@backstage/test-utils'; import React from 'react'; -import { nextRouteRef } from '../../routes'; +import { nextRouteRef } from '../routes'; import { TemplateListPage } from './TemplateListPage'; describe('TemplateListPage', () => { diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx index 003c3aa98b..4eae84b866 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx @@ -35,8 +35,8 @@ import { import { CategoryPicker } from './CategoryPicker'; import { RegisterExistingButton } from './RegisterExistingButton'; import { useRouteRef } from '@backstage/core-plugin-api'; -import { registerComponentRouteRef } from '../../routes'; import { TemplateGroupFilter, TemplateGroups } from './TemplateGroups'; +import { registerComponentRouteRef } from '../../routes'; export type TemplateListPageProps = { TemplateCardComponent?: React.ComponentType<{ diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx index f36fae9aa3..c4f9c75ceb 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx @@ -22,10 +22,14 @@ import { } from '@backstage/test-utils'; import { act, fireEvent } from '@testing-library/react'; import React from 'react'; -import { scaffolderApiRef } from '../../api'; -import { nextRouteRef, rootRouteRef } from '../../routes'; -import { ScaffolderApi } from '../../types'; +import { + ScaffolderApi, + scaffolderApiRef, + SecretsContextProvider, +} from '@backstage/plugin-scaffolder-react'; import { TemplateWizardPage } from './TemplateWizardPage'; +import { rootRouteRef } from '../../routes'; +import { nextRouteRef } from '../routes'; jest.mock('react-router-dom', () => { return { @@ -73,7 +77,9 @@ describe('TemplateWizardPage', () => { const { findByRole, getByRole } = await renderInTestApp( - , + + , + , { mountedRoutes: { diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx index 92b6b005ea..24c529b094 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx @@ -13,71 +13,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useContext, useEffect } from 'react'; -import { - Page, - Header, - Content, - Progress, - InfoCard, - MarkdownContent, -} from '@backstage/core-components'; -import { NextFieldExtensionOptions } from '../../extensions'; +import React from 'react'; import { Navigate, useNavigate } from 'react-router-dom'; import { stringifyEntityRef } from '@backstage/catalog-model'; import { AnalyticsContext, - errorApiRef, useApi, useRouteRef, useRouteRefParams, } from '@backstage/core-plugin-api'; -import { scaffolderApiRef } from '../../api'; -import useAsync from 'react-use/lib/useAsync'; -import { makeStyles } from '@material-ui/core'; -import { Stepper } from './Stepper'; -import { BackstageTheme } from '@backstage/theme'; import { - nextRouteRef, - scaffolderTaskRouteRef, - selectedTemplateRouteRef, -} from '../../routes'; -import { SecretsContext } from '../../components/secrets/SecretsContext'; + scaffolderApiRef, + useTemplateSecrets, + NextFieldExtensionOptions, +} from '@backstage/plugin-scaffolder-react'; import { JsonValue } from '@backstage/types'; -import type { FormProps } from '../types'; +import { type FormProps } from '../types'; +import { nextRouteRef } from '../routes'; +import { scaffolderTaskRouteRef, selectedTemplateRouteRef } from '../../routes'; +import { Header, Page } from '@backstage/core-components'; +import { Workflow } from '@backstage/plugin-scaffolder-react'; -export type TemplateWizardPageProps = { +type TemplateWizardPageProps = { customFieldExtensions: NextFieldExtensionOptions[]; FormProps?: FormProps; }; -const useStyles = makeStyles(() => ({ - markdown: { - /** to make the styles for React Markdown not leak into the description */ - '& :first-child': { - marginTop: 0, - }, - '& :last-child': { - marginBottom: 0, - }, - }, -})); - -const useTemplateParameterSchema = (templateRef: string) => { - const scaffolderApi = useApi(scaffolderApiRef); - const { value, loading, error } = useAsync( - () => scaffolderApi.getTemplateParameterSchema(templateRef), - [scaffolderApi, templateRef], - ); - - return { manifest: value, loading, error }; -}; - export const TemplateWizardPage = (props: TemplateWizardPageProps) => { - const styles = useStyles(); const rootRef = useRouteRef(nextRouteRef); const taskRoute = useRouteRef(scaffolderTaskRouteRef); - const { secrets } = useContext(SecretsContext) ?? {}; + const { secrets } = useTemplateSecrets(); const scaffolderApi = useApi(scaffolderApiRef); const navigate = useNavigate(); const { templateName, namespace } = useRouteRefParams( @@ -90,10 +55,7 @@ export const TemplateWizardPage = (props: TemplateWizardPageProps) => { name: templateName, }); - const errorApi = useApi(errorApiRef); - const { loading, manifest, error } = useTemplateParameterSchema(templateRef); - - const onComplete = async (values: Record) => { + const onCreate = async (values: Record) => { const { taskId } = await scaffolderApi.scaffold({ templateRef, values, @@ -103,15 +65,7 @@ export const TemplateWizardPage = (props: TemplateWizardPageProps) => { navigate(taskRoute({ taskId })); }; - useEffect(() => { - if (error) { - errorApi.post(new Error(`Failed to load template, ${error}`)); - } - }, [error, errorApi]); - - if (error) { - return ; - } + const onError = () => ; return ( @@ -121,29 +75,14 @@ export const TemplateWizardPage = (props: TemplateWizardPageProps) => { title="Create a new component" subtitle="Create new software components using standard templates in your organization" /> - - {loading && } - {manifest && ( - - } - noPadding - titleTypographyProps={{ component: 'h2' }} - > - - - )} - + ); diff --git a/plugins/scaffolder/src/next/index.ts b/plugins/scaffolder/src/next/index.ts index 3a874e3b41..1ca9096459 100644 --- a/plugins/scaffolder/src/next/index.ts +++ b/plugins/scaffolder/src/next/index.ts @@ -16,5 +16,5 @@ export * from './Router'; export * from './TemplateListPage'; export * from './TemplateWizardPage'; - -export type { FormProps } from './types'; +export * from './types'; +export * from './routes'; diff --git a/plugins/scaffolder/src/next/routes.ts b/plugins/scaffolder/src/next/routes.ts new file mode 100644 index 0000000000..620122ee60 --- /dev/null +++ b/plugins/scaffolder/src/next/routes.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api'; + +/** @alpha */ +export const nextRouteRef = createRouteRef({ + id: 'scaffolder/next', +}); + +/** @alpha */ +export const nextSelectedTemplateRouteRef = createSubRouteRef({ + id: 'scaffolder/next/selected-template', + parent: nextRouteRef, + path: '/templates/:namespace/:templateName', +}); + +/** @alpha */ +export const nextScaffolderTaskRouteRef = createSubRouteRef({ + id: 'scaffolder/next/task', + parent: nextRouteRef, + path: '/tasks/:taskId', +}); diff --git a/plugins/scaffolder/src/next/types.ts b/plugins/scaffolder/src/next/types.ts index 32d0fe85f0..e9c77aa00e 100644 --- a/plugins/scaffolder/src/next/types.ts +++ b/plugins/scaffolder/src/next/types.ts @@ -13,12 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +/** + * These types will be replaced eventually by the one in the scaffolder-react plugin. + * It is a temporary solution to avoid the `/alpha` types being re-exported and that not being supported right now. + * It exists already in the `scaffolder-react` plugin, so you may have to update both files. + */ + import type { FormProps as SchemaFormProps } from '@rjsf/core-v5'; /** * Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderpage` * * @alpha + * @deprecated use the import from {@link @backstage/plugin-scaffolder-react/alpha#FormProps} instead */ export type FormProps = Pick< SchemaFormProps, diff --git a/plugins/scaffolder/src/plugin.tsx b/plugins/scaffolder/src/plugin.tsx index cfa7af8128..f6801c6371 100644 --- a/plugins/scaffolder/src/plugin.tsx +++ b/plugins/scaffolder/src/plugin.tsx @@ -15,7 +15,11 @@ */ import { scmIntegrationsApiRef } from '@backstage/integration-react'; -import { scaffolderApiRef, ScaffolderClient } from './api'; +import { + createScaffolderFieldExtension, + scaffolderApiRef, +} from '@backstage/plugin-scaffolder-react'; +import { ScaffolderClient } from './api'; import { EntityPicker, EntityPickerSchema, @@ -34,13 +38,6 @@ import { RepoUrlPicker, RepoUrlPickerSchema, } from './components/fields/RepoUrlPicker/RepoUrlPicker'; -import { createScaffolderFieldExtension } from './extensions'; -import { - nextRouteRef, - registerComponentRouteRef, - rootRouteRef, - viewTechDocRouteRef, -} from './routes'; import { createApiFactory, createPlugin, @@ -57,6 +54,14 @@ import { EntityTagsPicker, EntityTagsPickerSchema, } from './components/fields/EntityTagsPicker/EntityTagsPicker'; +import { + registerComponentRouteRef, + rootRouteRef, + viewTechDocRouteRef, + selectedTemplateRouteRef, + scaffolderTaskRouteRef, +} from './routes'; +import { nextRouteRef } from './next'; /** * The main plugin export for the scaffolder. @@ -84,6 +89,8 @@ export const scaffolderPlugin = createPlugin({ ], routes: { root: rootRouteRef, + selectedTemplate: selectedTemplateRouteRef, + ongoingTask: scaffolderTaskRouteRef, }, externalRoutes: { registerComponent: registerComponentRouteRef, diff --git a/plugins/scaffolder/src/routes.ts b/plugins/scaffolder/src/routes.ts index 7451a3a943..54b7605eb1 100644 --- a/plugins/scaffolder/src/routes.ts +++ b/plugins/scaffolder/src/routes.ts @@ -30,13 +30,16 @@ export const viewTechDocRouteRef = createExternalRouteRef({ params: ['namespace', 'kind', 'name'], }); -/** @public */ +/** + * @public + */ export const rootRouteRef = createRouteRef({ id: 'scaffolder', }); /** * @deprecated This is the old template route, can be deleted before next major release + * @public */ export const legacySelectedTemplateRouteRef = createSubRouteRef({ id: 'scaffolder/legacy/selected-template', @@ -44,37 +47,18 @@ export const legacySelectedTemplateRouteRef = createSubRouteRef({ path: '/templates/:templateName', }); -/** @alpha */ -export const nextRouteRef = createRouteRef({ - id: 'scaffolder/next', -}); - -/** @public */ export const selectedTemplateRouteRef = createSubRouteRef({ id: 'scaffolder/selected-template', parent: rootRouteRef, path: '/templates/:namespace/:templateName', }); -/** @alpha */ -export const nextSelectedTemplateRouteRef = createSubRouteRef({ - id: 'scaffolder/next/selected-template', - parent: nextRouteRef, - path: '/templates/:namespace/:templateName', -}); - export const scaffolderTaskRouteRef = createSubRouteRef({ id: 'scaffolder/task', parent: rootRouteRef, path: '/tasks/:taskId', }); -export const nextScaffolderTaskRouteRef = createSubRouteRef({ - id: 'scaffolder/next/task', - parent: nextRouteRef, - path: '/tasks/:taskId', -}); - export const scaffolderListTaskRouteRef = createSubRouteRef({ id: 'scaffolder/list-tasks', parent: rootRouteRef, diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 75060fe96f..5d4249e882 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,51 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.1.1 + +### Patch Changes + +- 011bd518b7: Fixed spelling mistakes in documentation. +- 1e1a9fe979: Fixed a bug that could cause an indexing process to silently fail, timeout, and accumulate stale indices. +- 2a49ffbcb3: Improved documentation on the `ElasticSearchSearchEngine.newClient()` method. +- 56633804dd: Fixed a bug that could cause the backstage backend to unexpectedly terminate when client errors were encountered during the indexing process. +- aa33a06894: Improved index throughput by optimizing when and how many documents were made available to the bulk client. +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.1 + - @backstage/config@1.0.6 + - @backstage/plugin-search-common@1.2.1 + +## 1.1.1-next.2 + +### Patch Changes + +- 2a49ffbcb3: Improved documentation on the `ElasticSearchSearchEngine.newClient()` method. +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.1-next.2 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-search-backend-node@1.1.1-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.1.1-next.0 + +### Patch Changes + +- 011bd518b7: Fixed spelling mistakes in documentation. +- 1e1a9fe979: Fixed a bug that could cause an indexing process to silently fail, timeout, and accumulate stale indices. +- 56633804dd: Fixed a bug that could cause the backstage backend to unexpectedly terminate when client errors were encountered during the indexing process. +- aa33a06894: Improved index throughput by optimizing when and how many documents were made available to the bulk client. +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.1-next.0 + - @backstage/config@1.0.5 + - @backstage/plugin-search-common@1.2.0 + ## 1.1.0 ### Minor Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index fa1868879e..dc3766116a 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.1.0", + "version": "1.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts index ae7fcf7cff..9edad973de 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import { awsGetCredentials, createAWSConnection } from 'aws-os-connection'; -import { Config } from '@backstage/config'; import { IndexableDocument, IndexableResult, @@ -23,15 +21,18 @@ import { SearchEngine, SearchQuery, } from '@backstage/plugin-search-common'; +import { awsGetCredentials, createAWSConnection } from 'aws-os-connection'; +import { isEmpty, isNumber, isNaN as nan } from 'lodash'; + +import { Config } from '@backstage/config'; +import { ElasticSearchClientOptions } from './ElasticSearchClientOptions'; +import { ElasticSearchClientWrapper } from './ElasticSearchClientWrapper'; +import { ElasticSearchCustomIndexTemplate } from './types'; +import { ElasticSearchSearchEngineIndexer } from './ElasticSearchSearchEngineIndexer'; +import { Logger } from 'winston'; import { MissingIndexError } from '@backstage/plugin-search-backend-node'; import esb from 'elastic-builder'; -import { isEmpty, isNaN as nan, isNumber } from 'lodash'; import { v4 as uuid } from 'uuid'; -import { Logger } from 'winston'; -import { ElasticSearchClientOptions } from './ElasticSearchClientOptions'; -import { ElasticSearchSearchEngineIndexer } from './ElasticSearchSearchEngineIndexer'; -import { ElasticSearchCustomIndexTemplate } from './types'; -import { ElasticSearchClientWrapper } from './ElasticSearchClientWrapper'; export type { ElasticSearchClientOptions }; @@ -63,7 +64,7 @@ export type ElasticSearchQueryTranslator = ( ) => ElasticSearchConcreteQuery; /** - * Options for instansiate ElasticSearchSearchEngine + * Options for instantiate ElasticSearchSearchEngine * @public */ export type ElasticSearchOptions = { @@ -170,9 +171,23 @@ export class ElasticSearchSearchEngine implements SearchEngine { } /** - * Create a custom search client from the derived elastic search - * configuration. This need not be the same client that the engine uses - * internally. + * Create a custom search client from the derived search client configuration. + * This need not be the same client that the engine uses internally. + * + * @example Instantiate an instance of an Elasticsearch client. + * ```ts + * import { isOpenSearchCompatible } from '@backstage/plugin-search-backend-module-elasticsearch'; + * import { Client } from '@elastic/elasticsearch'; + * + * const client = searchEngine.newClient(options => { + * // This typeguard ensures options are compatible with either OpenSearch + * // or Elasticsearch client constructors. + * if (!isOpenSearchCompatible(options)) { + * return new Client(options); + * } + * throw new Error('Incompatible options provided'); + * }); + * ``` */ newClient(create: (options: ElasticSearchClientOptions) => T): T { return create(this.elasticSearchClientOptions); diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.test.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.test.ts index 92193976b4..94b59fcf42 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.test.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.test.ts @@ -250,4 +250,33 @@ describe('ElasticSearchSearchEngineIndexer', () => { // Final deletion shouldn't be called. expect(deleteSpy).not.toHaveBeenCalled(); }); + + it('handles bulk client rejection', async () => { + // Given an ES client wrapper that rejects an error + const expectedError = new Error('HTTP Timeout'); + const mockClientWrapper = ElasticSearchClientWrapper.fromClientOptions({ + node: 'http://localhost:9200', + Connection: mock.getConnection(), + }); + mockClientWrapper.bulk = jest.fn().mockRejectedValue(expectedError); + + // And a search engine indexer that uses that client wrapper + indexer = new ElasticSearchSearchEngineIndexer({ + type: 'some-type', + indexPrefix: '', + indexSeparator: '-index__', + alias: 'some-type-index__search', + logger: getVoidLogger(), + elasticSearchClientWrapper: mockClientWrapper, + batchSize: 1000, + }); + + // When the indexer is run in the test pipeline + const { error } = await TestPipeline.fromIndexer(indexer) + .withDocuments([{ title: 'a', location: 'a', text: '/a' }]) + .execute(); + + // Then the pipeline should have received the expected error + expect(error).toBe(expectedError); + }); }); diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.ts index 1b1d47bb9b..a9d15c421e 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngineIndexer.ts @@ -15,13 +15,13 @@ */ import { BatchSearchEngineIndexer } from '@backstage/plugin-search-backend-node'; -import { IndexableDocument } from '@backstage/plugin-search-common'; -import { Readable } from 'stream'; -import { Logger } from 'winston'; import { ElasticSearchClientWrapper } from './ElasticSearchClientWrapper'; +import { IndexableDocument } from '@backstage/plugin-search-common'; +import { Logger } from 'winston'; +import { Readable } from 'stream'; /** - * Options for instansiate ElasticSearchSearchEngineIndexer + * Options for instantiate ElasticSearchSearchEngineIndexer * @public */ export type ElasticSearchSearchEngineIndexerOptions = { @@ -45,7 +45,6 @@ function duration(startTimestamp: [number, number]): string { * @public */ export class ElasticSearchSearchEngineIndexer extends BatchSearchEngineIndexer { - private received: number = 0; private processed: number = 0; private removableIndices: string[] = []; @@ -59,10 +58,13 @@ export class ElasticSearchSearchEngineIndexer extends BatchSearchEngineIndexer { private readonly logger: Logger; private readonly sourceStream: Readable; private readonly elasticSearchClientWrapper: ElasticSearchClientWrapper; + private configuredBatchSize: number; private bulkResult: Promise; + private bulkClientError?: Error; constructor(options: ElasticSearchSearchEngineIndexerOptions) { super({ batchSize: options.batchSize }); + this.configuredBatchSize = options.batchSize; this.logger = options.logger.child({ documentType: options.type }); this.startTimestamp = process.hrtime(); this.type = options.type; @@ -94,6 +96,11 @@ export class ElasticSearchSearchEngineIndexer extends BatchSearchEngineIndexer { }, refreshOnCompletion: that.indexName, }); + + // Safely catch errors thrown by the bulk helper client, e.g. HTTP timeouts + this.bulkResult.catch(e => { + this.bulkClientError = e; + }); } async initialize(): Promise { @@ -115,7 +122,6 @@ export class ElasticSearchSearchEngineIndexer extends BatchSearchEngineIndexer { async index(documents: IndexableDocument[]): Promise { await this.isReady(); documents.forEach(document => { - this.received++; this.sourceStream.push(document); }); } @@ -197,11 +203,41 @@ export class ElasticSearchSearchEngineIndexer extends BatchSearchEngineIndexer { * backpressure in other parts of the indexing pipeline. */ private isReady(): Promise { - return new Promise(resolve => { + // Early exit if the underlying ES client encountered an error. + if (this.bulkClientError) { + return Promise.reject(this.bulkClientError); + } + + // Optimization: if the stream that ES reads from has fewer docs queued + // than the configured batch size, continue early to allow more docs to be + // queued + if (this.sourceStream.readableLength < this.configuredBatchSize) { + return Promise.resolve(); + } + + // Otherwise, continue periodically checking the stream queue to see if + // ES has consumed the documents and continue when it's ready for more. + return new Promise((isReady, abort) => { + let streamLengthChecks = 0; const interval = setInterval(() => { - if (this.received === this.processed) { + streamLengthChecks++; + + if (this.sourceStream.readableLength < this.configuredBatchSize) { clearInterval(interval); - resolve(); + isReady(); + } + + // Do not allow this interval to loop endlessly; anything longer than 5 + // minutes likely indicates an unrecoverable error in ES; direct the + // user to inspect ES logs for more clues and abort in order to allow + // the index to be cleaned up. + if (streamLengthChecks >= 6000) { + clearInterval(interval); + abort( + new Error( + 'Exceeded 5 minutes waiting for elastic to be ready to accept more documents. Check the elastic logs for possible problems.', + ), + ); } }, 50); }); diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index bcede8121b..7f6888ac53 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,45 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/plugin-search-backend-node@1.1.1 + - @backstage/config@1.0.6 + - @backstage/plugin-search-common@1.2.1 + +## 0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-search-backend-node@1.1.1-next.2 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-search-backend-node@1.1.1-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.1-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/plugin-search-common@1.2.0 + ## 0.5.0 ### Minor Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index fae43de36a..acc0d6fa01 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.0", + "version": "0.5.1", "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 f119c80353..a56f7aa349 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-search-backend-node +## 1.1.1 + +### Patch Changes + +- 011bd518b7: Fixed spelling mistakes in documentation. +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/backend-tasks@0.4.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + +## 1.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.1.1-next.0 + +### Patch Changes + +- 011bd518b7: Fixed spelling mistakes in documentation. +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-search-common@1.2.0 + ## 1.1.0 ### Minor Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 08f0b45cb6..e82319fdb6 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.1.0", + "version": "1.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.test.ts b/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.test.ts index c08db8f28e..addcb87497 100644 --- a/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.test.ts +++ b/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.test.ts @@ -53,7 +53,6 @@ describe('DefaultCatalogCollatorFactory', () => { readable._read = () => {}; reader = { search: jest.fn(), - read: jest.fn(), readTree: jest.fn(), readUrl: jest.fn(), }; diff --git a/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.ts b/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.ts index 9d922aace6..de77f5ba7a 100644 --- a/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.ts +++ b/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import { UrlReader } from '@backstage/backend-common'; import { Config } from '@backstage/config'; -import { Permission } from '@backstage/plugin-permission-common'; import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; -import { parse as parseNdjson } from 'ndjson'; -import { Readable } from 'stream'; import { Logger } from 'winston'; +import { Permission } from '@backstage/plugin-permission-common'; +import { Readable } from 'stream'; +import { UrlReader } from '@backstage/backend-common'; +import { parse as parseNdjson } from 'ndjson'; /** - * Options for instansiate NewlineDelimitedJsonCollatorFactory + * Options for instantiate NewlineDelimitedJsonCollatorFactory * @public */ export type NewlineDelimitedJsonCollatorFactoryOptions = { diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index b296c171c9..fecb4cb9ea 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,67 @@ # @backstage/plugin-search-backend +## 1.2.1 + +### Patch Changes + +- bfd66b0478: Allow max page limit for search results to be configurable +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/plugin-search-backend-node@1.1.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.3 + - @backstage/plugin-search-common@1.2.1 + +## 1.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/plugin-permission-node@0.7.3-next.1 + - @backstage/plugin-search-backend-node@1.1.1-next.2 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-permission-node@0.7.3-next.0 + - @backstage/plugin-search-backend-node@1.1.1-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.2.1-next.0 + +### Patch Changes + +- bfd66b0478: Allow max page limit for search results to be configurable +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.1-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-permission-node@0.7.2 + - @backstage/plugin-search-common@1.2.0 + ## 1.2.0 ### Minor Changes diff --git a/plugins/search-backend/config.d.ts b/plugins/search-backend/config.d.ts index 99f4d0ab2f..3dbdf78dfe 100644 --- a/plugins/search-backend/config.d.ts +++ b/plugins/search-backend/config.d.ts @@ -17,6 +17,11 @@ export interface Config { /** Configuration options for the search plugin */ search?: { + /** + * Sets the maximum max page limit size. Defaults to 100. + */ + maxPageLimit?: number; + /** * Options related to the search integration with the Backstage permissions system */ diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 6032f1af79..54b374011f 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.2.0", + "version": "1.2.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -48,6 +48,7 @@ "supertest": "^6.1.3" }, "files": [ - "dist" + "dist", + "config.d.ts" ] } diff --git a/plugins/search-backend/src/service/router.test.ts b/plugins/search-backend/src/service/router.test.ts index c3eb6ea00f..1dbd145bce 100644 --- a/plugins/search-backend/src/service/router.test.ts +++ b/plugins/search-backend/src/service/router.test.ts @@ -59,7 +59,10 @@ describe('createRouter', () => { 'first-type': {}, 'second-type': {}, }, - config: new ConfigReader({ permissions: { enabled: false } }), + config: new ConfigReader({ + permissions: { enabled: false }, + search: { maxPageLimit: 200 }, + }), permissions: mockPermissionEvaluator, logger, }); @@ -112,8 +115,8 @@ describe('createRouter', () => { }); }); - it('should accept per page value under or equal to 100', async () => { - const response = await request(app).get(`/query?pageLimit=30`); + it('should accept per page value under or equal to configured max', async () => { + const response = await request(app).get(`/query?pageLimit=200`); expect(response.status).toEqual(200); expect(response.body).toMatchObject({ @@ -121,13 +124,13 @@ describe('createRouter', () => { }); }); - it('should reject per page value over 100', async () => { - const response = await request(app).get(`/query?pageLimit=200`); + it('should reject per page value over configured max', async () => { + const response = await request(app).get(`/query?pageLimit=300`); expect(response.status).toEqual(400); expect(response.body).toMatchObject({ error: { - message: /The page limit "200" is greater than "100"/i, + message: /The page limit "300" is greater than "200"/i, }, }); }); diff --git a/plugins/search-backend/src/service/router.ts b/plugins/search-backend/src/service/router.ts index 0100c35e1d..b51dcead14 100644 --- a/plugins/search-backend/src/service/router.ts +++ b/plugins/search-backend/src/service/router.ts @@ -62,7 +62,7 @@ export type RouterOptions = { logger: Logger; }; -const maxPageLimit = 100; +const defaultMaxPageLimit = 100; const allowedLocationProtocols = ['http:', 'https:']; /** @@ -73,6 +73,9 @@ export async function createRouter( ): Promise { const { engine: inputEngine, types, permissions, config, logger } = options; + const maxPageLimit = + config.getOptionalNumber('search.maxPageLimit') ?? defaultMaxPageLimit; + const requestSchema = z.object({ term: z.string().default(''), filters: jsonObjectSchema.optional(), diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index 6a56375f0a..7b6dafa270 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-common +## 1.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3 + +## 1.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3-next.0 + ## 1.2.0 ### Minor Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index 807f16a32b..99c44fa93f 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.0", + "version": "1.2.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 2df1d8f47c..37214bdb82 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,127 @@ # @backstage/plugin-search-react +## 1.4.0 + +### Minor Changes + +- 6d9a93def8: Allow customizing empty state component through `noResultsComponent` property. + + Example: + + ```jsx + No results were found}> + {({ results }) => ( + + {results.map(({ type, document }) => { + switch (type) { + case 'custom-result-item': + return ( + + ); + default: + return ( + + ); + } + })} + + )} + + ``` + +### Patch Changes + +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1 + +## 1.4.0-next.2 + +### Minor Changes + +- 6d9a93def8: Allow customizing empty state component through `noResultsComponent` property. + + Example: + + ```jsx + No results were found}> + {({ results }) => ( + + {results.map(({ type, document }) => { + switch (type) { + case 'custom-result-item': + return ( + + ); + default: + return ( + + ); + } + })} + + )} + + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.0 + +## 1.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 1.3.0 ### Minor Changes diff --git a/plugins/search-react/api-report.md b/plugins/search-react/api-report.md index ef3e8b19bd..3d1e4091ea 100644 --- a/plugins/search-react/api-report.md +++ b/plugins/search-react/api-report.md @@ -402,6 +402,7 @@ export const SearchResultPager: () => JSX.Element; // @public export type SearchResultProps = Pick & { children: (resultSet: SearchResultSet) => JSX.Element; + noResultsComponent?: JSX.Element; }; // @public diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 9f4bd5a4f2..e69ec2e7ae 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.3.0", + "version": "1.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx index 830cb61780..6158aed008 100644 --- a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx +++ b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx @@ -28,6 +28,7 @@ import { Box, Divider, } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { Link } from '@backstage/core-components'; /** @@ -85,7 +86,8 @@ export const DefaultResultListItemComponent = ({ } secondary={ - + } /> {secondaryAction && {secondaryAction}} diff --git a/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx b/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx index 6f536510e8..ef9b0d6b5c 100644 --- a/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx +++ b/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx @@ -218,3 +218,32 @@ export const GroupLayout = () => { ); }; + +export const WithCustomNoResultsComponent = () => { + return ( + No results were found}> + {({ results }) => ( + + {results.map(({ type, document }) => { + switch (type) { + case 'custom-result-item': + return ( + + ); + default: + return ( + + ); + } + })} + + )} + + ); +}; diff --git a/plugins/search-react/src/components/SearchResult/SearchResult.test.tsx b/plugins/search-react/src/components/SearchResult/SearchResult.test.tsx index 988d59d7cf..5972eaa891 100644 --- a/plugins/search-react/src/components/SearchResult/SearchResult.test.tsx +++ b/plugins/search-react/src/components/SearchResult/SearchResult.test.tsx @@ -93,6 +93,22 @@ describe('SearchResult', () => { }); }); + it('On empty result value state with custom component', async () => { + (useSearch as jest.Mock).mockReturnValueOnce({ + result: { loading: false, error: '', value: { results: [] } }, + }); + + const { getByText } = await renderInTestApp( + No results found}> + {() => <>} + , + ); + + await waitFor(() => { + expect(getByText('No results found')).toBeInTheDocument(); + }); + }); + it('Calls children with results set to result.value', async () => { (useSearch as jest.Mock).mockReturnValueOnce({ result: { diff --git a/plugins/search-react/src/components/SearchResult/SearchResult.tsx b/plugins/search-react/src/components/SearchResult/SearchResult.tsx index dd11f42903..333156aab9 100644 --- a/plugins/search-react/src/components/SearchResult/SearchResult.tsx +++ b/plugins/search-react/src/components/SearchResult/SearchResult.tsx @@ -167,6 +167,7 @@ export const SearchResultState = (props: SearchResultStateProps) => { */ export type SearchResultProps = Pick & { children: (resultSet: SearchResultSet) => JSX.Element; + noResultsComponent?: JSX.Element; }; /** @@ -176,7 +177,13 @@ export type SearchResultProps = Pick & { * @public */ export const SearchResultComponent = (props: SearchResultProps) => { - const { query, children } = props; + const { + query, + children, + noResultsComponent = ( + + ), + } = props; return ( @@ -195,9 +202,7 @@ export const SearchResultComponent = (props: SearchResultProps) => { } if (!value?.results.length) { - return ( - - ); + return noResultsComponent; } return children(value); diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 29d17c63db..ea24b77523 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,84 @@ # @backstage/plugin-search +## 1.0.7 + +### Patch Changes + +- a24387c6de: When the search modal is opened, the focus is placed on the search bar input field. +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-search-react@1.4.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1 + +## 1.0.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-search-react@1.3.2-next.1 + +## 1.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.0 + - @backstage/plugin-search-react@1.3.2-next.0 + +## 1.0.6 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + - @backstage/plugin-search-react@1.3.1 + ## 1.0.5 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 301bcb1fc6..21b6631504 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.0.5", + "version": "1.0.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/src/components/SearchModal/SearchModal.test.tsx b/plugins/search/src/components/SearchModal/SearchModal.test.tsx index 3ef9291585..d24764f5d4 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.test.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.test.tsx @@ -153,4 +153,19 @@ describe('SearchModal', () => { expect(getByTestId('search-bar-next')).toBeInTheDocument(); expect(getByTestId('search-bar-next')).not.toBeVisible(); }); + + it('should focus on its search bar when opened', async () => { + await renderInTestApp( + + , + { + mountedRoutes: { + '/search': rootRouteRef, + }, + }, + ); + + expect(screen.getByLabelText('Search')).toHaveFocus(); + }); }); diff --git a/plugins/search/src/components/SearchModal/SearchModal.tsx b/plugins/search/src/components/SearchModal/SearchModal.tsx index 9b95a0afaa..b1a0b2cd45 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import React from 'react'; +import React, { KeyboardEvent, useRef, useEffect, useCallback } from 'react'; +import { useNavigate } from 'react-router-dom'; import { Dialog, DialogActions, @@ -26,6 +27,7 @@ import { Paper, useTheme, } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import LaunchIcon from '@material-ui/icons/Launch'; import { makeStyles } from '@material-ui/core/styles'; import { @@ -93,27 +95,43 @@ const useStyles = makeStyles(theme => ({ })); export const Modal = ({ toggleModal }: SearchModalProps) => { - const getSearchLink = useRouteRef(rootRouteRef); const classes = useStyles(); + const navigate = useNavigate(); + const { transitions } = useTheme(); + const { focusContent } = useContent(); const { term } = useSearch(); - const { focusContent } = useContent(); - const { transitions } = useTheme(); + const searchBarRef = useRef(null); + const searchPagePath = `${useRouteRef(rootRouteRef)()}?query=${term}`; - const handleResultClick = () => { + useEffect(() => { + searchBarRef?.current?.focus(); + }); + + const handleSearchResultClick = useCallback(() => { toggleModal(); setTimeout(focusContent, transitions.duration.leavingScreen); - }; + }, [toggleModal, focusContent, transitions]); - const handleKeyPress = () => { - handleResultClick(); - }; + const handleSearchBarKeyDown = useCallback( + (e: KeyboardEvent) => { + if (e.key === 'Enter') { + navigate(searchPagePath); + handleSearchResultClick(); + } + }, + [navigate, handleSearchResultClick, searchPagePath], + ); return ( <> - + @@ -124,14 +142,10 @@ export const Modal = ({ toggleModal }: SearchModalProps) => { alignItems="center" > - { - toggleModal(); - setTimeout(focusContent, transitions.duration.leavingScreen); - }} - to={`${getSearchLink()}?query=${term}`} - > - View Full Results + + + View Full Results + @@ -145,8 +159,8 @@ export const Modal = ({ toggleModal }: SearchModalProps) => { role="button" tabIndex={0} key={`${document.location}-btn`} - onClick={handleResultClick} - onKeyPress={handleKeyPress} + onClick={handleSearchResultClick} + onKeyDown={handleSearchResultClick} > { it('should render a link that lead to Sentry', async () => { @@ -33,11 +31,7 @@ describe('Sentry error cell component', () => { userCount: 2, permalink: 'http://example.com', }; - const cell = render( - - - , - ); + const cell = await renderInTestApp(); const errorType = await cell.findByText('Exception'); expect(errorType.closest('a')).toHaveAttribute( 'href', @@ -53,11 +47,7 @@ describe('Sentry error cell component', () => { userCount: 2, permalink: 'http://example.com', }; - const cell = render( - - - , - ); + const cell = await renderInTestApp(); const errorType = await cell.findByText('Exception: Could not load cr...'); expect(errorType.closest('a')).toHaveAttribute( 'href', diff --git a/plugins/sentry/src/components/SentryIssuesTable/SentryIssuesTable.test.tsx b/plugins/sentry/src/components/SentryIssuesTable/SentryIssuesTable.test.tsx index 2516d37788..647208f141 100644 --- a/plugins/sentry/src/components/SentryIssuesTable/SentryIssuesTable.test.tsx +++ b/plugins/sentry/src/components/SentryIssuesTable/SentryIssuesTable.test.tsx @@ -15,12 +15,10 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; import SentryIssuesTable from './SentryIssuesTable'; import { SentryIssue } from '../../api'; import mockIssue from '../../api/mock/sentry-issue-mock.json'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; +import { renderInTestApp } from '@backstage/test-utils'; describe('SentryIssuesTable', () => { it('should render headers in a table', async () => { @@ -35,19 +33,17 @@ describe('SentryIssuesTable', () => { userCount: 2, }, ]; - const table = await render( - - - , + const table = await renderInTestApp( + , ); expect(await table.findByText('Error')).toBeInTheDocument(); expect(await table.findByText('Graph')).toBeInTheDocument(); @@ -68,19 +64,17 @@ describe('SentryIssuesTable', () => { userCount: 202, }, ]; - const table = await render( - - - , + const table = await renderInTestApp( + , ); expect(await table.findByText('Exception')).toBeInTheDocument(); expect(await table.findByText('exception was thrown')).toBeInTheDocument(); @@ -99,19 +93,17 @@ describe('SentryIssuesTable', () => { userCount: 202, }, ]; - const table = await render( - - - , + const table = await renderInTestApp( + , ); expect(await table.findByText('Last 24h')).toBeInTheDocument(); }); diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index 6903839534..f301ff2692 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,52 @@ # @backstage/plugin-shortcuts +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.3.4 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 39d272279d..22e5abe6ad 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.4", + "version": "0.3.6", "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 e814df1577..57a32877e6 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-sonarqube-backend +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + ## 0.1.4 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 2ac659768a..4f1e560bd0 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.1.4", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index feec05cbab..5368c648dc 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-sonarqube-react +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/core-plugin-api@1.3.0 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/core-plugin-api@1.2.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index ad66e526e5..9332cc5548 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.0", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 10f6e984ad..e2e76c2b89 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,62 @@ # @backstage/plugin-sonarqube +## 0.6.2 + +### Patch Changes + +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-sonarqube-react@0.1.1 + +## 0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-sonarqube-react@0.1.1-next.2 + +## 0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-sonarqube-react@0.1.1-next.1 + +## 0.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-sonarqube-react@0.1.1-next.0 + +## 0.6.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.6.0 ### Minor Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 39cc45201b..af04494906 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.0", + "version": "0.6.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/src/components/SonarQubeCard/Value.tsx b/plugins/sonarqube/src/components/SonarQubeCard/Value.tsx index a166f62a89..2f136cc5fe 100644 --- a/plugins/sonarqube/src/components/SonarQubeCard/Value.tsx +++ b/plugins/sonarqube/src/components/SonarQubeCard/Value.tsx @@ -16,6 +16,7 @@ import { BackstageTheme } from '@backstage/theme'; import { makeStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; const useStyles = makeStyles((theme: BackstageTheme) => { @@ -29,5 +30,9 @@ const useStyles = makeStyles((theme: BackstageTheme) => { export const Value = (props: { value?: string }) => { const classes = useStyles(); - return {props.value}; + return ( + + {props.value} + + ); }; diff --git a/plugins/sonarqube/src/components/SonarQubeContentPage/SonarQubeContentPage.test.tsx b/plugins/sonarqube/src/components/SonarQubeContentPage/SonarQubeContentPage.test.tsx index 22175d14bc..59258e5312 100644 --- a/plugins/sonarqube/src/components/SonarQubeContentPage/SonarQubeContentPage.test.tsx +++ b/plugins/sonarqube/src/components/SonarQubeContentPage/SonarQubeContentPage.test.tsx @@ -16,8 +16,6 @@ import { EntityProvider } from '@backstage/plugin-catalog-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; import React from 'react'; import { isSonarQubeAvailable, @@ -44,7 +42,7 @@ const Providers = ({ kind: 'Component', }} > - {children} + {children}
); diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 739fea3c6c..05e2fa7794 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-splunk-on-call +## 0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.4.1 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 60ab22ff15..3b8aebcd71 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.1", + "version": "0.4.3", "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 5a77d47a98..a29993ea05 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-stack-overflow-backend +## 0.1.9 + +### Patch Changes + +- 06f6a4f0f1: Enable configuration override for StackOverflow backend plugin when instantiating the search indexer. This makes it possible to set different configuration for frontend and backend of the plugin. +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/plugin-search-common@1.2.1 + +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.1.9-next.0 + +### Patch Changes + +- 06f6a4f0f1: Enable configuration override for StackOverflow backend plugin when instantiating the search indexer. This makes it possible to set different configuration for frontend and backend of the plugin. +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/plugin-search-common@1.2.0 + ## 0.1.8 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index 87f312c876..857ea48fba 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.1.8", + "version": "0.1.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,13 +32,19 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/cli": "workspace:^", + "@backstage/backend-common": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "node-fetch": "^2.6.7", "qs": "^6.9.4", "winston": "^3.2.1" }, + "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", + "@backstage/cli": "workspace:^", + "@backstage/plugin-search-backend-node": "workspace:^", + "msw": "^0.49.0" + }, "files": [ "dist", "config.d.ts" diff --git a/plugins/stack-overflow-backend/src/search/StackOverflowQuestionsCollatorFactory.test.ts b/plugins/stack-overflow-backend/src/search/StackOverflowQuestionsCollatorFactory.test.ts new file mode 100644 index 0000000000..bdc5be125c --- /dev/null +++ b/plugins/stack-overflow-backend/src/search/StackOverflowQuestionsCollatorFactory.test.ts @@ -0,0 +1,143 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getVoidLogger } from '@backstage/backend-common'; +import { + StackOverflowQuestionsCollatorFactory, + StackOverflowQuestionsCollatorFactoryOptions, +} from './StackOverflowQuestionsCollatorFactory'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { TestPipeline } from '@backstage/plugin-search-backend-node'; +import { ConfigReader } from '@backstage/config'; +import { Readable } from 'stream'; +import { setupServer } from 'msw/node'; +import { rest } from 'msw'; + +const logger = getVoidLogger(); + +const mockQuestion = { + items: [ + { + tags: ['backstage'], + owner: { + display_name: 'The Riddler', + }, + answer_count: 1, + link: 'https://stack.overflow.local/questions/2911', + title: 'This is the first question', + }, + ], + has_more: false, +}; + +const mockOverrideQuestion = { + items: [ + { + tags: ['backstage'], + owner: { + display_name: 'The Riddler', + }, + answer_count: 1, + link: 'https://stack.overflow.local/questions/1', + title: 'This is the first question', + }, + { + tags: ['backstage'], + owner: { + display_name: 'The Riddler', + }, + answer_count: 1, + link: 'https://stack.overflow.local/questions/2', + title: 'this is another question', + }, + ], + has_more: false, +}; + +describe('StackOverflowQuestionsCollatorFactory', () => { + const config = new ConfigReader({ + stackoverflow: { + baseUrl: 'http://stack.overflow.local', + }, + }); + + const defaultOptions: StackOverflowQuestionsCollatorFactoryOptions = { + logger, + requestParams: { + tagged: ['developer-portal'], + pagesize: 100, + order: 'desc', + sort: 'activity', + }, + }; + + it('has expected type', () => { + const factory = StackOverflowQuestionsCollatorFactory.fromConfig( + config, + defaultOptions, + ); + expect(factory.type).toBe('stack-overflow'); + }); + + describe('getCollator', () => { + const worker = setupServer(); + setupRequestMockHandlers(worker); + + it('returns a readable stream', async () => { + const factory = StackOverflowQuestionsCollatorFactory.fromConfig( + config, + defaultOptions, + ); + const collator = await factory.getCollator(); + expect(collator).toBeInstanceOf(Readable); + }); + + it('fetches from the configured endpoint', async () => { + worker.use( + rest.get('http://stack.overflow.local/questions', (_, res, ctx) => + res(ctx.status(200), ctx.json(mockQuestion)), + ), + ); + const factory = StackOverflowQuestionsCollatorFactory.fromConfig( + config, + defaultOptions, + ); + const collator = await factory.getCollator(); + const pipeline = TestPipeline.fromCollator(collator); + const { documents } = await pipeline.execute(); + + expect(documents).toHaveLength(mockQuestion.items.length); + }); + + it('fetches from the overridden endpoint', async () => { + worker.use( + rest.get('http://stack.overflow.override/questions', (_, res, ctx) => + res(ctx.status(200), ctx.json(mockOverrideQuestion)), + ), + ); + const factory = StackOverflowQuestionsCollatorFactory.fromConfig(config, { + logger, + baseUrl: 'http://stack.overflow.override', + requestParams: defaultOptions.requestParams, + }); + const collator = await factory.getCollator(); + + const pipeline = TestPipeline.fromCollator(collator); + const { documents } = await pipeline.execute(); + + expect(documents).toHaveLength(mockOverrideQuestion.items.length); + }); + }); +}); diff --git a/plugins/stack-overflow-backend/src/search/StackOverflowQuestionsCollatorFactory.ts b/plugins/stack-overflow-backend/src/search/StackOverflowQuestionsCollatorFactory.ts index ebbad99d0a..807d6637c1 100644 --- a/plugins/stack-overflow-backend/src/search/StackOverflowQuestionsCollatorFactory.ts +++ b/plugins/stack-overflow-backend/src/search/StackOverflowQuestionsCollatorFactory.ts @@ -95,11 +95,11 @@ export class StackOverflowQuestionsCollatorFactory 'https://api.stackexchange.com/2.2'; const maxPage = options.maxPage || 100; return new StackOverflowQuestionsCollatorFactory({ - ...options, baseUrl, maxPage, apiKey, apiAccessToken, + ...options, }); } diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index 5241a47513..a6af55488a 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,67 @@ # @backstage/plugin-stack-overflow +## 0.1.10 + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/plugin-home@0.4.30 + - @backstage/plugin-search-react@1.4.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/theme@0.2.16 + - @backstage/plugin-search-common@1.2.1 + +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-home@0.4.30-next.2 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-home@0.4.30-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-search-react@1.3.2-next.1 + +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-home@0.4.30-next.0 + - @backstage/plugin-search-common@1.2.0 + - @backstage/plugin-search-react@1.3.2-next.0 + +## 0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-home@0.4.29 + - @backstage/plugin-search-react@1.3.1 + ## 0.1.8 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index b0d6c87b8b..3d0ddc0d0c 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.8", + "version": "0.1.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx index a5273ecff9..8fce24bd22 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx @@ -24,6 +24,7 @@ import { ListItemSecondaryAction, ListItemIcon, } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import OpenInNewIcon from '@material-ui/icons/OpenInNew'; import useAsync from 'react-use/lib/useAsync'; import _unescape from 'lodash/unescape'; @@ -51,11 +52,11 @@ export const Content = (props: StackOverflowQuestionsContentProps) => { }, []); if (loading) { - return

loading...

; + return loading...; } if (error || !value || !value.length) { - return

could not load questions

; + return could not load questions; } const getSecondaryText = (answer_count: Number) => diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 186770f29e..91b5a6ea8e 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.24 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-tech-insights-common@0.2.9 + - @backstage/plugin-tech-insights-node@0.3.8 + +## 0.1.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-tech-insights-node@0.3.8-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-tech-insights-common@0.2.9 + +## 0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-tech-insights-common@0.2.9 + - @backstage/plugin-tech-insights-node@0.3.8-next.0 + ## 0.1.23 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 3e29e32dc6..b2ec55e821 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.23", + "version": "0.1.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.ts b/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.ts index 8866b5badb..e29494be8b 100644 --- a/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.ts +++ b/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.ts @@ -141,7 +141,9 @@ export class JsonRulesEngineFactChecker ); } catch (e) { if (isError(e)) { - throw new Error(`Failed to run rules engine, ${e.message}`); + throw new Error(`Failed to run rules engine, ${e.message}`, { + cause: e, + }); } throw e; } diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index c3c2d4b2e8..97031a15d7 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,70 @@ # @backstage/plugin-tech-insights-backend +## 0.5.6 + +### Patch Changes + +- 7a38a31699: Complete check results run when a single check errors so that we don't block other checks from working due to an error in a single check +- 44c18b4d3f: Expose optional `persistenceContext` on `TechInsights` construction to enable integrators to provide their own database implementations for fact handling. +- b48317cfc6: Modifies database cleanup to remove all facts for entities instead of hand-picked ones only. Improves query execution a lot in large datasets. + Changes semantics of the lifecycle deletion logic slightly for cases were historical entities/facts, that are , not present in the application anymore, were kept forever instead of being cleaned up. The new implementation is more along the expected lines. +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/backend-tasks@0.4.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + - @backstage/plugin-tech-insights-node@0.3.8 + +## 0.5.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-tech-insights-node@0.3.8-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + +## 0.5.6-next.1 + +### Patch Changes + +- 7a38a31699: Complete check results run when a single check errors so that we don't block other checks from working due to an error in a single check +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + - @backstage/plugin-tech-insights-node@0.3.8-next.0 + +## 0.5.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + - @backstage/plugin-tech-insights-node@0.3.7 + ## 0.5.5 ### Patch Changes diff --git a/plugins/tech-insights-backend/api-report.md b/plugins/tech-insights-backend/api-report.md index 8dc8efbb24..a757f0d67c 100644 --- a/plugins/tech-insights-backend/api-report.md +++ b/plugins/tech-insights-backend/api-report.md @@ -77,11 +77,22 @@ export interface FactRetrieverRegistry { register(registration: FactRetrieverRegistration): Promise; } +// @public +export const initializePersistenceContext: ( + database: PluginDatabaseManager, + options?: PersistenceContextOptions, +) => Promise; + // @public export type PersistenceContext = { techInsightsStore: TechInsightsStore; }; +// @public +export type PersistenceContextOptions = { + logger: Logger; +}; + // @public export interface RouterOptions< CheckType extends TechInsightCheck, @@ -122,6 +133,7 @@ export interface TechInsightsOptions< factRetrievers?: FactRetrieverRegistration[]; // (undocumented) logger: Logger; + persistenceContext?: PersistenceContext; // (undocumented) scheduler: PluginTaskScheduler; // (undocumented) diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 74bdb33647..06fab9fde1 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.5", + "version": "0.5.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/src/index.ts b/plugins/tech-insights-backend/src/index.ts index 28a922cd67..e9e037cce1 100644 --- a/plugins/tech-insights-backend/src/index.ts +++ b/plugins/tech-insights-backend/src/index.ts @@ -18,12 +18,16 @@ export * from './service/router'; export type { RouterOptions } from './service/router'; export { buildTechInsightsContext } from './service/techInsightsContextBuilder'; +export { initializePersistenceContext } from './service/persistence/persistenceContext'; export type { TechInsightsOptions, TechInsightsContext, } from './service/techInsightsContextBuilder'; export type { FactRetrieverEngine } from './service/fact/FactRetrieverEngine'; -export type { PersistenceContext } from './service/persistence/persistenceContext'; +export type { + PersistenceContext, + PersistenceContextOptions, +} from './service/persistence/persistenceContext'; export { createFactRetrieverRegistration } from './service/fact/createFactRetriever'; export type { FactRetrieverRegistry } from './service/fact/FactRetrieverRegistry'; export type { FactRetrieverRegistrationOptions } from './service/fact/createFactRetriever'; diff --git a/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts b/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts index c6751e864a..7c2ba52717 100644 --- a/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts +++ b/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts @@ -46,6 +46,11 @@ type RawDbFactSchemaRow = { entityFilter?: string; }; +/** + * Default TechInsightsDatabase implementation. + * + * @internal + */ export class TechInsightsDatabase implements TechInsightsStore { private readonly CHUNK_SIZE = 50; @@ -114,10 +119,10 @@ export class TechInsightsDatabase implements TechInsightsStore { if (lifecycle && isTtl(lifecycle)) { const expiration = DateTime.now().minus(lifecycle.timeToLive); - await this.deleteExpiredFactsByDate(tx, factRows, expiration); + await this.deleteExpiredFactsByDate(tx, id, expiration); } if (lifecycle && isMaxItems(lifecycle)) { - await this.deleteExpiredFactsByNumber(tx, factRows, lifecycle.maxItems); + await this.deleteExpiredFactsByNumber(tx, id, lifecycle.maxItems); } }); } @@ -195,60 +200,59 @@ export class TechInsightsDatabase implements TechInsightsStore { private async deleteExpiredFactsByDate( tx: Transaction, - factRows: { id: string; entity: string }[], + factRetrieverId: string, timestamp: DateTime, ) { await tx('facts') - .whereIn( - ['id', 'entity'], - factRows.map(it => [it.id, it.entity]), - ) + .where({ id: factRetrieverId }) .and.where('timestamp', '<', timestamp.toISO()) .delete(); } private async deleteExpiredFactsByNumber( tx: Transaction, - factRows: { id: string; entity: string }[], + factRetrieverId: string, maxItems: number, ) { - const deletables = await tx('facts') - .whereIn( - ['id', 'entity'], - factRows.map(it => [it.id, it.entity]), - ) - .and.leftJoin( - joinTable => - joinTable - .select('*') - .from( - this.db('facts') - .column( - { fid: 'id' }, - { fentity: 'entity' }, - { ftimestamp: 'timestamp' }, - ) - .column( - this.db.raw( - 'row_number() over (partition by id, entity order by timestamp desc) as fact_rank', - ), - ) - .as('ranks'), - ) - .where('fact_rank', '<=', maxItems) - .as('filterjoin'), - joinClause => { - joinClause - .on('filterjoin.fid', 'facts.id') - .on('filterjoin.fentity', 'facts.entity') - .on('filterjoin.ftimestamp', 'facts.timestamp'); - }, - ) - .whereNull('filterjoin.fid'); + const deletionFilterQuery = (subTx: Knex.QueryBuilder) => + subTx + .select(['id', 'entity', 'timestamp']) + .from('facts') + .where({ id: factRetrieverId }) + .and.whereIn('entity', db => + db.distinct('entity').where({ id: factRetrieverId }), + ) + .and.leftJoin( + joinTable => + joinTable + .select('*') + .from( + this.db('facts') + .column( + { fid: 'id' }, + { fentity: 'entity' }, + { ftimestamp: 'timestamp' }, + ) + .column( + this.db.raw( + 'row_number() over (partition by id, entity order by timestamp desc) as fact_rank', + ), + ) + .as('ranks'), + ) + .where('fact_rank', '<=', maxItems) + .as('filterjoin'), + joinClause => { + joinClause + .on('filterjoin.fid', 'facts.id') + .on('filterjoin.fentity', 'facts.entity') + .on('filterjoin.ftimestamp', 'facts.timestamp'); + }, + ) + .whereNull('filterjoin.fid'); await tx('facts') - .whereIn( - ['id', 'entity', 'timestamp'], - deletables.map(it => [it.id, it.entity, it.timestamp]), + .whereIn(['id', 'entity', 'timestamp'], database => + deletionFilterQuery(database), ) .delete(); } diff --git a/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts b/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts index 575ee67bdf..07badb038c 100644 --- a/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts +++ b/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts @@ -36,22 +36,27 @@ export type PersistenceContext = { techInsightsStore: TechInsightsStore; }; -export type CreateDatabaseOptions = { +/** + * A Container for persistence context initialization options + * + * @public + */ +export type PersistenceContextOptions = { logger: Logger; }; -const defaultOptions: CreateDatabaseOptions = { +const defaultOptions: PersistenceContextOptions = { logger: getVoidLogger(), }; /** - * A factory method to construct persistence context for running implementation. + * A factory function to construct persistence context for running implementation. * * @public */ export const initializePersistenceContext = async ( database: PluginDatabaseManager, - options: CreateDatabaseOptions = defaultOptions, + options: PersistenceContextOptions = defaultOptions, ): Promise => { const client = await database.getClient(); diff --git a/plugins/tech-insights-backend/src/service/router.ts b/plugins/tech-insights-backend/src/service/router.ts index 6dba290422..5e58df1b20 100644 --- a/plugins/tech-insights-backend/src/service/router.ts +++ b/plugins/tech-insights-backend/src/service/router.ts @@ -32,6 +32,7 @@ import { stringifyEntityRef, } from '@backstage/catalog-model'; import { errorHandler } from '@backstage/backend-common'; +import { serializeError } from '@backstage/errors'; /** * @public @@ -106,11 +107,21 @@ export async function createRouter< const tasks = entities.map(async entity => { const entityTriplet = typeof entity === 'string' ? entity : stringifyEntityRef(entity); - const results = await factChecker.runChecks(entityTriplet, checks); - return { - entity: entityTriplet, - results, - }; + try { + const results = await factChecker.runChecks(entityTriplet, checks); + return { + entity: entityTriplet, + results, + }; + } catch (e: any) { + const error = serializeError(e); + logger.error(`${error.name}: ${error.message}`); + return { + entity: entityTriplet, + error: error, + results: [], + }; + } }); const results = await Promise.all(tasks); return res.json(results); diff --git a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts index f85d99b2a8..20693d0a7d 100644 --- a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts +++ b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts @@ -74,6 +74,12 @@ export interface TechInsightsOptions< */ factRetrieverRegistry?: FactRetrieverRegistry; + /** + * Optional persistenceContext implementation that replaces the default one. + * This can be used to replace underlying database with a more suitable implementation if needed + */ + persistenceContext?: PersistenceContext; + logger: Logger; config: Config; discovery: PluginEndpointDiscovery; @@ -139,9 +145,11 @@ export const buildTechInsightsContext = async < const factRetrieverRegistry = buildFactRetrieverRegistry(); - const persistenceContext = await initializePersistenceContext(database, { - logger, - }); + const persistenceContext = + options.persistenceContext ?? + (await initializePersistenceContext(database, { + logger, + })); const factRetrieverEngine = await DefaultFactRetrieverEngine.create({ scheduler, diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index e4be99534f..d0b78e9fac 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-tech-insights-node +## 0.3.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/backend-tasks@0.4.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + +## 0.3.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + ## 0.3.7 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 519e1e6388..a0c9786504 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.3.7", + "version": "0.3.8", "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 17a332ea14..f26f9f910e 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,69 @@ # @backstage/plugin-tech-insights +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + +## 0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + +## 0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-tech-insights-common@0.2.9 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.9 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.3.4 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 7d596c136e..221445f1be 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.4", + "version": "0.3.6", "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 6103f9729e..085aa42aa9 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,58 @@ # @backstage/plugin-tech-radar +## 0.6.0 + +### Minor Changes + +- 38fd519fc1: Add highlighting of legend item and show bubble on hover within the Tech Radar + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.6.0-next.2 + +### Minor Changes + +- 38fd519fc1: Add highlighting of legend item and show bubble on hover within the Tech Radar + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + +## 0.5.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + +## 0.5.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + +## 0.5.20 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.5.19 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 916396c78c..a7ce33c427 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.5.19", + "version": "0.6.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/src/components/Radar/Radar.test.tsx b/plugins/tech-radar/src/components/Radar/Radar.test.tsx index 1b9e10ae5b..b76eb20a16 100644 --- a/plugins/tech-radar/src/components/Radar/Radar.test.tsx +++ b/plugins/tech-radar/src/components/Radar/Radar.test.tsx @@ -15,9 +15,7 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; +import { renderInTestApp } from '@backstage/test-utils'; import GetBBoxPolyfill from '../../utils/polyfills/getBBox'; import Radar, { Props } from './Radar'; @@ -48,12 +46,8 @@ describe('Radar', () => { GetBBoxPolyfill.remove(); }); - it('should render', () => { - const rendered = render( - - - , - ); + it('should render', async () => { + const rendered = await renderInTestApp(); const svg = rendered.container.querySelector('svg'); expect(svg).not.toBeNull(); diff --git a/plugins/tech-radar/src/components/Radar/utils.ts b/plugins/tech-radar/src/components/Radar/utils.ts index 7fff038023..5c32207268 100644 --- a/plugins/tech-radar/src/components/Radar/utils.ts +++ b/plugins/tech-radar/src/components/Radar/utils.ts @@ -141,6 +141,7 @@ export const adjustEntries = ( activeEntry && entry.id === activeEntry?.id ? entry.ring.color : color(entry.ring.color).desaturate(0.5).lighten(0.1).string(), + active: activeEntry && entry.id === activeEntry?.id ? true : false, }; }); diff --git a/plugins/tech-radar/src/components/RadarBubble/RadarBubble.test.tsx b/plugins/tech-radar/src/components/RadarBubble/RadarBubble.test.tsx index 9af1f5caff..ab8070c146 100644 --- a/plugins/tech-radar/src/components/RadarBubble/RadarBubble.test.tsx +++ b/plugins/tech-radar/src/components/RadarBubble/RadarBubble.test.tsx @@ -15,9 +15,7 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; +import { renderInTestApp } from '@backstage/test-utils'; import GetBBoxPolyfill from '../../utils/polyfills/getBBox'; import RadarBubble, { Props } from './RadarBubble'; @@ -38,13 +36,11 @@ describe('RadarBubble', () => { GetBBoxPolyfill.remove(); }); - it('should render', () => { - const rendered = render( - - - - - , + it('should render', async () => { + const rendered = await renderInTestApp( + + + , ); expect(rendered.getByText(minProps.text)).toBeInTheDocument(); diff --git a/plugins/tech-radar/src/components/RadarComponent.test.tsx b/plugins/tech-radar/src/components/RadarComponent.test.tsx index 3d3b1bfd17..4bb207a1de 100644 --- a/plugins/tech-radar/src/components/RadarComponent.test.tsx +++ b/plugins/tech-radar/src/components/RadarComponent.test.tsx @@ -15,10 +15,7 @@ */ import React from 'react'; -import { act, render, waitFor } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; -import { TestApiProvider, withLogCollector } from '@backstage/test-utils'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import GetBBoxPolyfill from '../utils/polyfills/getBBox'; import { RadarComponent } from './RadarComponent'; @@ -36,7 +33,9 @@ describe('RadarComponent', () => { }); class MockClient implements TechRadarApi { + constructor(private delay = 0) {} async load(): Promise { + await new Promise(resolve => setTimeout(resolve, this.delay)); return { entries: [], quadrants: [], @@ -45,87 +44,52 @@ describe('RadarComponent', () => { } } - const mockClient = new MockClient(); - it('should render a progress bar', async () => { jest.useFakeTimers(); - const errorApi = { post: () => {} }; - const { getByTestId, findByTestId } = render( - - - - - , + const { findByTestId } = await renderInTestApp( + + + , ); - act(() => { - jest.advanceTimersByTime(250); - }); - expect(getByTestId('progress')).toBeInTheDocument(); + jest.advanceTimersByTime(250); + await expect(findByTestId('progress')).resolves.toBeInTheDocument(); + + jest.advanceTimersByTime(250); + await expect(findByTestId('tech-radar-svg')).resolves.toBeInTheDocument(); - await findByTestId('tech-radar-svg'); jest.useRealTimers(); }); it('should call the errorApi if load fails', async () => { const errorApi = { post: jest.fn() }; + const mockClient = new MockClient(); jest .spyOn(mockClient, 'load') .mockRejectedValue(new Error('404 Page Not Found')); - const { queryByTestId } = render( - - - - - , + const { queryByTestId } = await renderInTestApp( + + + , ); - await waitFor(() => !queryByTestId('progress')); - expect(errorApi.post).toHaveBeenCalledTimes(1); expect(errorApi.post).toHaveBeenCalledWith(new Error('404 Page Not Found')); expect(queryByTestId('tech-radar-svg')).not.toBeInTheDocument(); }); - - it('should not render without errorApiRef', () => { - expect( - withLogCollector(['error'], () => { - expect(() => { - render( - - - - - , - ); - }).toThrow(); - }).error[0], - ).toMatchObject({ - detail: new Error('No implementation available for apiRef{core.error}'), - }); - }); }); diff --git a/plugins/tech-radar/src/components/RadarDescription/RadarDescription.test.tsx b/plugins/tech-radar/src/components/RadarDescription/RadarDescription.test.tsx index 7249b9f194..7f2dcbe6ac 100644 --- a/plugins/tech-radar/src/components/RadarDescription/RadarDescription.test.tsx +++ b/plugins/tech-radar/src/components/RadarDescription/RadarDescription.test.tsx @@ -15,11 +15,10 @@ */ import React from 'react'; -import { render, screen } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; +import { screen } from '@testing-library/react'; import { Props, RadarDescription } from './RadarDescription'; +import { renderInTestApp } from '@backstage/test-utils'; const minProps: Props = { open: true, @@ -29,12 +28,8 @@ const minProps: Props = { }; describe('RadarDescription', () => { - it('should render', () => { - render( - - - , - ); + it('should render', async () => { + await renderInTestApp(); const radarDescription = screen.getByTestId('radar-description'); expect(radarDescription).toBeInTheDocument(); diff --git a/plugins/tech-radar/src/components/RadarEntry/RadarEntry.test.tsx b/plugins/tech-radar/src/components/RadarEntry/RadarEntry.test.tsx index b1e468899d..36f304330d 100644 --- a/plugins/tech-radar/src/components/RadarEntry/RadarEntry.test.tsx +++ b/plugins/tech-radar/src/components/RadarEntry/RadarEntry.test.tsx @@ -15,10 +15,9 @@ */ import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { screen } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/test-utils'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; import GetBBoxPolyfill from '../../utils/polyfills/getBBox'; import RadarEntry, { Props } from './RadarEntry'; @@ -45,13 +44,11 @@ describe('RadarEntry', () => { GetBBoxPolyfill.remove(); }); - it('should render link only', () => { - render( - - - - - , + it('should render link only', async () => { + await renderInTestApp( + + + , ); const radarEntry = screen.getByTestId('radar-entry'); @@ -62,12 +59,10 @@ describe('RadarEntry', () => { }); it('should render with description', async () => { - render( - - - - - , + await renderInTestApp( + + + , ); await userEvent.click(screen.getByRole('button')); @@ -80,17 +75,15 @@ describe('RadarEntry', () => { expect(screen.getByText(String(minProps.value))).toBeInTheDocument(); }); - it('should render blip with url equal to # if description present', () => { + it('should render blip with url equal to # if description present', async () => { const withUrl = { ...optionalProps, url: 'http://backstage.io', }; - render( - - - - - , + await renderInTestApp( + + + , ); expect(screen.getByRole('button')).toHaveAttribute('href', '#'); diff --git a/plugins/tech-radar/src/components/RadarFooter/RadarFooter.test.tsx b/plugins/tech-radar/src/components/RadarFooter/RadarFooter.test.tsx index b76405f2bf..df56e2ad2c 100644 --- a/plugins/tech-radar/src/components/RadarFooter/RadarFooter.test.tsx +++ b/plugins/tech-radar/src/components/RadarFooter/RadarFooter.test.tsx @@ -15,9 +15,7 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; +import { renderInTestApp } from '@backstage/test-utils'; import GetBBoxPolyfill from '../../utils/polyfills/getBBox'; import RadarFooter, { Props } from './RadarFooter'; @@ -36,13 +34,11 @@ describe('RadarFooter', () => { GetBBoxPolyfill.remove(); }); - it('should render', () => { - const rendered = render( - - - - - , + it('should render', async () => { + const rendered = await renderInTestApp( + + + , ); const radarFooter = rendered.getByTestId('radar-footer'); const { x, y } = minProps; diff --git a/plugins/tech-radar/src/components/RadarGrid/RadarGrid.test.tsx b/plugins/tech-radar/src/components/RadarGrid/RadarGrid.test.tsx index d5636d74b8..2e0a5a225c 100644 --- a/plugins/tech-radar/src/components/RadarGrid/RadarGrid.test.tsx +++ b/plugins/tech-radar/src/components/RadarGrid/RadarGrid.test.tsx @@ -15,9 +15,7 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; +import { renderInTestApp } from '@backstage/test-utils'; import GetBBoxPolyfill from '../../utils/polyfills/getBBox'; import RadarGrid, { Props } from './RadarGrid'; @@ -36,13 +34,11 @@ describe('RadarGrid', () => { GetBBoxPolyfill.remove(); }); - it('should render', () => { - const rendered = render( - - - - - , + it('should render', async () => { + const rendered = await renderInTestApp( + + + , ); expect(rendered.getByTestId('radar-grid-x-line')).toBeInTheDocument(); diff --git a/plugins/tech-radar/src/components/RadarLegend/RadarLegend.test.tsx b/plugins/tech-radar/src/components/RadarLegend/RadarLegend.test.tsx index e0b5f09a63..de8bfd15d7 100644 --- a/plugins/tech-radar/src/components/RadarLegend/RadarLegend.test.tsx +++ b/plugins/tech-radar/src/components/RadarLegend/RadarLegend.test.tsx @@ -14,9 +14,7 @@ * limitations under the License. */ -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; -import { render } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/test-utils'; import React from 'react'; import GetBBoxPolyfill from '../../utils/polyfills/getBBox'; @@ -47,13 +45,11 @@ describe('RadarLegend', () => { GetBBoxPolyfill.remove(); }); - it('should render', () => { - const rendered = render( - - - - - , + it('should render', async () => { + const rendered = await renderInTestApp( + + + , ); expect(rendered.getByTestId('radar-legend')).toBeInTheDocument(); diff --git a/plugins/tech-radar/src/components/RadarLegend/RadarLegend.tsx b/plugins/tech-radar/src/components/RadarLegend/RadarLegend.tsx index 6177041c70..4ca0350e7b 100644 --- a/plugins/tech-radar/src/components/RadarLegend/RadarLegend.tsx +++ b/plugins/tech-radar/src/components/RadarLegend/RadarLegend.tsx @@ -68,8 +68,16 @@ const useStyles = makeStyles(theme => ({ userSelect: 'none', fontSize: '11px', }, + activeEntry: { + pointerEvents: 'visiblePainted', + userSelect: 'none', + fontSize: '11px', + background: '#6f6f6f', + color: '#FFF', + }, entryLink: { pointerEvents: 'visiblePainted', + cursor: 'pointer', }, })); diff --git a/plugins/tech-radar/src/components/RadarLegend/RadarLegendLink.tsx b/plugins/tech-radar/src/components/RadarLegend/RadarLegendLink.tsx index 3ed1b7574a..b0d9196e1e 100644 --- a/plugins/tech-radar/src/components/RadarLegend/RadarLegendLink.tsx +++ b/plugins/tech-radar/src/components/RadarLegend/RadarLegendLink.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ import { ClassNameMap } from '@material-ui/core/styles/withStyles'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; import { WithLink } from '../../utils/components'; import { RadarDescription } from '../RadarDescription'; @@ -23,6 +24,7 @@ type RadarLegendLinkProps = { description?: string; title?: string; classes: ClassNameMap; + active?: boolean; }; export const RadarLegendLink = ({ @@ -30,6 +32,7 @@ export const RadarLegendLink = ({ description, title, classes, + active, }: RadarLegendLinkProps) => { const [open, setOpen] = React.useState(false); @@ -48,15 +51,21 @@ export const RadarLegendLink = ({ if (description) { return ( <> - - {title} - + + {title} + + {open && ( - {title} + + {title} + ); }; diff --git a/plugins/tech-radar/src/components/RadarLegend/RadarLegendRing.tsx b/plugins/tech-radar/src/components/RadarLegend/RadarLegendRing.tsx index f54e4ab3b3..09badecdcd 100644 --- a/plugins/tech-radar/src/components/RadarLegend/RadarLegendRing.tsx +++ b/plugins/tech-radar/src/components/RadarLegend/RadarLegendRing.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ import { ClassNameMap } from '@material-ui/core/styles/withStyles'; +import Typography from '@material-ui/core/Typography/Typography'; import React from 'react'; import { Entry, Ring } from '../../utils/types'; import { RadarLegendLink } from './RadarLegendLink'; @@ -38,7 +39,9 @@ export const RadarLegendRing = ({

{ring.name}

{entries.length === 0 ? ( -

(empty)

+ + (empty) + ) : (
    {entries.map(entry => ( @@ -57,6 +60,7 @@ export const RadarLegendRing = ({ url={entry.url} title={entry.title} description={entry.description} + active={entry.active} /> ))} diff --git a/plugins/tech-radar/src/components/RadarPage.test.tsx b/plugins/tech-radar/src/components/RadarPage.test.tsx index f0c2a04590..b65d9b31b2 100644 --- a/plugins/tech-radar/src/components/RadarPage.test.tsx +++ b/plugins/tech-radar/src/components/RadarPage.test.tsx @@ -20,8 +20,6 @@ import { TestApiProvider, wrapInTestApp, } from '@backstage/test-utils'; -import { lightTheme } from '@backstage/theme'; -import { ThemeProvider } from '@material-ui/core'; import { act, render, waitFor } from '@testing-library/react'; import React from 'react'; import GetBBoxPolyfill from '../utils/polyfills/getBBox'; @@ -61,11 +59,9 @@ describe('RadarPage', () => { const { getByTestId, findByTestId } = render( wrapInTestApp( - - - - - , + + + , ), ); @@ -87,11 +83,9 @@ describe('RadarPage', () => { jest.spyOn(mockClient, 'load'); const { getByText, findByTestId } = await renderInTestApp( - - - - - , + + + , ); await expect(findByTestId('tech-radar-svg')).resolves.toBeInTheDocument(); @@ -111,11 +105,9 @@ describe('RadarPage', () => { jest.spyOn(mockClient, 'load'); const { findByTestId } = await renderInTestApp( - - - - - , + + + , ); await expect(findByTestId('tech-radar-svg')).resolves.toBeInTheDocument(); @@ -136,16 +128,14 @@ describe('RadarPage', () => { }; const { queryByTestId } = await renderInTestApp( - - - - - , + + + , ); await waitFor(() => !queryByTestId('progress')); diff --git a/plugins/tech-radar/src/components/RadarPage.tsx b/plugins/tech-radar/src/components/RadarPage.tsx index 49f856eddd..802acef2a8 100644 --- a/plugins/tech-radar/src/components/RadarPage.tsx +++ b/plugins/tech-radar/src/components/RadarPage.tsx @@ -23,6 +23,7 @@ import { Link, } from '@backstage/core-components'; import { Grid, Input, makeStyles } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; import { RadarComponent, TechRadarComponentProps } from './RadarComponent'; @@ -79,7 +80,7 @@ export function RadarPage(props: TechRadarPageProps) { onChange={e => setSearchText(e.target.value)} /> -

    + This is used for visualizing the official guidelines of different areas of software development such as languages, frameworks, infrastructure and processes. You can find an explanation for the @@ -88,7 +89,7 @@ export function RadarPage(props: TechRadarPageProps) { Zalando Tech Radar . -

    +
    diff --git a/plugins/tech-radar/src/components/RadarPlot/RadarPlot.test.tsx b/plugins/tech-radar/src/components/RadarPlot/RadarPlot.test.tsx index fd03111b49..7557755ed2 100644 --- a/plugins/tech-radar/src/components/RadarPlot/RadarPlot.test.tsx +++ b/plugins/tech-radar/src/components/RadarPlot/RadarPlot.test.tsx @@ -15,9 +15,7 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; +import { renderInTestApp } from '@backstage/test-utils'; import GetBBoxPolyfill from '../../utils/polyfills/getBBox'; import RadarPlot, { Props } from './RadarPlot'; @@ -49,13 +47,11 @@ describe('RadarPlot', () => { GetBBoxPolyfill.remove(); }); - it('should render', () => { - const rendered = render( - - - - - , + it('should render', async () => { + const rendered = await renderInTestApp( + + + , ); expect(rendered.getByTestId('radar-plot')).toBeInTheDocument(); diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 79c1d7da9b..8fdcfa1715 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,81 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/plugin-techdocs@1.4.3 + - @backstage/plugin-catalog@1.7.2 + - @backstage/plugin-search-react@1.4.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/core-app-api@1.4.0 + - @backstage/plugin-techdocs-react@1.1.2 + - @backstage/integration-react@1.1.9 + - @backstage/test-utils@1.2.4 + - @backstage/theme@0.2.16 + +## 1.0.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-app-api@1.4.0-next.1 + - @backstage/plugin-techdocs-react@1.1.2-next.2 + - @backstage/core-components@0.12.3-next.2 + - @backstage/integration-react@1.1.9-next.2 + - @backstage/test-utils@1.2.4-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog@1.7.2-next.2 + - @backstage/plugin-techdocs@1.4.3-next.2 + +## 1.0.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.3-next.1 + - @backstage/core-app-api@1.3.1-next.0 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/integration-react@1.1.9-next.1 + - @backstage/test-utils@1.2.4-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog@1.7.2-next.1 + - @backstage/plugin-search-react@1.3.2-next.1 + - @backstage/plugin-techdocs-react@1.1.2-next.1 + +## 1.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/plugin-techdocs-react@1.1.2-next.0 + - @backstage/plugin-techdocs@1.4.3-next.0 + - @backstage/core-app-api@1.3.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/integration-react@1.1.9-next.0 + - @backstage/test-utils@1.2.3 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog@1.7.2-next.0 + - @backstage/plugin-search-react@1.3.2-next.0 + +## 1.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/integration-react@1.1.8 + - @backstage/plugin-catalog@1.7.1 + - @backstage/plugin-search-react@1.3.1 + - @backstage/plugin-techdocs@1.4.2 + - @backstage/plugin-techdocs-react@1.1.1 + ## 1.0.7 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 2edebb6c22..78dfd8a17f 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.7", + "version": "1.0.9", "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 2dc59b2968..a2e5f4d02b 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,69 @@ # @backstage/plugin-techdocs-backend +## 1.5.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-common@1.0.10 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-node@1.4.4 + +## 1.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-techdocs-node@1.4.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-techdocs-node@1.4.4-next.1 + +## 1.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/plugin-catalog-common@1.0.10-next.0 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-search-common@1.2.0 + - @backstage/plugin-techdocs-node@1.4.4-next.0 + ## 1.5.0 ### Minor Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 35679ed84d..9760707736 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.5.0", + "version": "1.5.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/src/service/standaloneServer.ts b/plugins/techdocs-backend/src/service/standaloneServer.ts index 5751a460bf..7e7e8b24f8 100644 --- a/plugins/techdocs-backend/src/service/standaloneServer.ts +++ b/plugins/techdocs-backend/src/service/standaloneServer.ts @@ -53,7 +53,6 @@ export async function startStandaloneServer( }); const discovery = SingleHostDiscovery.fromConfig(config); const mockUrlReader: jest.Mocked = { - read: jest.fn(), readUrl: jest.fn(), readTree: jest.fn(), search: jest.fn(), diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 193637f595..1608822d2b 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,62 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-techdocs-react@1.1.2 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.9 + - @backstage/theme@0.2.16 + +## 1.0.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-techdocs-react@1.1.2-next.2 + - @backstage/core-components@0.12.3-next.2 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-react@1.1.9-next.2 + - @backstage/theme@0.2.16 + +## 1.0.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-react@1.1.9-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.2-next.1 + +## 1.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/plugin-techdocs-react@1.1.2-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/integration@1.4.1 + - @backstage/integration-react@1.1.9-next.0 + - @backstage/theme@0.2.16 + +## 1.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/integration-react@1.1.8 + - @backstage/plugin-techdocs-react@1.1.1 + ## 1.0.7 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 080f45d942..984cd02238 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.7", + "version": "1.0.9", "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 16a4cc9ffb..45e5659988 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-techdocs-node +## 1.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/integration-aws-node@0.1.1 + - @backstage/catalog-model@1.1.5 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-search-common@1.2.1 + +## 1.4.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-aws-node@0.1.1-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-aws-node@0.1.1-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/integration-aws-node@0.1.0 + - @backstage/plugin-search-common@1.2.0 + ## 1.4.3 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 62a35c960c..47a9eda22b 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.4.3", + "version": "1.4.4", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-node/src/stages/prepare/dir.test.ts b/plugins/techdocs-node/src/stages/prepare/dir.test.ts index ddefb40f03..164cfde687 100644 --- a/plugins/techdocs-node/src/stages/prepare/dir.test.ts +++ b/plugins/techdocs-node/src/stages/prepare/dir.test.ts @@ -45,7 +45,6 @@ const createMockEntity = (annotations: {}) => { const mockConfig = new ConfigReader({}); const mockUrlReader: jest.Mocked = { - read: jest.fn(), readUrl: jest.fn(), readTree: jest.fn(), search: jest.fn(), diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 8ce56c165d..d70252571f 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,60 @@ # @backstage/plugin-techdocs-react +## 1.1.2 + +### Patch Changes + +- 7115c7389b: Updated dependency `jss` to `~10.9.0`. +- b8269de9f1: Explicitly declaring children as optional props to facilitate react 18 changes +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/version-bridge@1.0.3 + +## 1.1.2-next.2 + +### Patch Changes + +- b8269de9f1: Explicitly declaring children as optional props to facilitate react 18 changes +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/version-bridge@1.0.3 + +## 1.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/version-bridge@1.0.3 + +## 1.1.2-next.0 + +### Patch Changes + +- 7115c7389b: Updated dependency `jss` to `~10.9.0`. +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/version-bridge@1.0.3 + +## 1.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 1.1.0 ### Minor Changes diff --git a/plugins/techdocs-react/api-report.md b/plugins/techdocs-react/api-report.md index f1d6d3f177..cf64762fda 100644 --- a/plugins/techdocs-react/api-report.md +++ b/plugins/techdocs-react/api-report.md @@ -56,7 +56,9 @@ export type TechDocsAddonOptions = { }; // @public -export const TechDocsAddons: React_2.ComponentType; +export const TechDocsAddons: React_2.ComponentType< + React_2.PropsWithChildren<{}> +>; // @public export interface TechDocsApi { diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 2f91a4af60..2f3aefce74 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.0", + "version": "1.1.2", "publishConfig": { "access": "public", "alphaTypes": "dist/index.alpha.d.ts", @@ -42,7 +42,7 @@ "@material-ui/core": "^4.12.2", "@material-ui/lab": "4.0.0-alpha.57", "@material-ui/styles": "^4.11.0", - "jss": "~10.8.2", + "jss": "~10.9.0", "lodash": "^4.17.21", "react-helmet": "6.1.0", "react-use": "^17.2.4" diff --git a/plugins/techdocs-react/src/addons.tsx b/plugins/techdocs-react/src/addons.tsx index d77f53a426..54aea0352d 100644 --- a/plugins/techdocs-react/src/addons.tsx +++ b/plugins/techdocs-react/src/addons.tsx @@ -43,7 +43,9 @@ export const TECHDOCS_ADDONS_WRAPPER_KEY = 'techdocs.addons.wrapper.v1'; * TechDocs Addon registry. * @public */ -export const TechDocsAddons: React.ComponentType = () => null; +export const TechDocsAddons: React.ComponentType< + React.PropsWithChildren<{}> +> = () => null; attachComponentData(TechDocsAddons, TECHDOCS_ADDONS_WRAPPER_KEY, true); @@ -71,7 +73,9 @@ export function createTechDocsAddonExtension( * Create a TechDocs addon implementation. * @public */ -export function createTechDocsAddonExtension( +export function createTechDocsAddonExtension< + TComponentProps extends React.PropsWithChildren<{}>, +>( options: TechDocsAddonOptions, ): Extension<(props: TComponentProps) => JSX.Element | null> { const { name, component: TechDocsAddon } = options; diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index f9b402dee9..ad6e76c540 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,93 @@ # @backstage/plugin-techdocs +## 1.4.3 + +### Patch Changes + +- a74dd61534: Fix sizing of build log component to render all lines +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- 7115c7389b: Updated dependency `jss` to `~10.9.0`. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-search-react@1.4.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-techdocs-react@1.1.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.9 + - @backstage/theme@0.2.16 + - @backstage/plugin-search-common@1.2.1 + +## 1.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/plugin-techdocs-react@1.1.2-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-react@1.1.9-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.4.3-next.1 + +### Patch Changes + +- a74dd61534: Fix sizing of build log component to render all lines +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + - @backstage/integration-react@1.1.9-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-search-react@1.3.2-next.1 + - @backstage/plugin-techdocs-react@1.1.2-next.1 + +## 1.4.3-next.0 + +### Patch Changes + +- 7115c7389b: Updated dependency `jss` to `~10.9.0`. +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/plugin-techdocs-react@1.1.2-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + - @backstage/integration-react@1.1.9-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-search-common@1.2.0 + - @backstage/plugin-search-react@1.3.2-next.0 + +## 1.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/integration-react@1.1.8 + - @backstage/plugin-catalog-react@1.2.3 + - @backstage/plugin-search-react@1.3.1 + - @backstage/plugin-techdocs-react@1.1.1 + ## 1.4.1 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 4da8b45b12..33c5ec8852 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.4.1", + "version": "1.4.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -52,7 +52,7 @@ "dompurify": "^2.2.9", "event-source-polyfill": "1.0.25", "git-url-parse": "^13.0.0", - "jss": "~10.8.2", + "jss": "~10.9.0", "lodash": "^4.17.21", "react-helmet": "6.1.0", "react-use": "^17.2.4" diff --git a/plugins/techdocs/src/reader/components/TechDocsBuildLogs.tsx b/plugins/techdocs/src/reader/components/TechDocsBuildLogs.tsx index dc446a55d8..01e638e59c 100644 --- a/plugins/techdocs/src/reader/components/TechDocsBuildLogs.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsBuildLogs.tsx @@ -86,7 +86,9 @@ export const TechDocsBuildLogsDrawerContent = ({ - + + + ); }; diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx index 808cb84ccf..4e8f331c7f 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx @@ -15,10 +15,8 @@ */ import React from 'react'; import { act } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; import { scmIntegrationsApiRef } from '@backstage/integration-react'; -import { lightTheme } from '@backstage/theme'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; @@ -84,17 +82,15 @@ jest.mock('@backstage/core-components', () => ({ const Wrapper = ({ children }: { children: React.ReactNode }) => { return ( - - - {children} - - + + {children} + ); }; diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.test.tsx index 7db00f6590..3e5a4c73c3 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.test.tsx @@ -16,9 +16,6 @@ import React from 'react'; import { act, waitFor } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; - -import { lightTheme } from '@backstage/theme'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { techdocsApiRef, @@ -79,13 +76,11 @@ const Wrapper = ({ entityRef?: CompoundEntityRef; children: React.ReactNode; }) => ( - - - - {children} - - - + + + {children} + + ); describe('', () => { diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.test.tsx index da193430d5..a3e03b7cf0 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.test.tsx @@ -16,9 +16,6 @@ import React from 'react'; import { act, waitFor } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; - -import { lightTheme } from '@backstage/theme'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; import { @@ -71,13 +68,11 @@ const Wrapper = ({ entityRef?: CompoundEntityRef; children: React.ReactNode; }) => ( - - - - {children} - - - + + + {children} + + ); describe('', () => { diff --git a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx index c7755e8733..800fba2260 100644 --- a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx +++ b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx @@ -22,6 +22,7 @@ import { ListItemText, makeStyles, } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { Link } from '@backstage/core-components'; import { useAnalytics } from '@backstage/core-plugin-api'; import { ResultHighlight } from '@backstage/plugin-search-common'; @@ -137,7 +138,8 @@ export const TechDocsSearchResultListItem = ( } secondary={ - + } /> ); diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index b7851f68a3..566dadaf2e 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-todo-backend +## 0.1.37 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/catalog-client@1.3.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + +## 0.1.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + +## 0.1.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2-next.0 + +## 0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.1 + ## 0.1.36 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index d2b5f91db0..9f0d58bc86 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.1.36", + "version": "0.1.37", "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 1d0e0793e3..1788011fcb 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-todo +## 0.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.2.14 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 975907945f..a1868ebe92 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo", "description": "A Backstage plugin that lets you browse TODO comments in your source code", - "version": "0.2.14", + "version": "0.2.16", "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 9ea1450606..1eb35b3ba5 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-user-settings-backend +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/catalog-model@1.1.5 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9-next.0 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.8 + ## 0.1.3 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index d3ff237132..b64b30f19d 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.1.3", + "version": "0.1.4", "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 3debc58658..7d156138db 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,67 @@ # @backstage/plugin-user-settings +## 0.6.2 + +### Patch Changes + +- a942f70435: Minor update to the `UserSettingsIdentityCard` to have clickable entity refs +- d61f622db8: Refactor for the feature flag filter functionality +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- bca8e8b393: Feature flags now accept a description property. +- Updated dependencies + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/core-app-api@1.4.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.6.2-next.2 + +### Patch Changes + +- d61f622db8: Refactor for the feature flag filter functionality +- bca8e8b393: Feature flags now accept a description property. +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-app-api@1.4.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.3.1-next.0 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-app-api@1.3.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## 0.6.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.6.0 ### Minor Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index ecaef90fb6..16c120fb35 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings", "description": "A Backstage plugin that provides a settings page", - "version": "0.6.0", + "version": "0.6.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,6 +36,7 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/plugin-catalog-react": "workspace:^", "@backstage/theme": "workspace:^", "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", diff --git a/plugins/user-settings/src/components/AuthProviders/ProviderSettingsItem.tsx b/plugins/user-settings/src/components/AuthProviders/ProviderSettingsItem.tsx index a5962d47ab..852af7e78b 100644 --- a/plugins/user-settings/src/components/AuthProviders/ProviderSettingsItem.tsx +++ b/plugins/user-settings/src/components/AuthProviders/ProviderSettingsItem.tsx @@ -89,32 +89,30 @@ export const ProviderSettingsItem = (props: { primary={title} secondary={ - - - - - - - - - - {profile.displayName} - - - {profile.email} - - - {description} - - + + + + + + + + + {profile.displayName} + + + {profile.email} + + + {description} + - + } secondaryTypographyProps={{ noWrap: true, style: { width: '80%' } }} diff --git a/plugins/user-settings/src/components/FeatureFlags/FeatureFlagsItem.tsx b/plugins/user-settings/src/components/FeatureFlags/FeatureFlagsItem.tsx index e97b33cd92..a5f0d480cb 100644 --- a/plugins/user-settings/src/components/FeatureFlags/FeatureFlagsItem.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/FeatureFlagsItem.tsx @@ -30,6 +30,15 @@ type Props = { toggleHandler: Function; }; +const getSecondaryText = (flag: FeatureFlag) => { + if (flag.description) { + return flag.description; + } + return flag.pluginId + ? `Registered in ${flag.pluginId} plugin` + : 'Registered in the application'; +}; + export const FlagItem = ({ flag, enabled, toggleHandler }: Props) => ( toggleHandler(flag.name)}> @@ -37,9 +46,6 @@ export const FlagItem = ({ flag, enabled, toggleHandler }: Props) => ( - + ); diff --git a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx index 21aafc089e..a3b5f593ae 100644 --- a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx @@ -73,18 +73,10 @@ export const UserSettingsFeatureFlags = () => { inputRef?.current?.focus(); }; - let filteredFeatureFlags = Array.from(featureFlags); - - const filterInputParts = filterInput - .split(/\s/) - .map(part => part.trim().toLocaleLowerCase('en-US')); - - filterInputParts.forEach( - part => - (filteredFeatureFlags = filteredFeatureFlags.filter(featureFlag => - featureFlag.name.toLocaleLowerCase('en-US').includes(part), - )), - ); + const filteredFeatureFlags = featureFlags.filter(featureFlag => { + const featureFlagName = featureFlag.name.toLocaleLowerCase('en-US'); + return featureFlagName.includes(filterInput.toLocaleLowerCase('en-US')); + }); const Header = () => ( diff --git a/plugins/user-settings/src/components/General/UserSettingsIdentityCard.test.tsx b/plugins/user-settings/src/components/General/UserSettingsIdentityCard.test.tsx index 19c3eb2182..026e0517bb 100644 --- a/plugins/user-settings/src/components/General/UserSettingsIdentityCard.test.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsIdentityCard.test.tsx @@ -24,6 +24,7 @@ import React from 'react'; import { UserSettingsIdentityCard } from './UserSettingsIdentityCard'; import { ApiProvider } from '@backstage/core-app-api'; import { identityApiRef } from '@backstage/core-plugin-api'; +import { entityRouteRef } from '@backstage/plugin-catalog-react'; const apiRegistry = TestApiRegistry.from([ identityApiRef, @@ -32,7 +33,7 @@ const apiRegistry = TestApiRegistry.from([ getBackstageIdentity: jest.fn(async () => ({ type: 'user' as const, userEntityRef: 'foo:bar/foobar', - ownershipEntityRefs: ['test-ownership'], + ownershipEntityRefs: ['user:default/test-ownership'], })), }, ]); @@ -44,10 +45,13 @@ describe('', () => { , + { + mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef }, + }, ), ); - expect(screen.getByText('test-ownership')).toBeInTheDocument(); + expect(screen.getByText('user:default/test-ownership')).toBeInTheDocument(); expect(screen.getByText('foo:bar/foobar')).toBeInTheDocument(); }); }); diff --git a/plugins/user-settings/src/components/General/UserSettingsIdentityCard.tsx b/plugins/user-settings/src/components/General/UserSettingsIdentityCard.tsx index 1369f4aab8..a398877ce9 100644 --- a/plugins/user-settings/src/components/General/UserSettingsIdentityCard.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsIdentityCard.tsx @@ -15,40 +15,46 @@ */ import { InfoCard } from '@backstage/core-components'; -import React from 'react'; -import { useUserProfile } from '../useUserProfileInfo'; -import Chip from '@material-ui/core/Chip'; +import { EntityRefLinks } from '@backstage/plugin-catalog-react'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; +import React from 'react'; +import { useUserProfile } from '../useUserProfileInfo'; -/** @public */ -export const UserSettingsIdentityCard = () => { +const Contents = () => { const { backstageIdentity } = useUserProfile(); + if (!backstageIdentity) { + return No Backstage Identity; + } + return ( - - - - - - - User Entity:{' '} - - - - Ownership Entities:{' '} - {backstageIdentity?.ownershipEntityRefs.map(it => ( - - ))} - - - - + + + + User Entity:{' '} + ref} + /> + - + + + Ownership Entities:{' '} + ref} + /> + + + ); }; + +/** @public */ +export const UserSettingsIdentityCard = () => ( + + + +); diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index cee1579921..1d7090b880 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,49 @@ # @backstage/plugin-vault-backend +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/backend-test-utils@0.1.32 + - @backstage/backend-tasks@0.4.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.32-next.2 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.32-next.1 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/errors@1.1.4 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/backend-test-utils@0.1.32-next.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + ## 0.2.5 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 0dfba1efcd..7d331a79ab 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.2.5", + "version": "0.2.6", "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 6d25edc0ec..b322ea9763 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,61 @@ # @backstage/plugin-vault +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + ## 0.1.6 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index f08cc0701f..ecece0283e 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.6", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index 487b953f42..4d80489e99 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-xcmetrics +## 0.2.34 + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/core-components@0.12.3 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-components@0.12.3-next.2 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.3-next.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## 0.2.33 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + ## 0.2.32 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 58ca732ec4..f4144693ae 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.32", + "version": "0.2.34", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/src/components/BuildTimeline/BuildTimeline.tsx b/plugins/xcmetrics/src/components/BuildTimeline/BuildTimeline.tsx index f00ee03d56..54d84ff6c6 100644 --- a/plugins/xcmetrics/src/components/BuildTimeline/BuildTimeline.tsx +++ b/plugins/xcmetrics/src/components/BuildTimeline/BuildTimeline.tsx @@ -15,6 +15,7 @@ */ import { createStyles, makeStyles, useTheme } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; import { Bar, @@ -91,7 +92,7 @@ export const BuildTimeline = ({ width, }: BuildTimelineProps) => { const theme = useTheme(); - if (!targets.length) return

    No Targets

    ; + if (!targets.length) return No Targets; const data = getTimelineData(targets); diff --git a/scripts/check-docs-quality.js b/scripts/check-docs-quality.js index ac9db65b40..10c4b99976 100755 --- a/scripts/check-docs-quality.js +++ b/scripts/check-docs-quality.js @@ -23,6 +23,7 @@ const IGNORED = [ /^.*[/\\]CHANGELOG\.md$/, /^.*[/\\]api-report\.md$/, /^docs[/\\]releases[/\\].*-changelog\.md$/, + /^docs[/\\]reference[/\\]/, ]; const rootDir = resolvePath(__dirname, '..'); @@ -55,6 +56,7 @@ async function listFiles(dir = '') { // caused by the script. In CI, we want to ensure vale linter is run. async function exitIfMissingVale() { try { + // eslint-disable-next-line import/no-extraneous-dependencies await require('command-exists')('vale'); } catch (e) { if (process.env.CI) { @@ -72,7 +74,7 @@ async function exitIfMissingVale() { async function runVale(files) { const result = spawnSync( 'vale', - ['--config', resolvePath(rootDir, '.github/vale/config.ini'), ...files], + ['--config', resolvePath(rootDir, '.vale.ini'), ...files], { stdio: 'inherit', }, @@ -97,7 +99,7 @@ async function main() { if (process.argv.includes('--ci-args')) { process.stdout.write( // Workaround for not being able to pass arguments to the vale action - JSON.stringify(['--config=.github/vale/config.ini', ...files]), + JSON.stringify([...files]), ); return; } diff --git a/storybook/.storybook/main.js b/storybook/.storybook/main.js index e523b68337..3d92237438 100644 --- a/storybook/.storybook/main.js +++ b/storybook/.storybook/main.js @@ -12,6 +12,7 @@ const BACKSTAGE_CORE_STORIES = [ 'plugins/search-react', 'plugins/home', 'plugins/stack-overflow', + 'plugins/catalog-react', ]; // Some configuration needs to be available directly on the exported object diff --git a/storybook/yarn.lock b/storybook/yarn.lock index ef593ea7c8..94167a34a7 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -1801,17 +1801,17 @@ __metadata: linkType: hard "@storybook/addon-a11y@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/addon-a11y@npm:6.5.14" + version: 6.5.15 + resolution: "@storybook/addon-a11y@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/api": 6.5.14 - "@storybook/channels": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/components": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/api": 6.5.15 + "@storybook/channels": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/components": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.14 + "@storybook/theming": 6.5.15 axe-core: ^4.2.0 core-js: ^3.8.2 global: ^4.4.0 @@ -1828,21 +1828,21 @@ __metadata: optional: true react-dom: optional: true - checksum: 2c35e693641b38e90989a656b8766cd2a86482e24164e62afd2cd1899d454b1a0c0b8f23df328c5350884d22615e9779dd617c71c642f4eada1df6345feba8e3 + checksum: 409e1393f655099b199dd3ba279d926b42d11ca8ce37255eec1e5d6ed3526cae559cd02d3485b70023846c3430b41630c2b6e14ed288580fcce00a12c34f7fcb languageName: node linkType: hard "@storybook/addon-actions@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/addon-actions@npm:6.5.14" + version: 6.5.15 + resolution: "@storybook/addon-actions@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/api": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/components": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/api": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/components": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.14 + "@storybook/theming": 6.5.15 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 global: ^4.4.0 @@ -1863,23 +1863,23 @@ __metadata: optional: true react-dom: optional: true - checksum: 536a5afb4b9d2fbe6b250657deb36d5ef4eba128101fbe69bf00f9c363859f61e2337a460d0a724607ad48f54713bcc40ed54253df3fee4bdb23baf93a58defd + checksum: ce0ca5fddeb196adec7757dd287085c19d89d26506539d07445df3759eca9817a779f2923cc5fd7dfc9f515788628f6c0f604b10366659ca46562fab980c64f5 languageName: node linkType: hard "@storybook/addon-controls@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/addon-controls@npm:6.5.14" + version: 6.5.15 + resolution: "@storybook/addon-controls@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/api": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/components": 6.5.14 - "@storybook/core-common": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/api": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/components": 6.5.15 + "@storybook/core-common": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/node-logger": 6.5.14 - "@storybook/store": 6.5.14 - "@storybook/theming": 6.5.14 + "@storybook/node-logger": 6.5.15 + "@storybook/store": 6.5.15 + "@storybook/theming": 6.5.15 core-js: ^3.8.2 lodash: ^4.17.21 ts-dedent: ^2.0.0 @@ -1891,19 +1891,19 @@ __metadata: optional: true react-dom: optional: true - checksum: cebb9b33f944e9492527f4fd2bdfe73aa0f2737d53a36d7ea086499adc568ba06958e69c75191d5b266063ece513d5f7a484ec1da8f411f326aa4b022cce7ea0 + checksum: c87b01e035f7e0e6f3a1e864333c03e44f76ccd04a687cbe19cde59cfa1109eb2b124c288e1cf68c3a291dc6c28c056852aa2413c8157b92792ef339a33142ef languageName: node linkType: hard "@storybook/addon-links@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/addon-links@npm:6.5.14" + version: 6.5.15 + resolution: "@storybook/addon-links@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.14 + "@storybook/router": 6.5.15 "@types/qs": ^6.9.5 core-js: ^3.8.2 global: ^4.4.0 @@ -1919,21 +1919,21 @@ __metadata: optional: true react-dom: optional: true - checksum: 7dc537aab36fd80ba704b8618c24aa0b9f59d6c28502dd43c01e7dae4194fbce37a95cb7797c4b52547d9662bf9619cd0901f946bddcec7580986df2e38da574 + checksum: ef40b02a3f48de2f591486fb04910e996bcb8d5fd406e2d6b81752659551b366ffc64f6cfdb461585e52c0ae98fa102be8595678e63a27171f9e2a0e20869bd6 languageName: node linkType: hard "@storybook/addon-storysource@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/addon-storysource@npm:6.5.14" + version: 6.5.15 + resolution: "@storybook/addon-storysource@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/api": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/components": 6.5.14 - "@storybook/router": 6.5.14 - "@storybook/source-loader": 6.5.14 - "@storybook/theming": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/api": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/components": 6.5.15 + "@storybook/router": 6.5.15 + "@storybook/source-loader": 6.5.15 + "@storybook/theming": 6.5.15 core-js: ^3.8.2 estraverse: ^5.2.0 loader-utils: ^2.0.4 @@ -1948,7 +1948,7 @@ __metadata: optional: true react-dom: optional: true - checksum: d9962b3f03245ab7dce405e7f1a24291d985aa1ecc594836b6322185bcde1c61a84397acfd46e85b2818f00c1de0f564bf7b6e1d84b960418cbe3dc37660d3f9 + checksum: e501c78ad8224b07a15fd8626399ebc63f131feb615ad6c6a3d6a7eac320b8fd01ec74d7406e8422c224771dfca17cfa159816b272e9f635e07dd67a8b4f8cb8 languageName: node linkType: hard @@ -1974,17 +1974,17 @@ __metadata: languageName: node linkType: hard -"@storybook/addons@npm:6.5.14, @storybook/addons@npm:^6.0.0, @storybook/addons@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/addons@npm:6.5.14" +"@storybook/addons@npm:6.5.15, @storybook/addons@npm:^6.0.0, @storybook/addons@npm:^6.5.9": + version: 6.5.15 + resolution: "@storybook/addons@npm:6.5.15" dependencies: - "@storybook/api": 6.5.14 - "@storybook/channels": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/api": 6.5.15 + "@storybook/channels": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.14 - "@storybook/theming": 6.5.14 + "@storybook/router": 6.5.15 + "@storybook/theming": 6.5.15 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 global: ^4.4.0 @@ -1992,7 +1992,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 99d06641bab06a3cc2821f309589d062c0efd8707b451ae24017449034da408bfddce3beda1ccdedadf59669d7d13348bee127f6fd4fc057200c84ff43288312 + checksum: 9de4cb9ff51cde37c456a0315f47c751daf4412a8d90321b5249a9b05f48a44dc48f01bbf83c9f369f63232da423d58ed47e4c03d50d16a8835d372022095b70 languageName: node linkType: hard @@ -2024,17 +2024,17 @@ __metadata: languageName: node linkType: hard -"@storybook/api@npm:6.5.14, @storybook/api@npm:^6.0.0": - version: 6.5.14 - resolution: "@storybook/api@npm:6.5.14" +"@storybook/api@npm:6.5.15, @storybook/api@npm:^6.0.0": + version: 6.5.15 + resolution: "@storybook/api@npm:6.5.15" dependencies: - "@storybook/channels": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/channels": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.14 + "@storybook/router": 6.5.15 "@storybook/semver": ^7.3.2 - "@storybook/theming": 6.5.14 + "@storybook/theming": 6.5.15 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 global: ^4.4.0 @@ -2048,31 +2048,31 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 0d421c3211a49cb8910dea647b898edd60af79755108ed321626a8fc134713dd1b018c830f15c2fc6c863f0528b571c2e2b34bb79df3c2f43497f5ab36fa9bbf + checksum: cebf1b70309c9c4a135c4ad8d3ebd85d01cfa4942e43231831e67514604199d3ed26395bbe0f89954718498a800085bd7d6eaef61c5d702e3a669532a227bd93 languageName: node linkType: hard -"@storybook/builder-webpack4@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/builder-webpack4@npm:6.5.14" +"@storybook/builder-webpack4@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/builder-webpack4@npm:6.5.15" dependencies: "@babel/core": ^7.12.10 - "@storybook/addons": 6.5.14 - "@storybook/api": 6.5.14 - "@storybook/channel-postmessage": 6.5.14 - "@storybook/channels": 6.5.14 - "@storybook/client-api": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/components": 6.5.14 - "@storybook/core-common": 6.5.14 - "@storybook/core-events": 6.5.14 - "@storybook/node-logger": 6.5.14 - "@storybook/preview-web": 6.5.14 - "@storybook/router": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/api": 6.5.15 + "@storybook/channel-postmessage": 6.5.15 + "@storybook/channels": 6.5.15 + "@storybook/client-api": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/components": 6.5.15 + "@storybook/core-common": 6.5.15 + "@storybook/core-events": 6.5.15 + "@storybook/node-logger": 6.5.15 + "@storybook/preview-web": 6.5.15 + "@storybook/router": 6.5.15 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.14 - "@storybook/theming": 6.5.14 - "@storybook/ui": 6.5.14 + "@storybook/store": 6.5.15 + "@storybook/theming": 6.5.15 + "@storybook/ui": 6.5.15 "@types/node": ^14.0.10 || ^16.0.0 "@types/webpack": ^4.41.26 autoprefixer: ^9.8.6 @@ -2109,30 +2109,30 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 16749d2d03b82e43e6b0fea02ebd4b63ac961229e4203cb371f36f11a9cd0a484d9bef73ee443053e09594ba7a7f2311470ade0e5a246b6d9345d1c7cc7b83b0 + checksum: bd676e9302d34445884376582c5d4cfe854ed8e64a9df6bbdcc76ef433534e65a23b1bf20c7225e85d21a27e1f1d905d0accd821fdef08afcd76569a8c8977c2 languageName: node linkType: hard "@storybook/builder-webpack5@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/builder-webpack5@npm:6.5.14" + version: 6.5.15 + resolution: "@storybook/builder-webpack5@npm:6.5.15" dependencies: "@babel/core": ^7.12.10 - "@storybook/addons": 6.5.14 - "@storybook/api": 6.5.14 - "@storybook/channel-postmessage": 6.5.14 - "@storybook/channels": 6.5.14 - "@storybook/client-api": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/components": 6.5.14 - "@storybook/core-common": 6.5.14 - "@storybook/core-events": 6.5.14 - "@storybook/node-logger": 6.5.14 - "@storybook/preview-web": 6.5.14 - "@storybook/router": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/api": 6.5.15 + "@storybook/channel-postmessage": 6.5.15 + "@storybook/channels": 6.5.15 + "@storybook/client-api": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/components": 6.5.15 + "@storybook/core-common": 6.5.15 + "@storybook/core-events": 6.5.15 + "@storybook/node-logger": 6.5.15 + "@storybook/preview-web": 6.5.15 + "@storybook/router": 6.5.15 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.14 - "@storybook/theming": 6.5.14 + "@storybook/store": 6.5.15 + "@storybook/theming": 6.5.15 "@types/node": ^14.0.10 || ^16.0.0 babel-loader: ^8.0.0 babel-plugin-named-exports-order: ^0.0.2 @@ -2161,35 +2161,35 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 3aa60285baa51b3249b43b2fde92100ad24a5f383354b0e72a7915125f25386ace3e69a8718fb5baafc7cf8deca9e005c4ce0a9b356a1ca7016abe2254466115 + checksum: 9bde333540c41c55e7687b1230fdd92926074df1a3be900b969d6d9eea240fb962b6fafb59e5c3fe83eeb42e0f0c835d2e226fc332f460f8aba0f4f49d833ffd languageName: node linkType: hard -"@storybook/channel-postmessage@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/channel-postmessage@npm:6.5.14" +"@storybook/channel-postmessage@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/channel-postmessage@npm:6.5.15" dependencies: - "@storybook/channels": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/channels": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core-events": 6.5.15 core-js: ^3.8.2 global: ^4.4.0 qs: ^6.10.0 telejson: ^6.0.8 - checksum: 2ea7aed1e49808875788746db75d61d3180a0b883892e978e93326d61617c0e01b7816b9eefcad402579d9f6dd923a13b527bcfcda3f415c0a135987d6c2042d + checksum: 7a09ba5bf163f8f5fef0bfd99eaab6c6391fa854e86bb44fcd0586bb73dd4ab5827cc23b7b38f993b81cbdb2ff8d58f81371be9301ddb3ea6f963ba560a42f09 languageName: node linkType: hard -"@storybook/channel-websocket@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/channel-websocket@npm:6.5.14" +"@storybook/channel-websocket@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/channel-websocket@npm:6.5.15" dependencies: - "@storybook/channels": 6.5.14 - "@storybook/client-logger": 6.5.14 + "@storybook/channels": 6.5.15 + "@storybook/client-logger": 6.5.15 core-js: ^3.8.2 global: ^4.4.0 telejson: ^6.0.8 - checksum: 76bd5734890836d6d7af8fd619015067db4680ae4336fdf86ee1c612e0060412c14cfcba22faee02534a63079af0864323370409730c7f3ee16af8fc3014e758 + checksum: c482b18b28f06644f684ed2b88ab53d6c5853925343e60a50a9bcfb2888123c4accfe30b51743905693e4d73c32c77e30d6dbaba377b486bee6e51faae39cf85 languageName: node linkType: hard @@ -2204,28 +2204,28 @@ __metadata: languageName: node linkType: hard -"@storybook/channels@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/channels@npm:6.5.14" +"@storybook/channels@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/channels@npm:6.5.15" dependencies: core-js: ^3.8.2 ts-dedent: ^2.0.0 util-deprecate: ^1.0.2 - checksum: ff1ee3fea3c7b8591280ba7eabe13c999fc3e12a483ff2c0467cc9cca027662cbbc4676438da567865919157521df8a9a50bd20b35daed6896f39a3a7251a1e5 + checksum: 7963c34246b3cc84bb6fb0965834110d9b839a5c32cced0756948e4e88fb8bf23a0d584723abbab6d30a6282fa1023017bb82eba68c23389652c77d8d33cb4f9 languageName: node linkType: hard -"@storybook/client-api@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/client-api@npm:6.5.14" +"@storybook/client-api@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/client-api@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/channel-postmessage": 6.5.14 - "@storybook/channels": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/channel-postmessage": 6.5.15 + "@storybook/channels": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.14 + "@storybook/store": 6.5.15 "@types/qs": ^6.9.5 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 @@ -2242,7 +2242,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 46fe2bec19610a7ab59b41f25653261cb65b485a829a94f99f9aa01f1f5bbc13677979abfe94eb025f0d9c1138b284ddbeb6ce8a0ae392ce4995a813770be83b + checksum: 0c3b3f7febe16b00beb4aeafe79fd97cc4a6b4db868e37002856fc34878bc955336929362b3015ba1688b47131ca0b729c94ee70f69855da0e819dad6d48ee1b languageName: node linkType: hard @@ -2256,23 +2256,23 @@ __metadata: languageName: node linkType: hard -"@storybook/client-logger@npm:6.5.14, @storybook/client-logger@npm:^6.4.0": - version: 6.5.14 - resolution: "@storybook/client-logger@npm:6.5.14" +"@storybook/client-logger@npm:6.5.15, @storybook/client-logger@npm:^6.4.0": + version: 6.5.15 + resolution: "@storybook/client-logger@npm:6.5.15" dependencies: core-js: ^3.8.2 global: ^4.4.0 - checksum: 29cc0b58db7a8dc90484320c86b386975580c0e534791b29f6a8c00ce5b156f2bff9513994202f9f9ef99787e8d793988048ae88d2780ba151c6782f3bbf97ff + checksum: cee16aea089b60b33ad643bde5e0d62274230d38e2033f0bfd0780fc092bc24b5acff63a6c569c9db989e59b89518ec964d0665a51548450716c4c50d3a3e66e languageName: node linkType: hard -"@storybook/components@npm:6.5.14, @storybook/components@npm:^6.0.0": - version: 6.5.14 - resolution: "@storybook/components@npm:6.5.14" +"@storybook/components@npm:6.5.15, @storybook/components@npm:^6.0.0": + version: 6.5.15 + resolution: "@storybook/components@npm:6.5.15" dependencies: - "@storybook/client-logger": 6.5.14 + "@storybook/client-logger": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.14 + "@storybook/theming": 6.5.15 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -2281,24 +2281,24 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 73d0ff418f2c5b1fc9f421f089ebee2342ef0684905e4959397a8bc6f67f32ff97f4ec3587847980cb7e4fc8e40278d8ecea11a8d267fea8d94ad3d8265a0c21 + checksum: c405643a002b7770567aba3f0e43cad975fbb0f728148f82c46c35b13958d3f6900eed619a60f22c0ee923c20828026d5f1c77cd950d21ebfd6cf57f8e64f791 languageName: node linkType: hard -"@storybook/core-client@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/core-client@npm:6.5.14" +"@storybook/core-client@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/core-client@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/channel-postmessage": 6.5.14 - "@storybook/channel-websocket": 6.5.14 - "@storybook/client-api": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/channel-postmessage": 6.5.15 + "@storybook/channel-websocket": 6.5.15 + "@storybook/client-api": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/preview-web": 6.5.14 - "@storybook/store": 6.5.14 - "@storybook/ui": 6.5.14 + "@storybook/preview-web": 6.5.15 + "@storybook/store": 6.5.15 + "@storybook/ui": 6.5.15 airbnb-js-shims: ^2.2.1 ansi-to-html: ^0.6.11 core-js: ^3.8.2 @@ -2316,13 +2316,13 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: ff867021ab6c22408952b809f3c22e58474390062fb5417aecc0ea6dcf2eb0097a616c5b1377e9af6c16045ce0cd5f3a11b32072630085592998dbb6a7ee573d + checksum: 60f03d031fa87a1a116b0ccbffd2270b8d28757d89c17af6eb368224603dfd0d219fd5ac086bf859cb8bda0f80b444195c7df94c4486107b9c5a6fbab29c65ac languageName: node linkType: hard -"@storybook/core-common@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/core-common@npm:6.5.14" +"@storybook/core-common@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/core-common@npm:6.5.15" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-proposal-class-properties": ^7.12.1 @@ -2346,7 +2346,7 @@ __metadata: "@babel/preset-react": ^7.12.10 "@babel/preset-typescript": ^7.12.7 "@babel/register": ^7.12.1 - "@storybook/node-logger": 6.5.14 + "@storybook/node-logger": 6.5.15 "@storybook/semver": ^7.3.2 "@types/node": ^14.0.10 || ^16.0.0 "@types/pretty-hrtime": ^1.0.0 @@ -2380,7 +2380,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: a1cd6e97524aa8173bc8a0af867cbf407f0542b8577a5be79a82154efb239d9362d05fae3bad0aac41e17d33d950cb69290042be46bbc841a8d12b71f6db1c82 + checksum: 9c19c348137bea23295ff330d3a62d3551b6a8a2933f254f3f1cace4ef05e46b6c97e0cbca67cc5be45164e223d5ff52eced54b76564891c8a2dd085e3be4cc4 languageName: node linkType: hard @@ -2393,31 +2393,31 @@ __metadata: languageName: node linkType: hard -"@storybook/core-events@npm:6.5.14, @storybook/core-events@npm:^6.0.0": - version: 6.5.14 - resolution: "@storybook/core-events@npm:6.5.14" +"@storybook/core-events@npm:6.5.15, @storybook/core-events@npm:^6.0.0": + version: 6.5.15 + resolution: "@storybook/core-events@npm:6.5.15" dependencies: core-js: ^3.8.2 - checksum: 6787925c520a6ee5aee748d4b7e2ec599c5ee16a87dbb62a94eeec88003ef42683d8e7ac8b98b49ea2a33205e0648805410c4759d16a997ba2f4215f6c8784ce + checksum: 89916720933bc4de0b1f25c7cb1b8580d3cdd213b21a360f18ebd0b790cce2c641696282fee29bbc482ab2cc656271b2f0569f79559d90fb01fb16473421e79e languageName: node linkType: hard -"@storybook/core-server@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/core-server@npm:6.5.14" +"@storybook/core-server@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/core-server@npm:6.5.15" dependencies: "@discoveryjs/json-ext": ^0.5.3 - "@storybook/builder-webpack4": 6.5.14 - "@storybook/core-client": 6.5.14 - "@storybook/core-common": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/builder-webpack4": 6.5.15 + "@storybook/core-client": 6.5.15 + "@storybook/core-common": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/csf-tools": 6.5.14 - "@storybook/manager-webpack4": 6.5.14 - "@storybook/node-logger": 6.5.14 + "@storybook/csf-tools": 6.5.15 + "@storybook/manager-webpack4": 6.5.15 + "@storybook/node-logger": 6.5.15 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.14 - "@storybook/telemetry": 6.5.14 + "@storybook/store": 6.5.15 + "@storybook/telemetry": 6.5.15 "@types/node": ^14.0.10 || ^16.0.0 "@types/node-fetch": ^2.5.7 "@types/pretty-hrtime": ^1.0.0 @@ -2461,16 +2461,16 @@ __metadata: optional: true typescript: optional: true - checksum: ca61b13ff002f73f76f6d359fc7955f061806d13bb0f158d6ff299696901097329d082b4fdd7fac06dda93fd318bcdbba9f6a08390763d18851c8aa70e581c36 + checksum: 927085bd6e2c9cf756795760c5647ed5b40151e94a192e64313091fda8a06993541ecabb9c730cb01eb8baef0613b73ff63824812cfd7b8bbed3fd2ead8d1f18 languageName: node linkType: hard -"@storybook/core@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/core@npm:6.5.14" +"@storybook/core@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/core@npm:6.5.15" dependencies: - "@storybook/core-client": 6.5.14 - "@storybook/core-server": 6.5.14 + "@storybook/core-client": 6.5.15 + "@storybook/core-server": 6.5.15 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -2482,13 +2482,13 @@ __metadata: optional: true typescript: optional: true - checksum: 16a2b8c589cbb8632ef6f1ba941abd7a422bca6fa54d4ef1dc5a60145bbea8dded10c7fa1fd4b8284e2e86867e779c26d4eebe69e2156123c49cfdf66c14718a + checksum: a7eca427b14a9c1f557d598e7ac599dc120d382d3d762437b3b6ebb4638b19a74e48f9e8e526365951ec623d10b82d67279226d7e6ff54ac095afee02992e666 languageName: node linkType: hard -"@storybook/csf-tools@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/csf-tools@npm:6.5.14" +"@storybook/csf-tools@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/csf-tools@npm:6.5.15" dependencies: "@babel/core": ^7.12.10 "@babel/generator": ^7.12.11 @@ -2509,7 +2509,7 @@ __metadata: peerDependenciesMeta: "@storybook/mdx2-csf": optional: true - checksum: 12e6bb4d9daa1f3ffd6a240edd9680c4088a20f2eba6dd91102fd2900188dcfcec60fc7e7b021aa2ae2232e15e0839aaf490d1c2ab2c9baa74a9dfea74ec713f + checksum: d7faafd175b232bb8fa6008ae6db5a40619a158ed7556686649dee665ac0cbbdb3cc404d2b9c0314ba7783c3f5baf1d87788f324d24136bd0f8cc671d573208b languageName: node linkType: hard @@ -2522,18 +2522,18 @@ __metadata: languageName: node linkType: hard -"@storybook/docs-tools@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/docs-tools@npm:6.5.14" +"@storybook/docs-tools@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/docs-tools@npm:6.5.15" dependencies: "@babel/core": ^7.12.10 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.14 + "@storybook/store": 6.5.15 core-js: ^3.8.2 doctrine: ^3.0.0 lodash: ^4.17.21 regenerator-runtime: ^0.13.7 - checksum: 1a69dae1f9ae4196a3517571d898097a69431cd6d92f490af3eb3e5504fe0bbde4cbdd82d1ff9648c3a1daa7eab10eaffd5d2ee485e634a6fa5701dec7875196 + checksum: 051239a82cff47dbc52fae112c4c144d6e103cbb169c239b0a99fb0cb3e82fba2e460c9487469fafc19ee81ef2ecc33d59b05457c3c74375685de0f537460071 languageName: node linkType: hard @@ -2550,19 +2550,19 @@ __metadata: languageName: node linkType: hard -"@storybook/manager-webpack4@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/manager-webpack4@npm:6.5.14" +"@storybook/manager-webpack4@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/manager-webpack4@npm:6.5.15" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-transform-template-literals": ^7.12.1 "@babel/preset-react": ^7.12.10 - "@storybook/addons": 6.5.14 - "@storybook/core-client": 6.5.14 - "@storybook/core-common": 6.5.14 - "@storybook/node-logger": 6.5.14 - "@storybook/theming": 6.5.14 - "@storybook/ui": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/core-client": 6.5.15 + "@storybook/core-common": 6.5.15 + "@storybook/node-logger": 6.5.15 + "@storybook/theming": 6.5.15 + "@storybook/ui": 6.5.15 "@types/node": ^14.0.10 || ^16.0.0 "@types/webpack": ^4.41.26 babel-loader: ^8.0.0 @@ -2595,23 +2595,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: c8547b64f80c87dd8590a3e7b784b6f72952607514f9e42858f89efce22ea077404033b25674aecc3874e61264ce74c38220b6130aecbce5361d182b018f7fc7 + checksum: de7b2624bf44cf4eb59839ac756e9e28715caae1d5efdfbd1e2cefb55a385cf80f3a651a29ed75a905f825d6b299ba46c3cd71068eecb3b985b5a315ed03470b languageName: node linkType: hard "@storybook/manager-webpack5@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/manager-webpack5@npm:6.5.14" + version: 6.5.15 + resolution: "@storybook/manager-webpack5@npm:6.5.15" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-transform-template-literals": ^7.12.1 "@babel/preset-react": ^7.12.10 - "@storybook/addons": 6.5.14 - "@storybook/core-client": 6.5.14 - "@storybook/core-common": 6.5.14 - "@storybook/node-logger": 6.5.14 - "@storybook/theming": 6.5.14 - "@storybook/ui": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/core-client": 6.5.15 + "@storybook/core-common": 6.5.15 + "@storybook/node-logger": 6.5.15 + "@storybook/theming": 6.5.15 + "@storybook/ui": 6.5.15 "@types/node": ^14.0.10 || ^16.0.0 babel-loader: ^8.0.0 case-sensitive-paths-webpack-plugin: ^2.3.0 @@ -2641,7 +2641,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 1fe525b777694c90d1837911307fa5ef3ac976387ff9b8c5116e51bfe21437c7d83504d3edb63cc5d3c9d624ba50e467f500a3477b63a879fc5d6e73310894ba + checksum: 99f18a752230fa6360b216e3a7f85c70fe92baf01677571653b4f9fd62735d9ab12a0b91e4ae7eabd66b03f37e0b58f01fad8e5880a8e2012a98f6aedc944da1 languageName: node linkType: hard @@ -2664,29 +2664,29 @@ __metadata: languageName: node linkType: hard -"@storybook/node-logger@npm:6.5.14, @storybook/node-logger@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/node-logger@npm:6.5.14" +"@storybook/node-logger@npm:6.5.15, @storybook/node-logger@npm:^6.5.9": + version: 6.5.15 + resolution: "@storybook/node-logger@npm:6.5.15" dependencies: "@types/npmlog": ^4.1.2 chalk: ^4.1.0 core-js: ^3.8.2 npmlog: ^5.0.1 pretty-hrtime: ^1.0.3 - checksum: d36d17816b20bf8409504f73b8fe7da2c1aa6b6f37c3cc910f544f4e3d9dfe8cfe5ab66930977413ab12a067f94477d5a1e3da8fa55c07af5dbc88160845ee47 + checksum: 9c01127d3b57db7a85759d2f179afec0e1207c0754e80e22472e73468f831e1dafa2a5bf1047e54f92d47b5103325c157c14655208a6ddcdb8f9e7ee0b256e48 languageName: node linkType: hard -"@storybook/preview-web@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/preview-web@npm:6.5.14" +"@storybook/preview-web@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/preview-web@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/channel-postmessage": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/channel-postmessage": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.14 + "@storybook/store": 6.5.15 ansi-to-html: ^0.6.11 core-js: ^3.8.2 global: ^4.4.0 @@ -2700,7 +2700,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: ef4d2222feaadd71067339ec93a13279162d0d0c72545ccb52681dd38c95451bb4257f0817dd3689af5d5e5b161602c8a57bc5805cd0d6bc0e066b78a2cfdd23 + checksum: fc178af772f39fcfe1b9926bf62bd7642984080442e8f7f2a0c6fe421513f9930ff5ccfea302d212199adf418c4bf9fc498ff65c30ad6e1cdd1b485a6d92b190 languageName: node linkType: hard @@ -2723,22 +2723,22 @@ __metadata: linkType: hard "@storybook/react@npm:^6.5.9": - version: 6.5.14 - resolution: "@storybook/react@npm:6.5.14" + version: 6.5.15 + resolution: "@storybook/react@npm:6.5.15" dependencies: "@babel/preset-flow": ^7.12.1 "@babel/preset-react": ^7.12.10 "@pmmmwh/react-refresh-webpack-plugin": ^0.5.3 - "@storybook/addons": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core": 6.5.14 - "@storybook/core-common": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core": 6.5.15 + "@storybook/core-common": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/docs-tools": 6.5.14 - "@storybook/node-logger": 6.5.14 + "@storybook/docs-tools": 6.5.15 + "@storybook/node-logger": 6.5.15 "@storybook/react-docgen-typescript-plugin": 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.14 + "@storybook/store": 6.5.15 "@types/estree": ^0.0.51 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 @@ -2783,7 +2783,7 @@ __metadata: build-storybook: bin/build.js start-storybook: bin/index.js storybook-server: bin/index.js - checksum: b94b7b3ef19d6b9e9379242fb17afd8892100cdf5dd8beac640e8dcac62618977e8189891e87e0fab40484a3fc84eeb8bc17ebd8dc7cba6b29ee7b65f8f761c8 + checksum: c36f9a2401633b9632e5fce05bb43e8ea0a5338c8f0dc9e0da5eb87c7cfd1a3ef819124499679a3c797fbbe8278f03794d757563f388136a349e3815747036ae languageName: node linkType: hard @@ -2803,11 +2803,11 @@ __metadata: languageName: node linkType: hard -"@storybook/router@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/router@npm:6.5.14" +"@storybook/router@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/router@npm:6.5.15" dependencies: - "@storybook/client-logger": 6.5.14 + "@storybook/client-logger": 6.5.15 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -2815,7 +2815,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: ec2550568c02f45de5307e77928eaeb39413049944e994adbc397d9c7e083ac7e110886e40517ddae40e3879c172f458167682f1d73d0bb150bc93ab9dd61514 + checksum: d5ac1ac0d161e53764411dc84febed3819c5cefe669f2933434bcdc25bf011f89d2df2a504af8bf77f454e6598a74c794a17d01aad734c6ebe28cc13c490fff9 languageName: node linkType: hard @@ -2831,12 +2831,12 @@ __metadata: languageName: node linkType: hard -"@storybook/source-loader@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/source-loader@npm:6.5.14" +"@storybook/source-loader@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/source-loader@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/client-logger": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/client-logger": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 core-js: ^3.8.2 estraverse: ^5.2.0 @@ -2848,17 +2848,17 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 81f8908a31eb3428835a201418b89981c7ce7ece669bef2a6487b643025e45238956fe98f8fd70aa61843db0eee2c595a13e84b46835cb28b1eef59defe00740 + checksum: 2330d2b16f097c4be4b0eccc466ae0142c2e04198acc529204d80c1005c1c32b6da8313661b10e641020efdfe4f1dd4f0ac67bc2c3797ae49383815f668ede5d languageName: node linkType: hard -"@storybook/store@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/store@npm:6.5.14" +"@storybook/store@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/store@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/core-events": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/core-events": 6.5.15 "@storybook/csf": 0.0.2--canary.4566f4d.1 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 @@ -2874,16 +2874,16 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 7330a2492c469bbe989a522873486cbccf660080bf8d03c873029a8fa56f82976d7d71030c69aa9b2df48bf3b6fdc8063f5beecba298908783058ea675f0a159 + checksum: 918c3ed8c7a55ae4bf8bcb3a108d99a9d077c951b3f386cb0f8939d2eed7c9a9a2000075b341d5c934c0308c24287fc5cd110042a384411c25cec7632dfa5abb languageName: node linkType: hard -"@storybook/telemetry@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/telemetry@npm:6.5.14" +"@storybook/telemetry@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/telemetry@npm:6.5.15" dependencies: - "@storybook/client-logger": 6.5.14 - "@storybook/core-common": 6.5.14 + "@storybook/client-logger": 6.5.15 + "@storybook/core-common": 6.5.15 chalk: ^4.1.0 core-js: ^3.8.2 detect-package-manager: ^2.0.1 @@ -2894,7 +2894,7 @@ __metadata: nanoid: ^3.3.1 read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 - checksum: 6f6323fe0e0fe9301b63a951e4f2959a68847bc20b67e3910587e6979b3e0b058ce5ec1b2bc89e666b77e91211dd0bb2ed8bd23060831f599365b8f41630db53 + checksum: aebb83186ff7308e21185a7152b27aed43f6d3967a7253ac94e3d4c1bce4935c471500c37d195e03f98953944812d2b24518d4147704e7ffb211430b27a2354e languageName: node linkType: hard @@ -2926,34 +2926,34 @@ __metadata: languageName: node linkType: hard -"@storybook/theming@npm:6.5.14, @storybook/theming@npm:^6.0.0": - version: 6.5.14 - resolution: "@storybook/theming@npm:6.5.14" +"@storybook/theming@npm:6.5.15, @storybook/theming@npm:^6.0.0": + version: 6.5.15 + resolution: "@storybook/theming@npm:6.5.15" dependencies: - "@storybook/client-logger": 6.5.14 + "@storybook/client-logger": 6.5.15 core-js: ^3.8.2 memoizerific: ^1.11.3 regenerator-runtime: ^0.13.7 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: d139325dd51e8dfa58458a5c033104123b019fc02ddc899898e02de2b5d1358fd318b5def7ef82e6138420f9198e90d50b0fdfbea926987ac6852fc3a2e77c6d + checksum: 84d09b6bdd0a00246b207ef4307fc0ecbb5861792547a070ed45470335c323f18ba607cd1d3f0a5cea7e979dd73315cdb091548fe70e5946c1593d8c691be7ba languageName: node linkType: hard -"@storybook/ui@npm:6.5.14": - version: 6.5.14 - resolution: "@storybook/ui@npm:6.5.14" +"@storybook/ui@npm:6.5.15": + version: 6.5.15 + resolution: "@storybook/ui@npm:6.5.15" dependencies: - "@storybook/addons": 6.5.14 - "@storybook/api": 6.5.14 - "@storybook/channels": 6.5.14 - "@storybook/client-logger": 6.5.14 - "@storybook/components": 6.5.14 - "@storybook/core-events": 6.5.14 - "@storybook/router": 6.5.14 + "@storybook/addons": 6.5.15 + "@storybook/api": 6.5.15 + "@storybook/channels": 6.5.15 + "@storybook/client-logger": 6.5.15 + "@storybook/components": 6.5.15 + "@storybook/core-events": 6.5.15 + "@storybook/router": 6.5.15 "@storybook/semver": ^7.3.2 - "@storybook/theming": 6.5.14 + "@storybook/theming": 6.5.15 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -2962,94 +2962,94 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 898bf81d9ab64d792bdca23b0ec465500af1e42ed5ebace5847416d0ec36d32043fb7c547452a626ce285efd966569e6bfd4f84ddd691367259553ca59538646 + checksum: 8b75290c65a6a2beb3db4157ed95ce74dab06d5499dc3fc7a848fa5c9fc0f506bf6533638bb50c3a1f27acfeaa6ade0acdde8beede2241eba8d577965d85d299 languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-darwin-arm64@npm:1.3.23" +"@swc/core-darwin-arm64@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-darwin-arm64@npm:1.3.26" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-darwin-x64@npm:1.3.23" +"@swc/core-darwin-x64@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-darwin-x64@npm:1.3.26" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.23" +"@swc/core-linux-arm-gnueabihf@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.26" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.23" +"@swc/core-linux-arm64-gnu@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.26" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.23" +"@swc/core-linux-arm64-musl@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.26" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.23" +"@swc/core-linux-x64-gnu@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.26" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-x64-musl@npm:1.3.23" +"@swc/core-linux-x64-musl@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-x64-musl@npm:1.3.26" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.23" +"@swc/core-win32-arm64-msvc@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.26" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.23" +"@swc/core-win32-ia32-msvc@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.26" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.23" +"@swc/core-win32-x64-msvc@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.26" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.23 - resolution: "@swc/core@npm:1.3.23" + version: 1.3.26 + resolution: "@swc/core@npm:1.3.26" dependencies: - "@swc/core-darwin-arm64": 1.3.23 - "@swc/core-darwin-x64": 1.3.23 - "@swc/core-linux-arm-gnueabihf": 1.3.23 - "@swc/core-linux-arm64-gnu": 1.3.23 - "@swc/core-linux-arm64-musl": 1.3.23 - "@swc/core-linux-x64-gnu": 1.3.23 - "@swc/core-linux-x64-musl": 1.3.23 - "@swc/core-win32-arm64-msvc": 1.3.23 - "@swc/core-win32-ia32-msvc": 1.3.23 - "@swc/core-win32-x64-msvc": 1.3.23 + "@swc/core-darwin-arm64": 1.3.26 + "@swc/core-darwin-x64": 1.3.26 + "@swc/core-linux-arm-gnueabihf": 1.3.26 + "@swc/core-linux-arm64-gnu": 1.3.26 + "@swc/core-linux-arm64-musl": 1.3.26 + "@swc/core-linux-x64-gnu": 1.3.26 + "@swc/core-linux-x64-musl": 1.3.26 + "@swc/core-win32-arm64-msvc": 1.3.26 + "@swc/core-win32-ia32-msvc": 1.3.26 + "@swc/core-win32-x64-msvc": 1.3.26 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -3071,9 +3071,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - bin: - swcx: run_swcx.js - checksum: 2a92949c33f292a369f4a750a8a9759f88f6f399bc0beef54768fce3d1af5cf0c33a4c8f3c2478020ae95e99d99b7c17f301b79163cdbcdf533b91675f1d2e8d + checksum: 656a2197bd8bd50b112077e8c7f9156527ec66cb06fed2cefb9e2610e3cde13e8416783f84edda67b9af4e27d6b169bc1a447d7c6c73cf64a1b3ec428b0737ab languageName: node linkType: hard @@ -7598,13 +7596,13 @@ __metadata: linkType: hard "json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" + version: 1.0.2 + resolution: "json5@npm:1.0.2" dependencies: minimist: ^1.2.0 bin: json5: lib/cli.js - checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3 + checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index b16a7270f2..7cc0dbd8b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,14 +33,15 @@ __metadata: languageName: node linkType: hard -"@apollo/explorer@npm:^1.1.1": - version: 1.2.0 - resolution: "@apollo/explorer@npm:1.2.0" +"@apollo/explorer@npm:^2.0.0": + version: 2.0.2 + resolution: "@apollo/explorer@npm:2.0.2" dependencies: "@types/whatwg-mimetype": ^3.0.0 graphql-ws: ^5.9.0 subscriptions-transport-ws: ^0.11.0 whatwg-mimetype: ^3.0.0 + zen-observable-ts: ^1.1.0 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -52,7 +53,7 @@ __metadata: optional: true use-deep-compare-effect: optional: true - checksum: 67cf0b5e8a23abb71ad1e68266529b8e8e1ce66652208c9942c554f21148364fd49afa5e619ecfddf611dd19067aa81ab8b2e828944122dfdc81e79a27ccf37c + checksum: 02ba8732b25ea568905f7c68bd68ae5f9f988743348e93b7ecba4a6882fc5cba3f4f1a426368d96b8aa795c5c9f32fab0fd2be35e4ad01d1cfefa495a22eb92b languageName: node linkType: hard @@ -408,15 +409,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.231.0" +"@aws-sdk/client-cognito-identity@npm:3.245.0": + version: 3.245.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.245.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/client-sts": 3.231.0 - "@aws-sdk/config-resolver": 3.231.0 - "@aws-sdk/credential-provider-node": 3.231.0 + "@aws-sdk/client-sts": 3.245.0 + "@aws-sdk/config-resolver": 3.234.0 + "@aws-sdk/credential-provider-node": 3.245.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -425,7 +426,7 @@ __metadata: "@aws-sdk/middleware-host-header": 3.226.0 "@aws-sdk/middleware-logger": 3.226.0 "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.229.0 + "@aws-sdk/middleware-retry": 3.235.0 "@aws-sdk/middleware-serde": 3.226.0 "@aws-sdk/middleware-signing": 3.226.0 "@aws-sdk/middleware-stack": 3.226.0 @@ -433,35 +434,35 @@ __metadata: "@aws-sdk/node-config-provider": 3.226.0 "@aws-sdk/node-http-handler": 3.226.0 "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.226.0 + "@aws-sdk/smithy-client": 3.234.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/url-parser": 3.226.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.231.0 - "@aws-sdk/util-endpoints": 3.226.0 + "@aws-sdk/util-defaults-mode-browser": 3.234.0 + "@aws-sdk/util-defaults-mode-node": 3.234.0 + "@aws-sdk/util-endpoints": 3.245.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 "@aws-sdk/util-user-agent-node": 3.226.0 "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 - checksum: 309c433d0005c072db5298d75df4f37826350ffc2bdab940c1147f719f5285207e9761ee8f87884b23ea2cf5f8bf7157fcf992008f0a838491954cbe6925a47a + checksum: 4142ba1b7a3c11f785d5da527a743d6a9352f6f97ae983e6f3ee0abf5a1cd755c2196981cbc2f6052686bf820a68f062117c682a5126e55acaacebc5cab862e6 languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.208.0": - version: 3.231.0 - resolution: "@aws-sdk/client-s3@npm:3.231.0" + version: 3.245.0 + resolution: "@aws-sdk/client-s3@npm:3.245.0" dependencies: "@aws-crypto/sha1-browser": 2.0.0 "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/client-sts": 3.231.0 - "@aws-sdk/config-resolver": 3.231.0 - "@aws-sdk/credential-provider-node": 3.231.0 + "@aws-sdk/client-sts": 3.245.0 + "@aws-sdk/config-resolver": 3.234.0 + "@aws-sdk/credential-provider-node": 3.245.0 "@aws-sdk/eventstream-serde-browser": 3.226.0 "@aws-sdk/eventstream-serde-config-resolver": 3.226.0 "@aws-sdk/eventstream-serde-node": 3.226.0 @@ -480,7 +481,7 @@ __metadata: "@aws-sdk/middleware-location-constraint": 3.226.0 "@aws-sdk/middleware-logger": 3.226.0 "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.229.0 + "@aws-sdk/middleware-retry": 3.235.0 "@aws-sdk/middleware-sdk-s3": 3.231.0 "@aws-sdk/middleware-serde": 3.226.0 "@aws-sdk/middleware-signing": 3.226.0 @@ -491,15 +492,15 @@ __metadata: "@aws-sdk/node-http-handler": 3.226.0 "@aws-sdk/protocol-http": 3.226.0 "@aws-sdk/signature-v4-multi-region": 3.226.0 - "@aws-sdk/smithy-client": 3.226.0 + "@aws-sdk/smithy-client": 3.234.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/url-parser": 3.226.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.231.0 - "@aws-sdk/util-endpoints": 3.226.0 + "@aws-sdk/util-defaults-mode-browser": 3.234.0 + "@aws-sdk/util-defaults-mode-node": 3.234.0 + "@aws-sdk/util-endpoints": 3.245.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-stream-browser": 3.226.0 "@aws-sdk/util-stream-node": 3.226.0 @@ -511,19 +512,19 @@ __metadata: "@aws-sdk/xml-builder": 3.201.0 fast-xml-parser: 4.0.11 tslib: ^2.3.1 - checksum: 2190e3d12416c2c3023ca04afbb9ad466b9b0ae0f9af34889dad6dfb9db5fe26c9b5ce6631c0110cc1b3afc125ef569b5c44eb685390de42298e9480ef32700b + checksum: 7aaec8fdcfa1390222e6fc55d7314dbebab05c1afad8e580cd5137f71bb6cef7ffaca113b117af22ee2ac110b03fbf7eec173f16cf093b0e1366f218169db7a4 languageName: node linkType: hard "@aws-sdk/client-sqs@npm:^3.208.0": - version: 3.231.0 - resolution: "@aws-sdk/client-sqs@npm:3.231.0" + version: 3.245.0 + resolution: "@aws-sdk/client-sqs@npm:3.245.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/client-sts": 3.231.0 - "@aws-sdk/config-resolver": 3.231.0 - "@aws-sdk/credential-provider-node": 3.231.0 + "@aws-sdk/client-sts": 3.245.0 + "@aws-sdk/config-resolver": 3.234.0 + "@aws-sdk/credential-provider-node": 3.245.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -533,7 +534,7 @@ __metadata: "@aws-sdk/middleware-host-header": 3.226.0 "@aws-sdk/middleware-logger": 3.226.0 "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.229.0 + "@aws-sdk/middleware-retry": 3.235.0 "@aws-sdk/middleware-sdk-sqs": 3.226.0 "@aws-sdk/middleware-serde": 3.226.0 "@aws-sdk/middleware-signing": 3.226.0 @@ -542,15 +543,15 @@ __metadata: "@aws-sdk/node-config-provider": 3.226.0 "@aws-sdk/node-http-handler": 3.226.0 "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.226.0 + "@aws-sdk/smithy-client": 3.234.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/url-parser": 3.226.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.231.0 - "@aws-sdk/util-endpoints": 3.226.0 + "@aws-sdk/util-defaults-mode-browser": 3.234.0 + "@aws-sdk/util-defaults-mode-node": 3.234.0 + "@aws-sdk/util-endpoints": 3.245.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 "@aws-sdk/util-user-agent-node": 3.226.0 @@ -558,17 +559,17 @@ __metadata: "@aws-sdk/util-utf8-node": 3.208.0 fast-xml-parser: 4.0.11 tslib: ^2.3.1 - checksum: 9005c2ef37b9ba14f5f7821c91d062428f3dad8884f0a83b44674ba35694c63de6a7b6ee05c4abaf0b127a4ce0b3325ce2b1e1057f8d758fa7bae866d12b3883 + checksum: 994c18f001763e63b8cfd86ddcb8c7c8460f8bb0507759037315d15a37e2a2e49833091ec6db7b4181323a389b3b14085cf87eb00c1980479f1e184d63d7de74 languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.231.0" +"@aws-sdk/client-sso-oidc@npm:3.245.0": + version: 3.245.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.245.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.231.0 + "@aws-sdk/config-resolver": 3.234.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -577,39 +578,39 @@ __metadata: "@aws-sdk/middleware-host-header": 3.226.0 "@aws-sdk/middleware-logger": 3.226.0 "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.229.0 + "@aws-sdk/middleware-retry": 3.235.0 "@aws-sdk/middleware-serde": 3.226.0 "@aws-sdk/middleware-stack": 3.226.0 "@aws-sdk/middleware-user-agent": 3.226.0 "@aws-sdk/node-config-provider": 3.226.0 "@aws-sdk/node-http-handler": 3.226.0 "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.226.0 + "@aws-sdk/smithy-client": 3.234.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/url-parser": 3.226.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.231.0 - "@aws-sdk/util-endpoints": 3.226.0 + "@aws-sdk/util-defaults-mode-browser": 3.234.0 + "@aws-sdk/util-defaults-mode-node": 3.234.0 + "@aws-sdk/util-endpoints": 3.245.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 "@aws-sdk/util-user-agent-node": 3.226.0 "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 - checksum: 4ec5e5f0f25969df5d5341cd1f291a763ed2edaeb317228a7873f18f16471f2cbd83bd575f766a4f0f22c3ebfcf69ecd75891fd0518a205c69eb20ded8734c98 + checksum: 6f72ee0df276f8c4019be4d9b3fa1b2cbab7744b13f434f07c9314303290334296be1148276266715ef3cfb37e83ced448fd9d6bb34d09bd21ed41d0a83598dc languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/client-sso@npm:3.231.0" +"@aws-sdk/client-sso@npm:3.245.0": + version: 3.245.0 + resolution: "@aws-sdk/client-sso@npm:3.245.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.231.0 + "@aws-sdk/config-resolver": 3.234.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -618,40 +619,40 @@ __metadata: "@aws-sdk/middleware-host-header": 3.226.0 "@aws-sdk/middleware-logger": 3.226.0 "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.229.0 + "@aws-sdk/middleware-retry": 3.235.0 "@aws-sdk/middleware-serde": 3.226.0 "@aws-sdk/middleware-stack": 3.226.0 "@aws-sdk/middleware-user-agent": 3.226.0 "@aws-sdk/node-config-provider": 3.226.0 "@aws-sdk/node-http-handler": 3.226.0 "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.226.0 + "@aws-sdk/smithy-client": 3.234.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/url-parser": 3.226.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.231.0 - "@aws-sdk/util-endpoints": 3.226.0 + "@aws-sdk/util-defaults-mode-browser": 3.234.0 + "@aws-sdk/util-defaults-mode-node": 3.234.0 + "@aws-sdk/util-endpoints": 3.245.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 "@aws-sdk/util-user-agent-node": 3.226.0 "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 - checksum: 3551984b8c14f611daa93c7082f2a361caa0c8e985fbfc6d66674ec7f3624364aa7d3c8011aa334729022e3866e5323c6ac18a4ba3e840023128000994d99165 + checksum: e7dd235ee13465438a181c5de2f5bfc1acdaa12a07db74a3255dbb580004c33544d6773252b164dda2e2357ea83f3985afd060dfe42d6064732d36750764eda1 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.231.0, @aws-sdk/client-sts@npm:^3.208.0": - version: 3.231.0 - resolution: "@aws-sdk/client-sts@npm:3.231.0" +"@aws-sdk/client-sts@npm:3.245.0, @aws-sdk/client-sts@npm:^3.208.0": + version: 3.245.0 + resolution: "@aws-sdk/client-sts@npm:3.245.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.231.0 - "@aws-sdk/credential-provider-node": 3.231.0 + "@aws-sdk/config-resolver": 3.234.0 + "@aws-sdk/credential-provider-node": 3.245.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -660,7 +661,7 @@ __metadata: "@aws-sdk/middleware-host-header": 3.226.0 "@aws-sdk/middleware-logger": 3.226.0 "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.229.0 + "@aws-sdk/middleware-retry": 3.235.0 "@aws-sdk/middleware-sdk-sts": 3.226.0 "@aws-sdk/middleware-serde": 3.226.0 "@aws-sdk/middleware-signing": 3.226.0 @@ -669,15 +670,15 @@ __metadata: "@aws-sdk/node-config-provider": 3.226.0 "@aws-sdk/node-http-handler": 3.226.0 "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.226.0 + "@aws-sdk/smithy-client": 3.234.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/url-parser": 3.226.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.231.0 - "@aws-sdk/util-endpoints": 3.226.0 + "@aws-sdk/util-defaults-mode-browser": 3.234.0 + "@aws-sdk/util-defaults-mode-node": 3.234.0 + "@aws-sdk/util-endpoints": 3.245.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 "@aws-sdk/util-user-agent-node": 3.226.0 @@ -685,32 +686,32 @@ __metadata: "@aws-sdk/util-utf8-node": 3.208.0 fast-xml-parser: 4.0.11 tslib: ^2.3.1 - checksum: 377eabf0ff0523b7847fe1677084293c322d5525443a859f522b83363eb647a87721245f7b48f7232e2f2f3b49dfdaefdf274e9578915c24617c5d7540624aca + checksum: 3b052be86063978b47b2f4459062ea23a6d94c81951a97428a5445ff062d642a3460114cbf1b20d3925db0667d893db40cbe30b1b8b58a4d749c75d117aab460 languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/config-resolver@npm:3.231.0" +"@aws-sdk/config-resolver@npm:3.234.0": + version: 3.234.0 + resolution: "@aws-sdk/config-resolver@npm:3.234.0" dependencies: "@aws-sdk/signature-v4": 3.226.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/util-config-provider": 3.208.0 "@aws-sdk/util-middleware": 3.226.0 tslib: ^2.3.1 - checksum: 67ec8d1f547cdde45f9c0daec21864225cfc04fba732e5e157b59d23f987d588fdc1738e1ce43012f885bdb6e65da8105511f5816e5844a5b839192b5feecc64 + checksum: a72bdb1748d7f04c95436ab1e8650b51c1bfd2745114e52f7d05339c61bb6a859306be0c6cc0034ecf4f3b29a2d68b48fe362762a58c90ec55a3444b93b5700d languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.231.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.245.0": + version: 3.245.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.245.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.231.0 + "@aws-sdk/client-cognito-identity": 3.245.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: f0c2059379f703e72538b00e52d2f5ce01c69a8adf3af370af2e72cc971ffe44963e6611917032326c0207b11fe34133780540e4ab0412e36e6c34b589f3dec3 + checksum: af9ce2a19426056139c380fa2a016d5abb42117e262dc5c3f4741eb1f2d15b394e9b178d6efb2e32f59cd723c6090da769975505368fbbe79b8eb9258c6961a8 languageName: node linkType: hard @@ -738,37 +739,38 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.231.0" +"@aws-sdk/credential-provider-ini@npm:3.245.0": + version: 3.245.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.245.0" dependencies: "@aws-sdk/credential-provider-env": 3.226.0 "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.231.0 + "@aws-sdk/credential-provider-process": 3.226.0 + "@aws-sdk/credential-provider-sso": 3.245.0 "@aws-sdk/credential-provider-web-identity": 3.226.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: f6b11d4876602e65464bc25804781b78a6e0c66b39c293178d7e97f2f11c151bd6e23e1e31158c0442dfbc3076f417aeecf44c315d4e509b48e7cfc3be2e7472 + checksum: 35fcdb231efb573c60c25e67a27f64ca892ebab7931e715406826a4d3f87caecd525945f45ecaf7fb7e09a87a744678aba60249c74681160c9fb9d66c0490bf5 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.231.0, @aws-sdk/credential-provider-node@npm:^3.208.0": - version: 3.231.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.231.0" +"@aws-sdk/credential-provider-node@npm:3.245.0, @aws-sdk/credential-provider-node@npm:^3.208.0": + version: 3.245.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.245.0" dependencies: "@aws-sdk/credential-provider-env": 3.226.0 "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-ini": 3.231.0 + "@aws-sdk/credential-provider-ini": 3.245.0 "@aws-sdk/credential-provider-process": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.231.0 + "@aws-sdk/credential-provider-sso": 3.245.0 "@aws-sdk/credential-provider-web-identity": 3.226.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: e28266dce53130c6e28eb7e82028e29cb2db2f06e1f40c98ae7875bcf2e17553976899f02b93576070c7fd77c131046ec752f543f9aa7e32078e1f3a44c3acf5 + checksum: a9bd115016fc7ce7f2cb50c5cafcd759f861362bb9dd9629e4ea0056519d5b26ad256f6d1d84ef3327c75bef442de8c0e4b54b215870512b43c92866ed0f1403 languageName: node linkType: hard @@ -784,17 +786,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.231.0" +"@aws-sdk/credential-provider-sso@npm:3.245.0": + version: 3.245.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.245.0" dependencies: - "@aws-sdk/client-sso": 3.231.0 + "@aws-sdk/client-sso": 3.245.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/token-providers": 3.231.0 + "@aws-sdk/token-providers": 3.245.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: 0aa69ec7ea5b0115c53972c6ae0419687e0bebc7500fbefa77c1108ecb81e735227982b586180b2fe111427cba17fad75f6db61f69a8b5cf5ad079f7ee09107c + checksum: 95358504631d5451520d5090e7fb337b40dfc12ab30dd84d979165d881f2762798828003b13adcb35921223bf3a498b0e70b7a94ebc14e8b16a4f0adacded8f1 languageName: node linkType: hard @@ -810,25 +812,25 @@ __metadata: linkType: hard "@aws-sdk/credential-providers@npm:^3.208.0": - version: 3.231.0 - resolution: "@aws-sdk/credential-providers@npm:3.231.0" + version: 3.245.0 + resolution: "@aws-sdk/credential-providers@npm:3.245.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.231.0 - "@aws-sdk/client-sso": 3.231.0 - "@aws-sdk/client-sts": 3.231.0 - "@aws-sdk/credential-provider-cognito-identity": 3.231.0 + "@aws-sdk/client-cognito-identity": 3.245.0 + "@aws-sdk/client-sso": 3.245.0 + "@aws-sdk/client-sts": 3.245.0 + "@aws-sdk/credential-provider-cognito-identity": 3.245.0 "@aws-sdk/credential-provider-env": 3.226.0 "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-ini": 3.231.0 - "@aws-sdk/credential-provider-node": 3.231.0 + "@aws-sdk/credential-provider-ini": 3.245.0 + "@aws-sdk/credential-provider-node": 3.245.0 "@aws-sdk/credential-provider-process": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.231.0 + "@aws-sdk/credential-provider-sso": 3.245.0 "@aws-sdk/credential-provider-web-identity": 3.226.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: edbf6a2821c5bf38d40a83f8d7c8ab967fff85d2c10af79f6f5df40cd52ef185f988c6499552a0294ca98cb7db34cb77e046a78e779e5ff5d362d104c29acc83 + checksum: a6923907ce97232cf87565e5fc0dac872061d2f065f530f7c91d1693472dd26667a91a662283994b3886a84b557f45e8627d0c847a88ffa0fdf2458a0180bd43 languageName: node linkType: hard @@ -966,11 +968,11 @@ __metadata: linkType: hard "@aws-sdk/lib-storage@npm:^3.208.0": - version: 3.231.0 - resolution: "@aws-sdk/lib-storage@npm:3.231.0" + version: 3.245.0 + resolution: "@aws-sdk/lib-storage@npm:3.245.0" dependencies: "@aws-sdk/middleware-endpoint": 3.226.0 - "@aws-sdk/smithy-client": 3.226.0 + "@aws-sdk/smithy-client": 3.234.0 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 @@ -978,7 +980,7 @@ __metadata: peerDependencies: "@aws-sdk/abort-controller": ^3.0.0 "@aws-sdk/client-s3": ^3.0.0 - checksum: b58e96b3e2981ae55efaeb3282377187c6c753b8342e2a4d68415cdce30f545928e2b9919803f6f23c04fc907561dabbfb159b8320dde1756da34c93c7271e55 + checksum: 580221e5f577aad98a8b2ea362ec1c8198e8766ddc1503c4a0bb4afd2c96ad09b6cfc2d5aa252c7d0d3d8215a55bb39c65df1aceb525fb4f1118b4a1b801818d languageName: node linkType: hard @@ -1101,17 +1103,18 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/middleware-retry@npm:3.229.0" +"@aws-sdk/middleware-retry@npm:3.235.0": + version: 3.235.0 + resolution: "@aws-sdk/middleware-retry@npm:3.235.0" dependencies: "@aws-sdk/protocol-http": 3.226.0 "@aws-sdk/service-error-classification": 3.229.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/util-middleware": 3.226.0 + "@aws-sdk/util-retry": 3.229.0 tslib: ^2.3.1 uuid: ^8.3.2 - checksum: a146879b0d4d940aed398c4bfd288b28e678bff7cbe04983123caf3bcb73fecc801ec19d13ca82ac1b2977515dc71ebe28efc400c07839004213017f93369b04 + checksum: 397226fd10d8b0587a35ccab92160223f10740beb01ccac75dda0e30336b83c091c9aa51b9132a56ff6cccd6353b9e3c6ecf21ae18f20f8127e7e9e209e59a2a languageName: node linkType: hard @@ -1342,27 +1345,27 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/smithy-client@npm:3.226.0" +"@aws-sdk/smithy-client@npm:3.234.0": + version: 3.234.0 + resolution: "@aws-sdk/smithy-client@npm:3.234.0" dependencies: "@aws-sdk/middleware-stack": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: 7c77d26367b94286fd0eceb5036f3a931314ab24c01ae64f645ea1390b3dc94d443a751be2be504d36aeeef86c5412facdc7df9624a792d9e97e5d53531f850c + checksum: 7b8299f81fde410b8f597662d4174a29740cb2791a2377e5009a73c0e7531fb440712ab25c837a0351dbceac4763cc8fadc6d4362727cf3ae749b25515da4ea1 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/token-providers@npm:3.231.0" +"@aws-sdk/token-providers@npm:3.245.0": + version: 3.245.0 + resolution: "@aws-sdk/token-providers@npm:3.245.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.231.0 + "@aws-sdk/client-sso-oidc": 3.245.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: 3fe2b2776232f2aad499d74ec540431db013520a1c4e3cee6ed4ab4d5cb2a402b1b50dd60f64d1c95e9ebb2bcc44c2244462d62453b9f6226b73082930dcc119 + checksum: 900a73b999c50eb35b3eda594210448329f5068b57a2d8d57ee8e4f3d960116ece36952ca1fbe43b5e8e9119927de916033f73ff969bae3a8394d4ef98f1d0c7 languageName: node linkType: hard @@ -1449,39 +1452,39 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.226.0" +"@aws-sdk/util-defaults-mode-browser@npm:3.234.0": + version: 3.234.0 + resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.234.0" dependencies: "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/types": 3.226.0 bowser: ^2.11.0 tslib: ^2.3.1 - checksum: 80a1383ef46c9289b7ef88ed1223e07f06bd3989517157199e325492d3da465d42bd9a975432b6d7c0e7e11f21aea02e5d977ddcc28c9f8b9f13e172fce0e657 + checksum: 79a381a632f867477dc7f948243c8ba82932d3f10325c76a5f2cf96412560648d149ba43ee31794bc45d81158a8c361d890b291880fc0c05f9bafc99cded5ef4 languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.231.0": - version: 3.231.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.231.0" +"@aws-sdk/util-defaults-mode-node@npm:3.234.0": + version: 3.234.0 + resolution: "@aws-sdk/util-defaults-mode-node@npm:3.234.0" dependencies: - "@aws-sdk/config-resolver": 3.231.0 + "@aws-sdk/config-resolver": 3.234.0 "@aws-sdk/credential-provider-imds": 3.226.0 "@aws-sdk/node-config-provider": 3.226.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: 6dca6704798145569f25002605c4918890ebd2b7bf56d20909192993eea5bcf8fdceff7f51484c9ab7e009a77c3d371e0935666d204c819e703128e857859e73 + checksum: b70becd9e561c1622c75a452ed8c7a8b14b84eba35988159f29476db8c2b47ec72f0b7c19d1a252c725756af1fff1df4201e5e92b6136d1df9170e806dca5219 languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/util-endpoints@npm:3.226.0" +"@aws-sdk/util-endpoints@npm:3.245.0": + version: 3.245.0 + resolution: "@aws-sdk/util-endpoints@npm:3.245.0" dependencies: "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: a05d38c4901801ff8c33d3469b8248ae07a2bb761e8b87f9eb62d7b977bd447fc8a1601c18692a035662818b223be97957d63d389b5393fdd65227cc25aa7903 + checksum: 22783fb178e8901385b20b0d19b944ad41297cc19f0561ac1722e86757ca6910fd3766626a0493372f718a0726bef920a5b39cc41fdceb1012f14e833541041b languageName: node linkType: hard @@ -1863,14 +1866,21 @@ __metadata: languageName: node linkType: hard +"@azure/msal-common@npm:^9.0.2": + version: 9.0.2 + resolution: "@azure/msal-common@npm:9.0.2" + checksum: 5a44d23b1d0f80d3e2221d157c1bd48bdfd19f5a4ac2fc58c73c52ffd25868c1760ea27ad0408931e07f552adc19764757bf91f7bec59258d9d931274df15657 + languageName: node + linkType: hard + "@azure/msal-node@npm:^1.10.0": - version: 1.11.0 - resolution: "@azure/msal-node@npm:1.11.0" + version: 1.14.6 + resolution: "@azure/msal-node@npm:1.14.6" dependencies: - "@azure/msal-common": ^7.1.0 - jsonwebtoken: ^8.5.1 + "@azure/msal-common": ^9.0.2 + jsonwebtoken: ^9.0.0 uuid: ^8.3.0 - checksum: b7fff0e756e9f3ba351ddbfd097a7885bc14e735f80d504f2e309c251a333c6a2f8755b0d462e5aee386439530d659c2d0d71c1345b7d3f85e87cc5b4f21299e + checksum: 7fb2085fe772474bb4c6c1e0a2467da6b2380dfa66f7c67f63d4a8774f591744dc64a6f3337d43c810ff433bc327be470ece59dcd0fa7aff4459e32beb4c738b languageName: node linkType: hard @@ -3287,7 +3297,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.10.2, @babel/runtime-corejs3@npm:^7.11.2, @babel/runtime-corejs3@npm:^7.18.9": +"@babel/runtime-corejs3@npm:^7.11.2, @babel/runtime-corejs3@npm:^7.18.9": version: 7.18.9 resolution: "@babel/runtime-corejs3@npm:7.18.9" dependencies: @@ -3297,12 +3307,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.10.2, @babel/runtime@npm:^7.10.4, @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.6, @babel/runtime@npm:^7.18.9, @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.2, @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.18.9 - resolution: "@babel/runtime@npm:7.18.9" +"@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.6, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.7, @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.2, @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.20.7 + resolution: "@babel/runtime@npm:7.20.7" dependencies: - regenerator-runtime: ^0.13.4 - checksum: 36dd736baba7164e82b3cc9d43e081f0cb2d05ff867ad39cac515d99546cee75b7f782018b02a3dcf5f2ef3d27f319faa68965fdfec49d4912c60c6002353a2e + regenerator-runtime: ^0.13.11 + checksum: 4629ce5c46f06cca9cfb9b7fc00d48003335a809888e2b91ec2069a2dcfbfef738480cff32ba81e0b7c290f8918e5c22ddcf2b710001464ee84ba62c7e32a3a3 languageName: node linkType: hard @@ -3378,11 +3388,41 @@ __metadata: "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-tasks": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/cli-common": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/config-loader": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" + "@backstage/types": "workspace:^" + "@manypkg/get-packages": ^1.1.3 + "@types/compression": ^1.7.0 + "@types/cors": ^2.8.6 + "@types/express": ^4.17.6 + "@types/fs-extra": ^9.0.3 + "@types/http-errors": ^2.0.0 + "@types/minimist": ^1.2.0 + "@types/morgan": ^1.9.0 + "@types/node-forge": ^1.3.0 + "@types/stoppable": ^1.1.0 + compression: ^1.7.4 + cors: ^2.8.5 express: ^4.17.1 express-promise-router: ^4.1.0 + fs-extra: 10.1.0 + helmet: ^6.0.0 + http-errors: ^2.0.0 + lodash: ^4.17.21 + logform: ^2.3.2 + minimatch: ^5.0.0 + minimist: ^1.2.5 + morgan: ^1.10.0 + node-forge: ^1.3.1 + selfsigned: ^2.0.0 + stoppable: ^1.1.0 + supertest: ^6.1.3 winston: ^3.2.1 + winston-transport: ^4.5.0 languageName: unknown linkType: soft @@ -3390,6 +3430,8 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/backend-common@workspace:packages/backend-common" dependencies: + "@backstage/backend-app-api": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/cli-common": "workspace:^" @@ -3428,7 +3470,7 @@ __metadata: aws-sdk: ^2.840.0 aws-sdk-mock: ^5.2.1 base64-stream: ^1.0.0 - better-sqlite3: ^7.5.0 + better-sqlite3: ^8.0.0 compression: ^1.7.4 concat-stream: ^2.0.0 cors: ^2.8.5 @@ -3463,6 +3505,7 @@ __metadata: tar: ^6.1.12 uuid: ^8.3.2 winston: ^3.2.1 + winston-transport: ^4.5.0 yauzl: ^2.10.0 yn: ^4.0.0 peerDependencies: @@ -3479,6 +3522,7 @@ __metadata: dependencies: "@backstage/backend-app-api": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" languageName: unknown linkType: soft @@ -3487,15 +3531,15 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/backend-plugin-api@workspace:packages/backend-plugin-api" dependencies: - "@backstage/backend-common": "workspace:^" "@backstage/backend-tasks": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" + "@backstage/types": "workspace:^" "@types/express": ^4.17.6 express: ^4.17.1 - winston: ^3.2.1 - winston-transport: ^4.5.0 + knex: ^2.0.0 languageName: unknown linkType: soft @@ -3531,11 +3575,16 @@ __metadata: "@backstage/backend-plugin-api": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" - better-sqlite3: ^7.5.0 + "@backstage/plugin-auth-node": "workspace:^" + "@backstage/types": "workspace:^" + "@types/supertest": ^2.0.8 + better-sqlite3: ^8.0.0 + express: ^4.17.1 knex: ^2.0.0 msw: ^0.49.0 mysql2: ^2.2.5 pg: ^8.3.0 + supertest: ^6.1.3 testcontainers: ^8.1.2 uuid: ^8.0.0 languageName: unknown @@ -3553,7 +3602,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@^1.1.2, @backstage/catalog-model@^1.1.3, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@^1.1.3, @backstage/catalog-model@^1.1.4, @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: @@ -3700,7 +3749,6 @@ __metadata: tar: ^6.1.12 terser-webpack-plugin: ^5.1.3 ts-node: ^10.0.0 - type-fest: ^2.0.0 util: ^0.12.3 webpack: ^5.70.0 webpack-dev-server: ^4.7.3 @@ -3766,7 +3814,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@^1.0.3, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@^1.0.4, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -3812,7 +3860,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@^0.12.0, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": +"@backstage/core-components@^0.12.0, @backstage/core-components@^0.12.2, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": version: 0.0.0-use.local resolution: "@backstage/core-components@workspace:packages/core-components" dependencies: @@ -3883,58 +3931,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@npm:^0.11.2": - version: 0.11.2 - resolution: "@backstage/core-components@npm:0.11.2" - dependencies: - "@backstage/config": ^1.0.3 - "@backstage/core-plugin-api": ^1.0.7 - "@backstage/errors": ^1.1.2 - "@backstage/theme": ^0.2.16 - "@backstage/version-bridge": ^1.0.1 - "@material-table/core": ^3.1.0 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 - "@react-hookz/web": ^15.0.0 - "@types/react-sparklines": ^1.7.0 - "@types/react-text-truncate": ^0.14.0 - ansi-regex: ^6.0.1 - classnames: ^2.2.6 - d3-selection: ^3.0.0 - d3-shape: ^3.0.0 - d3-zoom: ^3.0.0 - dagre: ^0.8.5 - history: ^5.0.0 - immer: ^9.0.1 - lodash: ^4.17.21 - pluralize: ^8.0.0 - prop-types: ^15.7.2 - qs: ^6.9.4 - rc-progress: 3.4.0 - react-helmet: 6.1.0 - react-hook-form: ^7.12.2 - react-markdown: ^8.0.0 - react-sparklines: ^1.7.0 - react-syntax-highlighter: ^15.4.5 - react-text-truncate: ^0.19.0 - react-use: ^17.3.2 - react-virtualized-auto-sizer: ^1.0.6 - react-window: ^1.8.6 - remark-gfm: ^3.0.1 - zen-observable: ^0.8.15 - zod: ^3.11.6 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - 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 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 510a0c2594a9aa820293d79fbaeee72bef9ac5e6161645d05e2c64b7176050386984befa07921391f9758bfbf07f96170662f7881e894fb0b0f2787378b19182 - languageName: node - linkType: hard - -"@backstage/core-plugin-api@^1.0.7, @backstage/core-plugin-api@^1.1.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.1.0, @backstage/core-plugin-api@^1.2.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": version: 0.0.0-use.local resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api" dependencies: @@ -4019,7 +4016,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@^1.1.2, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4049,7 +4046,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@^1.1.6, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": +"@backstage/integration-react@^1.1.8, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": version: 0.0.0-use.local resolution: "@backstage/integration-react@workspace:packages/integration-react" dependencies: @@ -4096,7 +4093,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-adr-backend@workspace:plugins/adr-backend": +"@backstage/plugin-adr-backend@workspace:^, @backstage/plugin-adr-backend@workspace:plugins/adr-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-adr-backend@workspace:plugins/adr-backend" dependencies: @@ -4109,8 +4106,11 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-adr-common": "workspace:^" "@backstage/plugin-search-common": "workspace:^" + "@types/express": ^4.17.15 "@types/marked": ^4.0.0 "@types/supertest": ^2.0.8 + express: ^4.18.2 + express-promise-router: ^4.1.1 luxon: ^3.0.0 marked: ^4.0.14 msw: ^0.49.0 @@ -4158,9 +4158,7 @@ __metadata: "@types/git-url-parse": ^9.0.0 "@types/node": "*" cross-fetch: ^3.1.5 - git-url-parse: ^13.0.0 msw: ^0.49.0 - octokit: ^2.0.0 react-markdown: ^8.0.0 react-use: ^17.2.4 remark-gfm: ^3.0.1 @@ -4357,7 +4355,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-apollo-explorer@workspace:plugins/apollo-explorer" dependencies: - "@apollo/explorer": ^1.1.1 + "@apollo/explorer": ^2.0.0 "@backstage/cli": "workspace:^" "@backstage/core-app-api": "workspace:^" "@backstage/core-components": "workspace:^" @@ -4398,7 +4396,6 @@ __metadata: express: ^4.17.1 express-promise-router: ^4.1.0 fs-extra: 10.1.0 - get-port: ^6.1.2 globby: ^11.0.0 helmet: ^6.0.0 knex: ^2.0.0 @@ -4704,6 +4701,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" + "@backstage/theme": "workspace:^" "@date-io/luxon": 1.x "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 @@ -4729,7 +4727,7 @@ __metadata: "@openapitools/openapi-generator-cli": ^2.4.26 cross-fetch: ^3.1.5 msw: ^0.49.0 - ts-morph: ^15.0.0 + ts-morph: ^17.0.0 languageName: unknown linkType: soft @@ -4941,6 +4939,7 @@ __metadata: git-url-parse: ^13.0.0 lodash: ^4.17.21 luxon: ^3.0.0 + minimatch: ^5.1.2 msw: ^0.49.0 node-fetch: ^2.6.7 uuid: ^8.0.0 @@ -4995,7 +4994,6 @@ __metadata: "@types/luxon": ^3.0.0 express: ^4.17.1 express-promise-router: ^4.1.0 - get-port: ^6.1.2 knex: ^2.0.0 lodash: ^4.17.21 luxon: ^3.0.0 @@ -5100,7 +5098,7 @@ __metadata: "@types/lodash": ^4.14.151 "@types/supertest": ^2.0.8 "@types/uuid": ^8.0.0 - better-sqlite3: ^7.5.0 + better-sqlite3: ^8.0.0 codeowners-utils: ^1.0.2 core-js: ^3.6.5 express: ^4.17.1 @@ -5127,7 +5125,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@^1.0.7, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@^1.0.8, @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: @@ -5255,7 +5253,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@^1.2.0, @backstage/plugin-catalog-react@^1.2.1, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": +"@backstage/plugin-catalog-react@^1.2.1, @backstage/plugin-catalog-react@^1.2.3, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-react@workspace:plugins/catalog-react" dependencies: @@ -5288,6 +5286,7 @@ __metadata: cross-fetch: ^3.1.5 jwt-decode: ^3.1.0 lodash: ^4.17.21 + material-ui-popup-state: ^1.9.3 qs: ^6.9.4 react-test-renderer: ^16.13.1 react-use: ^17.2.4 @@ -6309,7 +6308,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home@^0.4.27, @backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home": +"@backstage/plugin-home@^0.4.29, @backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home": version: 0.0.0-use.local resolution: "@backstage/plugin-home@workspace:plugins/home" dependencies: @@ -6894,7 +6893,7 @@ __metadata: "@testing-library/react": ^12.1.3 cross-fetch: ^3.1.5 react-use: ^17.2.4 - swr: ^1.1.2 + swr: ^2.0.0 peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 @@ -6974,7 +6973,7 @@ __metadata: qs: ^6.9.4 react-hook-form: ^7.13.0 react-use: ^17.2.4 - swr: ^1.1.2 + swr: ^2.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 @@ -7111,6 +7110,29 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-scaffolder-backend-module-sentry@workspace:plugins/scaffolder-backend-module-sentry": + version: 0.0.0-use.local + resolution: "@backstage/plugin-scaffolder-backend-module-sentry@workspace:plugins/scaffolder-backend-module-sentry" + dependencies: + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/core-app-api": "workspace:^" + "@backstage/dev-utils": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/integration": "workspace:^" + "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@testing-library/jest-dom": ^5.10.1 + "@testing-library/react": ^12.1.3 + "@testing-library/user-event": ^14.0.0 + "@types/node": "*" + cross-fetch: ^3.1.5 + msw: ^0.49.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-scaffolder-backend-module-yeoman@workspace:plugins/scaffolder-backend-module-yeoman": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-yeoman@workspace:plugins/scaffolder-backend-module-yeoman" @@ -7202,6 +7224,55 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-scaffolder-react@workspace:^, @backstage/plugin-scaffolder-react@workspace:plugins/scaffolder-react": + version: 0.0.0-use.local + resolution: "@backstage/plugin-scaffolder-react@workspace:plugins/scaffolder-react" + dependencies: + "@backstage/catalog-client": "workspace:^" + "@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-catalog": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" + "@backstage/plugin-catalog-react": "workspace:^" + "@backstage/plugin-scaffolder-common": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/theme": "workspace:^" + "@backstage/types": "workspace:^" + "@backstage/version-bridge": "workspace:^" + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": 4.0.0-alpha.57 + "@rjsf/core": ^3.2.1 + "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16" + "@rjsf/material-ui": ^3.2.1 + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.16" + "@rjsf/utils": 5.0.0-beta.16 + "@rjsf/validator-ajv6": 5.0.0-beta.16 + "@testing-library/jest-dom": ^5.10.1 + "@testing-library/react": ^12.1.3 + "@testing-library/react-hooks": ^8.0.0 + "@testing-library/user-event": ^14.0.0 + "@types/json-schema": ^7.0.9 + classnames: ^2.2.6 + json-schema: ^0.4.0 + json-schema-library: ^7.3.9 + lodash: ^4.17.21 + qs: ^6.9.4 + react-use: ^17.2.4 + zen-observable: ^0.10.0 + zod: ~3.18.0 + zod-to-json-schema: ~3.18.0 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + languageName: unknown + linkType: soft + "@backstage/plugin-scaffolder@workspace:^, @backstage/plugin-scaffolder@workspace:plugins/scaffolder": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder@workspace:plugins/scaffolder" @@ -7222,6 +7293,7 @@ __metadata: "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-permission-react": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" + "@backstage/plugin-scaffolder-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@backstage/types": "workspace:^" @@ -7233,11 +7305,9 @@ __metadata: "@material-ui/lab": 4.0.0-alpha.57 "@react-hookz/web": ^20.0.0 "@rjsf/core": ^3.2.1 - "@rjsf/core-v5": "npm:@rjsf/core@^5.0.0-beta.14" + "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16" "@rjsf/material-ui": ^3.2.1 - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@^5.0.0-beta.14" - "@rjsf/utils": ^5.0.0-beta.14 - "@rjsf/validator-ajv6": ^5.0.0-beta.14 + "@rjsf/utils": 5.0.0-beta.16 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7259,7 +7329,7 @@ __metadata: msw: ^0.49.0 qs: ^6.9.4 react-use: ^17.2.4 - use-immer: ^0.7.0 + use-immer: ^0.8.0 yaml: ^2.0.0 zen-observable: ^0.10.0 zod: ~3.18.0 @@ -7603,9 +7673,13 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-stack-overflow-backend@workspace:plugins/stack-overflow-backend" dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" + "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" + msw: ^0.49.0 node-fetch: ^2.6.7 qs: ^6.9.4 winston: ^3.2.1 @@ -7949,7 +8023,7 @@ __metadata: "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 - jss: ~10.8.2 + jss: ~10.9.0 lodash: ^4.17.21 react-helmet: 6.1.0 react-use: ^17.2.4 @@ -7997,7 +8071,7 @@ __metadata: dompurify: ^2.2.9 event-source-polyfill: 1.0.25 git-url-parse: ^13.0.0 - jss: ~10.8.2 + jss: ~10.9.0 lodash: ^4.17.21 msw: ^0.49.0 react-helmet: 6.1.0 @@ -8095,6 +8169,7 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/plugin-catalog-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@backstage/types": "workspace:^" @@ -8223,11 +8298,8 @@ __metadata: "@backstage/cli-common": "workspace:^" "@backstage/errors": "workspace:^" "@manypkg/get-packages": ^1.1.3 - "@microsoft/api-documenter": ^7.17.11 - "@microsoft/api-extractor": ^7.23.0 - "@microsoft/api-extractor-model": ^7.17.2 - "@microsoft/tsdoc": 0.14.1 - "@microsoft/tsdoc-config": 0.16.1 + "@microsoft/api-documenter": ^7.19.27 + "@microsoft/api-extractor": ^7.33.7 "@types/is-glob": ^4.0.2 "@types/mock-fs": ^4.13.0 chalk: ^4.0.0 @@ -8239,7 +8311,9 @@ __metadata: mock-fs: ^5.1.0 ts-node: ^10.0.0 peerDependencies: - "@rushstack/node-core-library": "*" + "@microsoft/api-extractor-model": "*" + "@microsoft/tsdoc": "*" + "@microsoft/tsdoc-config": "*" prettier: ^2.8.1 typescript: "> 3.0.0" peerDependenciesMeta: @@ -8288,7 +8362,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/types@^1.0.0, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/types@^1.0.1, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -8299,7 +8373,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.1, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.2, @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: @@ -8334,15 +8408,15 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^6.1.2": - version: 6.1.2 - resolution: "@changesets/apply-release-plan@npm:6.1.2" +"@changesets/apply-release-plan@npm:^6.1.3": + version: 6.1.3 + resolution: "@changesets/apply-release-plan@npm:6.1.3" dependencies: - "@babel/runtime": ^7.10.4 - "@changesets/config": ^2.2.0 + "@babel/runtime": ^7.20.1 + "@changesets/config": ^2.3.0 "@changesets/get-version-range-type": ^0.3.2 - "@changesets/git": ^1.5.0 - "@changesets/types": ^5.2.0 + "@changesets/git": ^2.0.0 + "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 detect-indent: ^6.0.0 fs-extra: ^7.0.1 @@ -8351,51 +8425,51 @@ __metadata: prettier: ^2.7.1 resolve-from: ^5.0.0 semver: ^5.4.1 - checksum: efe2cdc493cb2182140b73ff76e34ee7c90887bfa2f42b4ec07db0107ec94b9c0e95519912dafcf9eb530ad2414487fbd61ca6e6d5f853fe383db93856d0d362 + checksum: 3772a6e0ede33abdac6fcc52359307f770d5fafa53295c83e0a11b81e5802b2fe5e74e4d672c0a082f5d73dc1a9ef56509870b81824111396f74de99ada9526b languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:^5.2.2": - version: 5.2.2 - resolution: "@changesets/assemble-release-plan@npm:5.2.2" +"@changesets/assemble-release-plan@npm:^5.2.3": + version: 5.2.3 + resolution: "@changesets/assemble-release-plan@npm:5.2.3" dependencies: - "@babel/runtime": ^7.10.4 + "@babel/runtime": ^7.20.1 "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.4 - "@changesets/types": ^5.2.0 + "@changesets/get-dependents-graph": ^1.3.5 + "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 semver: ^5.4.1 - checksum: 4f4a2108537ecbfbf9a554e441f4899f9c6d7e2b933deddd186d6f670ea1e52ebbbef3da01bc61b5cb735470536258b94d7bbac1035fe98dc277615d5017c61a + checksum: 2c61894414736b12e9a26903d73c387b65f4caba398e280488b885f4d0f4bb307aaa6bae140dfd754c85de6557bd07645accda2af6b8794837ab43823ba6215c languageName: node linkType: hard -"@changesets/changelog-git@npm:^0.1.13": - version: 0.1.13 - resolution: "@changesets/changelog-git@npm:0.1.13" +"@changesets/changelog-git@npm:^0.1.14": + version: 0.1.14 + resolution: "@changesets/changelog-git@npm:0.1.14" dependencies: - "@changesets/types": ^5.2.0 - checksum: c0e3b11a0a63794304e064ef01444503a864a1fbfc4c592bd3aec91ba6aa5c24fac91a47f7f0159f449cd6ce99c334290b465d84b1c98b6577937ff55974cc7e + "@changesets/types": ^5.2.1 + checksum: 60b45bb899e66cec669ab3884d5d18550cd30bf5a8b06f335eb72aa6c9e018dd3e0187e4df61c91a22076153e346b735b792f0e9c6186e6245b1b7aec2fc42d4 languageName: node linkType: hard "@changesets/cli@npm:^2.14.0": - version: 2.25.2 - resolution: "@changesets/cli@npm:2.25.2" + version: 2.26.0 + resolution: "@changesets/cli@npm:2.26.0" dependencies: - "@babel/runtime": ^7.10.4 - "@changesets/apply-release-plan": ^6.1.2 - "@changesets/assemble-release-plan": ^5.2.2 - "@changesets/changelog-git": ^0.1.13 - "@changesets/config": ^2.2.0 + "@babel/runtime": ^7.20.1 + "@changesets/apply-release-plan": ^6.1.3 + "@changesets/assemble-release-plan": ^5.2.3 + "@changesets/changelog-git": ^0.1.14 + "@changesets/config": ^2.3.0 "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.4 - "@changesets/get-release-plan": ^3.0.15 - "@changesets/git": ^1.5.0 + "@changesets/get-dependents-graph": ^1.3.5 + "@changesets/get-release-plan": ^3.0.16 + "@changesets/git": ^2.0.0 "@changesets/logger": ^0.0.5 - "@changesets/pre": ^1.0.13 - "@changesets/read": ^0.5.8 - "@changesets/types": ^5.2.0 - "@changesets/write": ^0.2.2 + "@changesets/pre": ^1.0.14 + "@changesets/read": ^0.5.9 + "@changesets/types": ^5.2.1 + "@changesets/write": ^0.2.3 "@manypkg/get-packages": ^1.1.3 "@types/is-ci": ^3.0.0 "@types/semver": ^6.0.0 @@ -8417,22 +8491,22 @@ __metadata: tty-table: ^4.1.5 bin: changeset: bin.js - checksum: 815c69cb6cee75ede88361582581d94a860d96335e7bab179481cd5e2bb1e60cc39662dccd2b2b87818e9c63a84ff9eb469ed27f13b6adf4401a699e49beb79c + checksum: 12a911b4196ff390ce114e27b475e59f5f5e1fdc7049d1ab04effe73d4811d99db47a030de6abe332300b4b2c43cffc537cec4883476b59b69bc23aee07cd5c5 languageName: node linkType: hard -"@changesets/config@npm:^2.2.0": - version: 2.2.0 - resolution: "@changesets/config@npm:2.2.0" +"@changesets/config@npm:^2.3.0": + version: 2.3.0 + resolution: "@changesets/config@npm:2.3.0" dependencies: "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.4 + "@changesets/get-dependents-graph": ^1.3.5 "@changesets/logger": ^0.0.5 - "@changesets/types": ^5.2.0 + "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 fs-extra: ^7.0.1 micromatch: ^4.0.2 - checksum: 18a6ae52150a7426bcaeb4018f7eb4e330dec69a448b093d604f1cd73d89b689eb791777cee5af57f9e572403ccbf196a572b33dbb702bae4bccfbbbd3be5ffc + checksum: 68a61437ffeda219f22f6d4d32bf8d428e6f284d7e0e191c0629f64f035a051b4068222b1ea3ff1866e5944a153004735dab82205404919f6806c97c546700b1 languageName: node linkType: hard @@ -8445,31 +8519,31 @@ __metadata: languageName: node linkType: hard -"@changesets/get-dependents-graph@npm:^1.3.4": - version: 1.3.4 - resolution: "@changesets/get-dependents-graph@npm:1.3.4" +"@changesets/get-dependents-graph@npm:^1.3.5": + version: 1.3.5 + resolution: "@changesets/get-dependents-graph@npm:1.3.5" dependencies: - "@changesets/types": ^5.2.0 + "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 chalk: ^2.1.0 fs-extra: ^7.0.1 semver: ^5.4.1 - checksum: 584852e17fd102271dea520f851c85130605f232f7f52126d202b0041269af12d5681744bfa7fecf41048e5fd62a71da726be471207832060408d9cfb35ec3fb + checksum: d7abb1da21804fd66b1458e46be2f2aec741145a43500b0463a5acfbb420ac5ce776a7328fa660ad4e6e811f933bd6f36e7bbaf00fb3f591d46f0b8e7108fdcd languageName: node linkType: hard -"@changesets/get-release-plan@npm:^3.0.15": - version: 3.0.15 - resolution: "@changesets/get-release-plan@npm:3.0.15" +"@changesets/get-release-plan@npm:^3.0.16": + version: 3.0.16 + resolution: "@changesets/get-release-plan@npm:3.0.16" dependencies: - "@babel/runtime": ^7.10.4 - "@changesets/assemble-release-plan": ^5.2.2 - "@changesets/config": ^2.2.0 - "@changesets/pre": ^1.0.13 - "@changesets/read": ^0.5.8 - "@changesets/types": ^5.2.0 + "@babel/runtime": ^7.20.1 + "@changesets/assemble-release-plan": ^5.2.3 + "@changesets/config": ^2.3.0 + "@changesets/pre": ^1.0.14 + "@changesets/read": ^0.5.9 + "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 - checksum: f2d33982dfeabe12e0eba976a3cc68e05bdd834b4dd6283f42464d028852e46f90cb14b84f0b5425813c787494d0490dc12df5d25d63559d07f47f9a7cb87c12 + checksum: ab8360c17f69437ad51edfd8910a2609ab8dc1e8cf006994b3938b2551b1eb08b7ab8043b8bf1e94916cbadd89e357a0c1148e20eab8bb5e3ae284384d239942 languageName: node linkType: hard @@ -8480,17 +8554,18 @@ __metadata: languageName: node linkType: hard -"@changesets/git@npm:^1.5.0": - version: 1.5.0 - resolution: "@changesets/git@npm:1.5.0" +"@changesets/git@npm:^2.0.0": + version: 2.0.0 + resolution: "@changesets/git@npm:2.0.0" dependencies: - "@babel/runtime": ^7.10.4 + "@babel/runtime": ^7.20.1 "@changesets/errors": ^0.1.4 - "@changesets/types": ^5.2.0 + "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 is-subdir: ^1.1.1 + micromatch: ^4.0.2 spawndamnit: ^2.0.0 - checksum: 7208d5bff9c584aa752ca6f647ba5e97356213d00c88cce65c24c6bab1b3837c14f8977c2384a7fecb81e20a0586d4cc1fddb408a38e7dd818ef18377d01ee54 + checksum: 3820b7b689bbe8dfb93222c766bee214e68a45f07b2b5c8056891f9ffe6f1e369c0f84388246a9eea5317b496ae80ffd1508319190f79c359f060ebf8ccb7b13 languageName: node linkType: hard @@ -8503,42 +8578,42 @@ __metadata: languageName: node linkType: hard -"@changesets/parse@npm:^0.3.15": - version: 0.3.15 - resolution: "@changesets/parse@npm:0.3.15" +"@changesets/parse@npm:^0.3.16": + version: 0.3.16 + resolution: "@changesets/parse@npm:0.3.16" dependencies: - "@changesets/types": ^5.2.0 + "@changesets/types": ^5.2.1 js-yaml: ^3.13.1 - checksum: 1e17f494954140d7885f4be76ac7708c19930f08ecf0b58bcee09160ad6e59223da8899df0709a78e5b5fa419f0d60eccbb34bf0c11d564e24f766c4654e3384 + checksum: 475f808ac8d33ec90af3914d55af1da8eeb9336d6cab7dd9e5be74af844f0ec04f4a67d5237a1d3284a468e0c9198e2be01d0e5870a1b28e63bc240f5f1ffea9 languageName: node linkType: hard -"@changesets/pre@npm:^1.0.13": - version: 1.0.13 - resolution: "@changesets/pre@npm:1.0.13" +"@changesets/pre@npm:^1.0.14": + version: 1.0.14 + resolution: "@changesets/pre@npm:1.0.14" dependencies: - "@babel/runtime": ^7.10.4 + "@babel/runtime": ^7.20.1 "@changesets/errors": ^0.1.4 - "@changesets/types": ^5.2.0 + "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 fs-extra: ^7.0.1 - checksum: f1cc5721546c66977a2fc62428aae9d62f78a04aefac224ac7014172807afa9d07f6da1e326d0a14b1ff12840b0379a7ec24e7984839deb337cd203b63c24b1d + checksum: 6b849bd6f916476a5b5664bc4286020bee506985c82f723a757fa4e681b0b7129db81751f16072ac55a980ffd83a4b234d6b8d0f8b6bc889aa0c0fd5377431e8 languageName: node linkType: hard -"@changesets/read@npm:^0.5.8": - version: 0.5.8 - resolution: "@changesets/read@npm:0.5.8" +"@changesets/read@npm:^0.5.9": + version: 0.5.9 + resolution: "@changesets/read@npm:0.5.9" dependencies: - "@babel/runtime": ^7.10.4 - "@changesets/git": ^1.5.0 + "@babel/runtime": ^7.20.1 + "@changesets/git": ^2.0.0 "@changesets/logger": ^0.0.5 - "@changesets/parse": ^0.3.15 - "@changesets/types": ^5.2.0 + "@changesets/parse": ^0.3.16 + "@changesets/types": ^5.2.1 chalk: ^2.1.0 fs-extra: ^7.0.1 p-filter: ^2.1.0 - checksum: cc32c5a3366be58c5b00988940eb6677898814de7ce60a3c4785d064e0df7563627f8dcfa0620f3ef9cea6f328ce538b2ba7d430c35c883f212b71a94026b2d8 + checksum: 0875a80829186de2da55bc0347601cc31b269d54fb6967a5093abacbbd9f949e352907b8340b61348a304228fdade670ded151327f16eea3424b5b4b2bb9888c languageName: node linkType: hard @@ -8549,23 +8624,23 @@ __metadata: languageName: node linkType: hard -"@changesets/types@npm:^5.2.0": - version: 5.2.0 - resolution: "@changesets/types@npm:5.2.0" - checksum: 579cf8bd2d3a03f293871976d8641531667527f248dc29310a70928d6400cef5df3d09e75beeb2ccf5d384fa1f294f0a2db243c6ebf53913d1f67e283e826f91 +"@changesets/types@npm:^5.2.1": + version: 5.2.1 + resolution: "@changesets/types@npm:5.2.1" + checksum: 527dc1aa41b040fe35bcd55f7d07bec710320b179b000c429723e25b87aac18be487daf5047d4fecf2781aad78f73abff111e76e411b652f7a2e812a464c69f2 languageName: node linkType: hard -"@changesets/write@npm:^0.2.2": - version: 0.2.2 - resolution: "@changesets/write@npm:0.2.2" +"@changesets/write@npm:^0.2.3": + version: 0.2.3 + resolution: "@changesets/write@npm:0.2.3" dependencies: - "@babel/runtime": ^7.10.4 - "@changesets/types": ^5.2.0 + "@babel/runtime": ^7.20.1 + "@changesets/types": ^5.2.1 fs-extra: ^7.0.1 human-id: ^1.0.2 prettier: ^2.7.1 - checksum: e23fb4a88e12af32db59d2f1866380ec4a50e7fa55cb55d860619f0735c5078ed170f832125672bb007b7a0cced67d9304a1b81260a7224af6afe0e3957dc999 + checksum: 40ad8069f9adc565b78a5f25992e31b41a12e551d94c29e1b4def49ce98871a1e358feda6536be8b363a6dba18b1226a22ecfc60fdd7bc1e74bfcf46b07f91be languageName: node linkType: hard @@ -8663,13 +8738,13 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0": - version: 6.7.1 - resolution: "@codemirror/view@npm:6.7.1" + version: 6.7.2 + resolution: "@codemirror/view@npm:6.7.2" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: 75a5846d61e63027e9bf1dfd0b507932934cb7650b7959c1191e68b161eb1756e9773f964c4331970b51864aef8f7954bc5cc8fdb51b0f6533de6c20568833ed + checksum: ad08a4a0a50e2b34c0141311e7db9f045a2186b81ae28271318374b5b9964435267ec0af210b5d061cb84bc8fdca6dabc1919eb7fe05837d931038b9095c3f8c languageName: node linkType: hard @@ -8844,9 +8919,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/android-arm64@npm:0.16.7" +"@esbuild/android-arm64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/android-arm64@npm:0.16.16" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -8858,65 +8933,65 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/android-arm@npm:0.16.7" +"@esbuild/android-arm@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/android-arm@npm:0.16.16" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/android-x64@npm:0.16.7" +"@esbuild/android-x64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/android-x64@npm:0.16.16" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/darwin-arm64@npm:0.16.7" +"@esbuild/darwin-arm64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/darwin-arm64@npm:0.16.16" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/darwin-x64@npm:0.16.7" +"@esbuild/darwin-x64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/darwin-x64@npm:0.16.16" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/freebsd-arm64@npm:0.16.7" +"@esbuild/freebsd-arm64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/freebsd-arm64@npm:0.16.16" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/freebsd-x64@npm:0.16.7" +"@esbuild/freebsd-x64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/freebsd-x64@npm:0.16.16" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-arm64@npm:0.16.7" +"@esbuild/linux-arm64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-arm64@npm:0.16.16" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-arm@npm:0.16.7" +"@esbuild/linux-arm@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-arm@npm:0.16.16" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-ia32@npm:0.16.7" +"@esbuild/linux-ia32@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-ia32@npm:0.16.16" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -8928,104 +9003,104 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-loong64@npm:0.16.7" +"@esbuild/linux-loong64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-loong64@npm:0.16.16" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-mips64el@npm:0.16.7" +"@esbuild/linux-mips64el@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-mips64el@npm:0.16.16" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-ppc64@npm:0.16.7" +"@esbuild/linux-ppc64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-ppc64@npm:0.16.16" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-riscv64@npm:0.16.7" +"@esbuild/linux-riscv64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-riscv64@npm:0.16.16" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-s390x@npm:0.16.7" +"@esbuild/linux-s390x@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-s390x@npm:0.16.16" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/linux-x64@npm:0.16.7" +"@esbuild/linux-x64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/linux-x64@npm:0.16.16" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/netbsd-x64@npm:0.16.7" +"@esbuild/netbsd-x64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/netbsd-x64@npm:0.16.16" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/openbsd-x64@npm:0.16.7" +"@esbuild/openbsd-x64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/openbsd-x64@npm:0.16.16" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/sunos-x64@npm:0.16.7" +"@esbuild/sunos-x64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/sunos-x64@npm:0.16.16" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/win32-arm64@npm:0.16.7" +"@esbuild/win32-arm64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/win32-arm64@npm:0.16.16" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/win32-ia32@npm:0.16.7" +"@esbuild/win32-ia32@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/win32-ia32@npm:0.16.16" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.16.7": - version: 0.16.7 - resolution: "@esbuild/win32-x64@npm:0.16.7" +"@esbuild/win32-x64@npm:0.16.16": + version: 0.16.16 + resolution: "@esbuild/win32-x64@npm:0.16.16" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.3.3": - version: 1.3.3 - resolution: "@eslint/eslintrc@npm:1.3.3" +"@eslint/eslintrc@npm:^1.4.1": + version: 1.4.1 + resolution: "@eslint/eslintrc@npm:1.4.1" dependencies: ajv: ^6.12.4 debug: ^4.3.2 espree: ^9.4.0 - globals: ^13.15.0 + globals: ^13.19.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: f03e9d6727efd3e0719da2051ea80c0c73d20e28c171121527dbb868cd34232ca9c1d0525a66e517a404afea26624b1e47895b6a92474678418c2f50c9566694 + checksum: cd3e5a8683db604739938b1c1c8b77927dc04fce3e28e0c88e7f2cd4900b89466baf83dfbad76b2b9e4d2746abdd00dd3f9da544d3e311633d8693f327d04cd7 languageName: node linkType: hard @@ -9105,14 +9180,14 @@ __metadata: linkType: hard "@google-cloud/firestore@npm:^6.0.0": - version: 6.4.1 - resolution: "@google-cloud/firestore@npm:6.4.1" + version: 6.4.2 + resolution: "@google-cloud/firestore@npm:6.4.2" dependencies: fast-deep-equal: ^3.1.1 functional-red-black-tree: ^1.0.1 - google-gax: ^3.5.1 + google-gax: ^3.5.2 protobufjs: ^7.0.0 - checksum: 7bd79d7444cefd8ffe8f768c28dbd1f0b32628ff5b611b4bdaa9b415428436f5368a8e258a002948d084381762b64501a574828c51c5cea7c054cc604f93b6d6 + checksum: c259f59905d4939f0b1fff2fdfa3db38a0436454af9e4a8939ea951ee700d5f801375ed090e77f610fbf3f02db1aeba9d70437eb6a8ca6f0ba2088c8964c58d0 languageName: node linkType: hard @@ -9141,8 +9216,8 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^6.0.0": - version: 6.8.0 - resolution: "@google-cloud/storage@npm:6.8.0" + version: 6.9.0 + resolution: "@google-cloud/storage@npm:6.9.0" dependencies: "@google-cloud/paginator": ^3.0.7 "@google-cloud/projectify": ^3.0.0 @@ -9161,7 +9236,7 @@ __metadata: retry-request: ^5.0.0 teeny-request: ^8.0.0 uuid: ^8.0.0 - checksum: c0b9eae1eae4aadd22b4ea7699345790adcc063874c5f08477425840001f6822091bdb8db7b67f2a9bb77acbbc4257ed40c14ba5cb2ab91addf2902d56714ddf + checksum: 886b9aad6bd44901b22a6e77c6430bae0effc2137e6c18196d151db8b9690d80726ecc4b60ac1ba315372305010282de6b9845ef23eaa7351449d0193aac62cc languageName: node linkType: hard @@ -9199,14 +9274,14 @@ __metadata: linkType: hard "@graphql-codegen/cli@npm:^2.3.1": - version: 2.16.1 - resolution: "@graphql-codegen/cli@npm:2.16.1" + version: 2.16.4 + resolution: "@graphql-codegen/cli@npm:2.16.4" dependencies: "@babel/generator": ^7.18.13 "@babel/template": ^7.18.10 "@babel/types": ^7.18.13 "@graphql-codegen/core": 2.6.8 - "@graphql-codegen/plugin-helpers": ^3.1.1 + "@graphql-codegen/plugin-helpers": ^3.1.2 "@graphql-tools/apollo-engine-loader": ^7.3.6 "@graphql-tools/code-file-loader": ^7.3.13 "@graphql-tools/git-loader": ^7.2.13 @@ -9214,17 +9289,17 @@ __metadata: "@graphql-tools/graphql-file-loader": ^7.5.0 "@graphql-tools/json-file-loader": ^7.4.1 "@graphql-tools/load": 7.8.0 - "@graphql-tools/prisma-loader": ^7.2.7 + "@graphql-tools/prisma-loader": ^7.2.49 "@graphql-tools/url-loader": ^7.13.2 - "@graphql-tools/utils": ^8.9.0 - "@whatwg-node/fetch": ^0.5.0 + "@graphql-tools/utils": ^9.0.0 + "@whatwg-node/fetch": ^0.6.0 chalk: ^4.1.0 chokidar: ^3.5.2 cosmiconfig: ^7.0.0 - cosmiconfig-typescript-loader: 4.1.1 + cosmiconfig-typescript-loader: 4.3.0 debounce: ^1.2.0 detect-indent: ^6.0.0 - graphql-config: 4.3.6 + graphql-config: 4.4.0 inquirer: ^8.0.0 is-glob: ^4.0.1 json-to-pretty-yaml: ^1.2.2 @@ -9238,12 +9313,13 @@ __metadata: yargs: ^17.0.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + ts-node: ">=10" bin: gql-gen: cjs/bin.js graphql-code-generator: cjs/bin.js graphql-codegen: cjs/bin.js graphql-codegen-esm: esm/bin.js - checksum: 5b8adecc90af4594b6819d97173acbcb0edbd2dd3b35981dd0ef79bda722c91e4e3c581fffa68396640a9f09097f3e826fd2cf16dc1718a95ef180f934376df8 + checksum: 6a6d99ac0220e993d71f30858b2b819bbc51685e7b376262493eff916e19be26d031f6859e71a8050c26cc69899bd2c5c0b797de09c45ae0312fd52bca2d8e65 languageName: node linkType: hard @@ -9262,26 +9338,26 @@ __metadata: linkType: hard "@graphql-codegen/graphql-modules-preset@npm:^2.3.2": - version: 2.5.9 - resolution: "@graphql-codegen/graphql-modules-preset@npm:2.5.9" + version: 2.5.11 + resolution: "@graphql-codegen/graphql-modules-preset@npm:2.5.11" dependencies: - "@graphql-codegen/plugin-helpers": ^3.1.1 - "@graphql-codegen/visitor-plugin-common": 2.13.5 - "@graphql-tools/utils": ^8.8.0 + "@graphql-codegen/plugin-helpers": ^3.1.2 + "@graphql-codegen/visitor-plugin-common": 2.13.7 + "@graphql-tools/utils": ^9.0.0 change-case-all: 1.0.15 parse-filepath: ^1.0.2 tslib: ~2.4.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 8b192ac413b2a182a3a008c69af69ea63e548e4ba0015f193880a70f6eec8eff6f8a263a56cefe13e140e6b19238e8e2f9fbf6420adceece8c5320ce9240fd8d + checksum: c77f05964ff1253ee522ee43ef19e939933b3162150da0d6c0c9fb243020f058af1146160aba307427f0ecf6dfafaa16935fc8fe57cb74f94fb784671bb31f6b languageName: node linkType: hard -"@graphql-codegen/plugin-helpers@npm:^3.1.1": - version: 3.1.1 - resolution: "@graphql-codegen/plugin-helpers@npm:3.1.1" +"@graphql-codegen/plugin-helpers@npm:^3.1.1, @graphql-codegen/plugin-helpers@npm:^3.1.2": + version: 3.1.2 + resolution: "@graphql-codegen/plugin-helpers@npm:3.1.2" dependencies: - "@graphql-tools/utils": ^8.8.0 + "@graphql-tools/utils": ^9.0.0 change-case-all: 1.0.15 common-tags: 1.8.2 import-from: 4.0.0 @@ -9289,62 +9365,62 @@ __metadata: tslib: ~2.4.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 22a15d4638ad449f654dab7a1e4968a82a50e3ab38f3b0974ae767a0a80e251fece436933f575f158da67564331d6046223b83eb10e0f1b93e78a15d7d0f684e + checksum: 4d0c615738570681b5ffd3c07305a35d6aa3e5fd87c9199c0a670b95529ab865b1df978ce584d5b415107a567ac484e56a48db129a6d1d2eb8a254fbd3260e39 languageName: node linkType: hard -"@graphql-codegen/schema-ast@npm:^2.6.0": - version: 2.6.0 - resolution: "@graphql-codegen/schema-ast@npm:2.6.0" +"@graphql-codegen/schema-ast@npm:^2.6.1": + version: 2.6.1 + resolution: "@graphql-codegen/schema-ast@npm:2.6.1" dependencies: - "@graphql-codegen/plugin-helpers": ^3.1.1 - "@graphql-tools/utils": ^8.8.0 + "@graphql-codegen/plugin-helpers": ^3.1.2 + "@graphql-tools/utils": ^9.0.0 tslib: ~2.4.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: a32e22fdd5cdab743ed7920249de6b00cbca0742633cfdbfed330c04c397bf1e0179ab141303a70cf733b6db27e537a67c6b6b50e70fb1d0767fc8d8de7a129f + checksum: f44338ac66e6a1f6238c33cdf65778bb467fe5a93767988135cb4e112d3be4d3c7e8aeeffe323754e8d6b0cbc5a52cb71452bfc42a15bc7031ebaa9b3d5da676 languageName: node linkType: hard "@graphql-codegen/typescript-resolvers@npm:^2.4.3": - version: 2.7.10 - resolution: "@graphql-codegen/typescript-resolvers@npm:2.7.10" + version: 2.7.12 + resolution: "@graphql-codegen/typescript-resolvers@npm:2.7.12" dependencies: - "@graphql-codegen/plugin-helpers": ^3.1.1 - "@graphql-codegen/typescript": ^2.8.5 - "@graphql-codegen/visitor-plugin-common": 2.13.5 - "@graphql-tools/utils": ^8.8.0 + "@graphql-codegen/plugin-helpers": ^3.1.2 + "@graphql-codegen/typescript": ^2.8.7 + "@graphql-codegen/visitor-plugin-common": 2.13.7 + "@graphql-tools/utils": ^9.0.0 auto-bind: ~4.0.0 tslib: ~2.4.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 42ade297e6bd75056d2576d8d59b59725a35a4c929613d1764887466dea8c3669c0e5a334b14727b66b49bc605ba340910ca07d6d95bab9a8359b2e475209894 + checksum: f8f60d972720f42f7407d91febfa4ae91f4e6cc2bd990babe85f8d1c77a3fa8dcc4ac85d8267ce24942703fc28ff6f38f4d8215e098f34fe1b35063aa08ef5a0 languageName: node linkType: hard -"@graphql-codegen/typescript@npm:^2.4.2, @graphql-codegen/typescript@npm:^2.8.5": - version: 2.8.5 - resolution: "@graphql-codegen/typescript@npm:2.8.5" +"@graphql-codegen/typescript@npm:^2.4.2, @graphql-codegen/typescript@npm:^2.8.7": + version: 2.8.7 + resolution: "@graphql-codegen/typescript@npm:2.8.7" dependencies: - "@graphql-codegen/plugin-helpers": ^3.1.1 - "@graphql-codegen/schema-ast": ^2.6.0 - "@graphql-codegen/visitor-plugin-common": 2.13.5 + "@graphql-codegen/plugin-helpers": ^3.1.2 + "@graphql-codegen/schema-ast": ^2.6.1 + "@graphql-codegen/visitor-plugin-common": 2.13.7 auto-bind: ~4.0.0 tslib: ~2.4.0 peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: dd13cd82f202e82591262fd515b4cfd6a9d270b1d9447240ed75f0b374565e0c4a13297724bc94df5a7ad1a400cf63f83c439af9155fd95386d813481845bd01 + checksum: 67cbafc0dc8695222fd3b2db26c3fcd91148a1dba7bb5dcf71eaf6425dadbaa378c5703f2844e34718954aa283aa95919d8d4650bd1d0b85b22b404ffc3436fa languageName: node linkType: hard -"@graphql-codegen/visitor-plugin-common@npm:2.13.5": - version: 2.13.5 - resolution: "@graphql-codegen/visitor-plugin-common@npm:2.13.5" +"@graphql-codegen/visitor-plugin-common@npm:2.13.7": + version: 2.13.7 + resolution: "@graphql-codegen/visitor-plugin-common@npm:2.13.7" dependencies: - "@graphql-codegen/plugin-helpers": ^3.1.1 + "@graphql-codegen/plugin-helpers": ^3.1.2 "@graphql-tools/optimize": ^1.3.0 "@graphql-tools/relay-operation-optimizer": ^6.5.0 - "@graphql-tools/utils": ^8.8.0 + "@graphql-tools/utils": ^9.0.0 auto-bind: ~4.0.0 change-case-all: 1.0.15 dependency-graph: ^0.11.0 @@ -9353,7 +9429,7 @@ __metadata: tslib: ~2.4.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 130c82c63d647b5af55ce9e463765228e7aebc9c50a3670590c7bb409c997e8fabd10987d63f175a51ad3e3847d18c59ac3af6dc620d529b7e974dd80f15118e + checksum: 4218af8b1542789d9c8c614ccb4362a2b4944d5c3a4a59909844fe9f1f8672825adb28deeb1b9a4d45410e1ae94cde9bd1f5c5d888ae53469260d6668814732e languageName: node linkType: hard @@ -9385,6 +9461,20 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/batch-execute@npm:8.5.14": + version: 8.5.14 + resolution: "@graphql-tools/batch-execute@npm:8.5.14" + dependencies: + "@graphql-tools/utils": 9.1.3 + dataloader: 2.1.0 + tslib: ^2.4.0 + value-or-promise: 1.0.11 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: a48a11f471fe804852abb60f361eb8e398e5fd9d3b8bc61e3734983a5c8c284f3087b903b5277a2c7e365434947af534a881e67c147b0a3d47849617e124ac33 + languageName: node + linkType: hard + "@graphql-tools/code-file-loader@npm:^7.3.13": version: 7.3.13 resolution: "@graphql-tools/code-file-loader@npm:7.3.13" @@ -9416,6 +9506,88 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/delegate@npm:9.0.21": + version: 9.0.21 + resolution: "@graphql-tools/delegate@npm:9.0.21" + dependencies: + "@graphql-tools/batch-execute": 8.5.14 + "@graphql-tools/executor": 0.0.11 + "@graphql-tools/schema": 9.0.12 + "@graphql-tools/utils": 9.1.3 + dataloader: 2.1.0 + tslib: ~2.4.0 + value-or-promise: 1.0.11 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: fab07abfb06325d82382e6de45bbf2bc6501f18ebabbe50661772b58f512d6e713565be16bd7f99f71fcb00ffeed25bba871d4d459a705880803878e20c2a183 + languageName: node + linkType: hard + +"@graphql-tools/executor-graphql-ws@npm:0.0.5": + version: 0.0.5 + resolution: "@graphql-tools/executor-graphql-ws@npm:0.0.5" + dependencies: + "@graphql-tools/utils": 9.1.3 + "@repeaterjs/repeater": 3.0.4 + "@types/ws": ^8.0.0 + graphql-ws: 5.11.2 + isomorphic-ws: 5.0.0 + tslib: ^2.4.0 + ws: 8.11.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 79ced279e56b7508282859f805ca8fe1286eec3b53592893e35517f93e5204eca2db327258599749b0d832918d9d709962059087b4e6a894eacc16ceb0142273 + languageName: node + linkType: hard + +"@graphql-tools/executor-http@npm:0.0.7": + version: 0.0.7 + resolution: "@graphql-tools/executor-http@npm:0.0.7" + dependencies: + "@graphql-tools/utils": 9.1.3 + "@repeaterjs/repeater": 3.0.4 + "@whatwg-node/fetch": 0.5.3 + dset: 3.1.2 + extract-files: ^11.0.0 + meros: 1.2.1 + tslib: ^2.4.0 + value-or-promise: 1.0.11 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 05918ee65cb7d3e927e707acddb184ba2efbccf03656454ff8b172654aa41c4ad35bed487c0399ca085ba39ca434421cdaadb78dec4d7ebabbd25fe3c5cbb81c + languageName: node + linkType: hard + +"@graphql-tools/executor-legacy-ws@npm:0.0.5": + version: 0.0.5 + resolution: "@graphql-tools/executor-legacy-ws@npm:0.0.5" + dependencies: + "@graphql-tools/utils": 9.1.3 + "@types/ws": ^8.0.0 + isomorphic-ws: 5.0.0 + tslib: ^2.4.0 + ws: 8.11.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 2705e57ae81fbe3117d14900d50ab2459618d93192f795db97e2b98e9a772ebfe2308c17e72d92735123ec32fbedad014158d20fd1cc569fa287d47c90037a71 + languageName: node + linkType: hard + +"@graphql-tools/executor@npm:0.0.11": + version: 0.0.11 + resolution: "@graphql-tools/executor@npm:0.0.11" + dependencies: + "@graphql-tools/utils": 9.1.3 + "@graphql-typed-document-node/core": 3.1.1 + "@repeaterjs/repeater": 3.0.4 + tslib: ^2.4.0 + value-or-promise: 1.0.11 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 9f4c5d50eb574ab788a70684150502d4ad25b2681a3933a9415a0bbd78bfdf5ee203dca8bccc4cef93727157254216f0c22c5359bef1c1738f652b3122048b17 + languageName: node + linkType: hard + "@graphql-tools/git-loader@npm:^7.2.13": version: 7.2.13 resolution: "@graphql-tools/git-loader@npm:7.2.13" @@ -9543,7 +9715,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:8.3.14, @graphql-tools/merge@npm:^8.2.6": +"@graphql-tools/merge@npm:8.3.14": version: 8.3.14 resolution: "@graphql-tools/merge@npm:8.3.14" dependencies: @@ -9555,6 +9727,18 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/merge@npm:8.3.15, @graphql-tools/merge@npm:^8.2.6": + version: 8.3.15 + resolution: "@graphql-tools/merge@npm:8.3.15" + dependencies: + "@graphql-tools/utils": 9.1.4 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 7823d3b3a2bb7a661826eb8fce8a4fcb17439224818aa08ca814d7b25324b66b790cf8e7fa083dfa9f41b2213355fb1f0db88d1e7334788347a6d69c8f5555e9 + languageName: node + linkType: hard + "@graphql-tools/merge@npm:8.3.6": version: 8.3.6 resolution: "@graphql-tools/merge@npm:8.3.6" @@ -9592,32 +9776,32 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/prisma-loader@npm:^7.2.7": - version: 7.2.7 - resolution: "@graphql-tools/prisma-loader@npm:7.2.7" +"@graphql-tools/prisma-loader@npm:^7.2.49": + version: 7.2.49 + resolution: "@graphql-tools/prisma-loader@npm:7.2.49" dependencies: - "@graphql-tools/url-loader": 7.13.2 - "@graphql-tools/utils": 8.9.0 + "@graphql-tools/url-loader": 7.16.28 + "@graphql-tools/utils": 9.1.3 "@types/js-yaml": ^4.0.0 "@types/json-stable-stringify": ^1.0.32 "@types/jsonwebtoken": ^8.5.0 chalk: ^4.1.0 debug: ^4.3.1 dotenv: ^16.0.0 - graphql-request: ^4.0.0 + graphql-request: ^5.0.0 http-proxy-agent: ^5.0.0 https-proxy-agent: ^5.0.0 isomorphic-fetch: ^3.0.0 js-yaml: ^4.0.0 json-stable-stringify: ^1.0.1 - jsonwebtoken: ^8.5.1 + jsonwebtoken: ^9.0.0 lodash: ^4.17.20 scuid: ^1.1.0 tslib: ^2.4.0 yaml-ast-parser: ^0.0.43 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 986e33b1ec4044a26b31f8363ca0531d742e4ea67f9601ba150ec7ff6cc6fd1fb0d949057837ecf9fec6c3174a83689eb1fca6134462f368bc9d37546d4cde28 + checksum: 9a392346107ec5e468a8725c1d931b638e1899c25a80e34e9c888c050abf85dfde85faea9fdb19a8bfd9425bdb97949e14e759157d083aa91812fcff516ad82d languageName: node linkType: hard @@ -9662,6 +9846,20 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/schema@npm:9.0.12": + version: 9.0.12 + resolution: "@graphql-tools/schema@npm:9.0.12" + dependencies: + "@graphql-tools/merge": 8.3.14 + "@graphql-tools/utils": 9.1.3 + tslib: ^2.4.0 + value-or-promise: 1.0.11 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: c5ea750466181b425dd77822b1dc774227bcdb3a01631f114734d450cfc2dabeac60b3fac40e047090d6035b6a559b614716f1b61068889cf5aae0785650c31b + languageName: node + linkType: hard + "@graphql-tools/schema@npm:9.0.4": version: 9.0.4 resolution: "@graphql-tools/schema@npm:9.0.4" @@ -9677,45 +9875,43 @@ __metadata: linkType: hard "@graphql-tools/schema@npm:^9.0.0": - version: 9.0.12 - resolution: "@graphql-tools/schema@npm:9.0.12" + version: 9.0.13 + resolution: "@graphql-tools/schema@npm:9.0.13" dependencies: - "@graphql-tools/merge": 8.3.14 - "@graphql-tools/utils": 9.1.3 + "@graphql-tools/merge": 8.3.15 + "@graphql-tools/utils": 9.1.4 tslib: ^2.4.0 - value-or-promise: 1.0.11 + value-or-promise: 1.0.12 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: c5ea750466181b425dd77822b1dc774227bcdb3a01631f114734d450cfc2dabeac60b3fac40e047090d6035b6a559b614716f1b61068889cf5aae0785650c31b + checksum: fa5c5033c79e3ab210207c68bf80729448f0ae0bf071e029a218043d952dec8352b0d4ad467ca789a08e292d60c1ee111d266a2193bd50759c9eb82e8f9ad586 languageName: node linkType: hard -"@graphql-tools/url-loader@npm:7.13.2, @graphql-tools/url-loader@npm:^7.13.2, @graphql-tools/url-loader@npm:^7.9.7": - version: 7.13.2 - resolution: "@graphql-tools/url-loader@npm:7.13.2" +"@graphql-tools/url-loader@npm:7.16.28, @graphql-tools/url-loader@npm:^7.13.2, @graphql-tools/url-loader@npm:^7.9.7": + version: 7.16.28 + resolution: "@graphql-tools/url-loader@npm:7.16.28" dependencies: "@ardatan/sync-fetch": 0.0.1 - "@graphql-tools/delegate": 8.8.1 - "@graphql-tools/utils": 8.9.0 - "@graphql-tools/wrap": 8.5.1 - "@n1ru4l/graphql-live-query": ^0.9.0 + "@graphql-tools/delegate": 9.0.21 + "@graphql-tools/executor-graphql-ws": 0.0.5 + "@graphql-tools/executor-http": 0.0.7 + "@graphql-tools/executor-legacy-ws": 0.0.5 + "@graphql-tools/utils": 9.1.3 + "@graphql-tools/wrap": 9.2.23 "@types/ws": ^8.0.0 - "@whatwg-node/fetch": ^0.2.4 - dset: ^3.1.2 - extract-files: ^11.0.0 - graphql-ws: ^5.4.1 - isomorphic-ws: ^5.0.0 - meros: ^1.1.4 + "@whatwg-node/fetch": ^0.5.0 + isomorphic-ws: 5.0.0 tslib: ^2.4.0 value-or-promise: ^1.0.11 - ws: ^8.3.0 + ws: 8.11.0 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 21928a4a12ad07bed0c0729ec183277a1462da6b4a4fa8f083bf2fc7acb80137feb17f7fca283a58f2a8544f024bd5bcefc44c442f9cd58104656bb3f164c089 + checksum: fca2dada0d80c051358f928a321eda0cfa96bb71704b4feb7e61dfd7226f78fb1dd2e8268f4e81080a2984cf57ee92ef6c8608c89c6f931860a0cbdd63bcb031 languageName: node linkType: hard -"@graphql-tools/utils@npm:8.12.0, @graphql-tools/utils@npm:^8.6.5, @graphql-tools/utils@npm:^8.8.0, @graphql-tools/utils@npm:^8.9.0": +"@graphql-tools/utils@npm:8.12.0": version: 8.12.0 resolution: "@graphql-tools/utils@npm:8.12.0" dependencies: @@ -9770,7 +9966,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:9.1.3, @graphql-tools/utils@npm:^9.1.1": +"@graphql-tools/utils@npm:9.1.3": version: 9.1.3 resolution: "@graphql-tools/utils@npm:9.1.3" dependencies: @@ -9781,7 +9977,33 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/wrap@npm:8.5.1, @graphql-tools/wrap@npm:^8.3.1": +"@graphql-tools/utils@npm:9.1.4, @graphql-tools/utils@npm:^9.0.0, @graphql-tools/utils@npm:^9.1.1": + version: 9.1.4 + resolution: "@graphql-tools/utils@npm:9.1.4" + dependencies: + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 467135297a07b21bdd706ca03385354931db85fcf2accc514d69b7415c8cb0fb9e551e4bba0870278eab58bf4de757d354d53c88fd0f55b52d8562dbcba71869 + languageName: node + linkType: hard + +"@graphql-tools/wrap@npm:9.2.23": + version: 9.2.23 + resolution: "@graphql-tools/wrap@npm:9.2.23" + dependencies: + "@graphql-tools/delegate": 9.0.21 + "@graphql-tools/schema": 9.0.12 + "@graphql-tools/utils": 9.1.3 + tslib: ^2.4.0 + value-or-promise: 1.0.11 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 8f4f289d51adb92a7099940892c52b710e61f76d02580a3223e80aaed790d32f769cae33a4afeff398357f33a55267427d9703de6f0bd30ec9ba57ee3bd5ef5c + languageName: node + linkType: hard + +"@graphql-tools/wrap@npm:^8.3.1": version: 8.5.1 resolution: "@graphql-tools/wrap@npm:8.5.1" dependencies: @@ -9796,7 +10018,7 @@ __metadata: languageName: node linkType: hard -"@graphql-typed-document-node/core@npm:^3.1.0": +"@graphql-typed-document-node/core@npm:3.1.1, @graphql-typed-document-node/core@npm:^3.1.0, @graphql-typed-document-node/core@npm:^3.1.1": version: 3.1.1 resolution: "@graphql-typed-document-node/core@npm:3.1.1" peerDependencies: @@ -9846,14 +10068,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.6": - version: 0.11.7 - resolution: "@humanwhocodes/config-array@npm:0.11.7" +"@humanwhocodes/config-array@npm:^0.11.8": + version: 0.11.8 + resolution: "@humanwhocodes/config-array@npm:0.11.8" dependencies: "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 minimatch: ^3.0.5 - checksum: cf506dc45d9488af7fbf108ea6ac2151ba1a25e6d2b94b9b4fc36d2c1e4099b89ff560296dbfa13947e44604d4ca4a90d97a4fb167370bf8dd01a6ca2b6d83ac + checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 languageName: node linkType: hard @@ -9871,13 +10093,6 @@ __metadata: languageName: node linkType: hard -"@iarna/toml@npm:^2.2.5": - version: 2.2.5 - resolution: "@iarna/toml@npm:2.2.5" - checksum: b63b2b2c4fd67969a6291543ada0303d45593801ee744b60f5390f183c03d9192bc67a217abb24be945158f1935f02840d9ffff40c0142aa171b5d3b6b6a3ea5 - languageName: node - linkType: hard - "@improbable-eng/grpc-web@npm:^0.14.0": version: 0.14.1 resolution: "@improbable-eng/grpc-web@npm:0.14.1" @@ -11211,53 +11426,53 @@ __metadata: languageName: node linkType: hard -"@microsoft/api-documenter@npm:^7.17.11": - version: 7.17.11 - resolution: "@microsoft/api-documenter@npm:7.17.11" +"@microsoft/api-documenter@npm:^7.19.27": + version: 7.19.27 + resolution: "@microsoft/api-documenter@npm:7.19.27" dependencies: - "@microsoft/api-extractor-model": 7.17.2 - "@microsoft/tsdoc": 0.14.1 - "@rushstack/node-core-library": 3.45.4 - "@rushstack/ts-command-line": 4.10.10 + "@microsoft/api-extractor-model": 7.25.3 + "@microsoft/tsdoc": 0.14.2 + "@rushstack/node-core-library": 3.53.3 + "@rushstack/ts-command-line": 4.13.1 colors: ~1.2.1 js-yaml: ~3.13.1 - resolve: ~1.17.0 + resolve: ~1.22.1 bin: api-documenter: bin/api-documenter - checksum: 55f5c5d15dc8d97fc0582dc501e84f4ef9b9cbff71e9bf662d6262751ed38e691907f34ab4d57785cf2f03acf82c4957def804f77d1c85383ff2a80da51c7a60 + checksum: f243f473e1fe58e1cd6e32aad223724b6b621f569276415380abc4845859bf5c23fbe0e370be2a218f362a6c85b01b44b5427336f55800f2ea8bf3f398b0ee41 languageName: node linkType: hard -"@microsoft/api-extractor-model@npm:7.17.2, @microsoft/api-extractor-model@npm:^7.17.2": - version: 7.17.2 - resolution: "@microsoft/api-extractor-model@npm:7.17.2" +"@microsoft/api-extractor-model@npm:7.25.3": + version: 7.25.3 + resolution: "@microsoft/api-extractor-model@npm:7.25.3" dependencies: - "@microsoft/tsdoc": 0.14.1 + "@microsoft/tsdoc": 0.14.2 "@microsoft/tsdoc-config": ~0.16.1 - "@rushstack/node-core-library": 3.45.4 - checksum: 94c1c63674d85bf69cff9abbf94a1b2d2f5b6e3b651b8483d8949e39424cb29df156b589a297ca19f85ad1ff6380389e58a03198e7fe1ec34b59d5cae2166de7 + "@rushstack/node-core-library": 3.53.3 + checksum: 532ca30606b5649e90035ef70ff46868f6ccc63181e10b783bc5092e580bcb133112b300799b8f71a19da2b79f685a55f7ddbe84c8fe7ad93d71359c1763c521 languageName: node linkType: hard -"@microsoft/api-extractor@npm:^7.23.0": - version: 7.23.0 - resolution: "@microsoft/api-extractor@npm:7.23.0" +"@microsoft/api-extractor@npm:^7.33.7": + version: 7.33.7 + resolution: "@microsoft/api-extractor@npm:7.33.7" dependencies: - "@microsoft/api-extractor-model": 7.17.2 - "@microsoft/tsdoc": 0.14.1 + "@microsoft/api-extractor-model": 7.25.3 + "@microsoft/tsdoc": 0.14.2 "@microsoft/tsdoc-config": ~0.16.1 - "@rushstack/node-core-library": 3.45.4 - "@rushstack/rig-package": 0.3.11 - "@rushstack/ts-command-line": 4.10.10 + "@rushstack/node-core-library": 3.53.3 + "@rushstack/rig-package": 0.3.17 + "@rushstack/ts-command-line": 4.13.1 colors: ~1.2.1 lodash: ~4.17.15 resolve: ~1.17.0 semver: ~7.3.0 source-map: ~0.6.1 - typescript: ~4.6.3 + typescript: ~4.8.4 bin: api-extractor: bin/api-extractor - checksum: 61d3609d7aa76bece292551eb9c7a1c04c2fa304962c8b7e97aa3b3add0431a225c022e32993e384a51290e121542c6a6b3ad4be24f5315a4c1501cf821018a2 + checksum: 3f9034ca8e7bc7a6622cb8ac1f53f7f265ebca529e17f4abb2bef0ca297011cfa0927c0703a819607d974ca79b8f5307371491cfb192788e723cfd316250f9a6 languageName: node linkType: hard @@ -11268,22 +11483,22 @@ __metadata: languageName: node linkType: hard -"@microsoft/tsdoc-config@npm:0.16.1, @microsoft/tsdoc-config@npm:~0.16.1": - version: 0.16.1 - resolution: "@microsoft/tsdoc-config@npm:0.16.1" +"@microsoft/tsdoc-config@npm:~0.16.1": + version: 0.16.2 + resolution: "@microsoft/tsdoc-config@npm:0.16.2" dependencies: - "@microsoft/tsdoc": 0.14.1 + "@microsoft/tsdoc": 0.14.2 ajv: ~6.12.6 jju: ~1.4.0 resolve: ~1.19.0 - checksum: 2b2121803caf6584fe0264ad16f8fa10de68438c0b82bd25f918606052af5312050f38b6abd4bcf3d40f120713aab144762a7a280fa22dd12e5571cd08e348e1 + checksum: 12b0d703154076bcaac75ca42e804e4fc292672396441e54346d7eadd0d6b57f90980eda2b1bab89b224af86da34a2389f9054002e282011e795ca5919a4386f languageName: node linkType: hard -"@microsoft/tsdoc@npm:0.14.1": - version: 0.14.1 - resolution: "@microsoft/tsdoc@npm:0.14.1" - checksum: e4ad038ccff2cd96e0d53ee42e2136f0f5a925b16cfda14261f1c2eb55ba0088a0e3b08ff819b476ddc69b2242a391925fab7f6ae2afabb19b96f87e19c114fc +"@microsoft/tsdoc@npm:0.14.2": + version: 0.14.2 + resolution: "@microsoft/tsdoc@npm:0.14.2" + checksum: b167c89e916ba73ee20b9c9d5dba6aa3a0de25ed3d50050e8a344dca7cd43cb2e1059bd515c820369b6e708901dd3fda476a42bc643ca74a35671ce77f724a3a languageName: node linkType: hard @@ -11327,15 +11542,6 @@ __metadata: languageName: node linkType: hard -"@n1ru4l/graphql-live-query@npm:^0.9.0": - version: 0.9.0 - resolution: "@n1ru4l/graphql-live-query@npm:0.9.0" - peerDependencies: - graphql: ^15.4.0 || ^16.0.0 - checksum: 746c7a2b23440a2daee5737aece454c756bf9f3e77decd53feed921f88907743301b569209d124afde63271b3f9db59a1fb997c0c280205662a7622992057e4a - languageName: node - linkType: hard - "@n1ru4l/push-pull-async-iterable-iterator@npm:^3.1.0": version: 3.1.0 resolution: "@n1ru4l/push-pull-async-iterable-iterator@npm:3.1.0" @@ -11631,8 +11837,8 @@ __metadata: linkType: hard "@octokit/auth-app@npm:^4.0.0": - version: 4.0.7 - resolution: "@octokit/auth-app@npm:4.0.7" + version: 4.0.8 + resolution: "@octokit/auth-app@npm:4.0.8" dependencies: "@octokit/auth-oauth-app": ^5.0.0 "@octokit/auth-oauth-user": ^2.0.0 @@ -11642,9 +11848,9 @@ __metadata: "@types/lru-cache": ^5.1.0 deprecation: ^2.3.1 lru-cache: ^6.0.0 - universal-github-app-jwt: ^1.0.1 + universal-github-app-jwt: ^1.1.1 universal-user-agent: ^6.0.0 - checksum: 880de7341f47c5a48822612f50ae453fb0990a188b29afdb2f80a1f7e703c88e068d05a4edc1aa9a8204c730b6f70cf2772fbd5da032fee4986a5266ebdda4c7 + checksum: 819c048db51ee041697bb4cbba5fc39fbc0849e76cda63dd34ff9e77d60be62c5f93c478a9c1edf6643a88afaefc7aefe562e86b73f6ef6874df1bc797b9b617 languageName: node linkType: hard @@ -11743,18 +11949,18 @@ __metadata: languageName: node linkType: hard -"@octokit/core@npm:^4.0.0, @octokit/core@npm:^4.0.4": - version: 4.0.5 - resolution: "@octokit/core@npm:4.0.5" +"@octokit/core@npm:^4.0.0, @octokit/core@npm:^4.0.4, @octokit/core@npm:^4.1.0": + version: 4.1.0 + resolution: "@octokit/core@npm:4.1.0" dependencies: "@octokit/auth-token": ^3.0.0 "@octokit/graphql": ^5.0.0 "@octokit/request": ^6.0.0 "@octokit/request-error": ^3.0.0 - "@octokit/types": ^7.0.0 + "@octokit/types": ^8.0.0 before-after-hook: ^2.2.0 universal-user-agent: ^6.0.0 - checksum: 6e4a2161d22b9cb24cd1cf702e6d18200fc48a29dc66db08c37809d65243d29429123652072126d9f161e45aef6a57e72a5d56d7e975829c190e8c3c46b3f1b9 + checksum: 4e53e02ff3ebe808b74385be0055cc1cce4b548060b20e3f2d5dd1bf7877ff7b6556f11278edc070842bf24aa869f9f59a02638f1b14083eb290b9e297447a2d languageName: node linkType: hard @@ -11917,6 +12123,17 @@ __metadata: languageName: node linkType: hard +"@octokit/plugin-paginate-rest@npm:^5.0.0": + version: 5.0.1 + resolution: "@octokit/plugin-paginate-rest@npm:5.0.1" + dependencies: + "@octokit/types": ^8.0.0 + peerDependencies: + "@octokit/core": ">=4" + checksum: cfded297d9f66c7607bd34075eb0c5f7278a1617d6be86115997c0757151c9be2fcf7a8849c2a5cebab56931a263b5cc35742b6227935afe77f5ed61b0627a3d + languageName: node + linkType: hard + "@octokit/plugin-request-log@npm:^1.0.2, @octokit/plugin-request-log@npm:^1.0.4": version: 1.0.4 resolution: "@octokit/plugin-request-log@npm:1.0.4" @@ -11938,15 +12155,15 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-rest-endpoint-methods@npm:^6.0.0": - version: 6.3.0 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:6.3.0" +"@octokit/plugin-rest-endpoint-methods@npm:^6.0.0, @octokit/plugin-rest-endpoint-methods@npm:^6.7.0": + version: 6.7.0 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:6.7.0" dependencies: - "@octokit/types": ^7.0.0 + "@octokit/types": ^8.0.0 deprecation: ^2.3.1 peerDependencies: "@octokit/core": ">=3" - checksum: 8fefbdcfc16fe39aa216c440cf52c2861f6c0c905f1fdfbd0e720fb59815c079100b877535bcd428cb782ef31a8d508470d69d4ecf307b8af4ccc34a5669c050 + checksum: 513c6c0717d08f3e85848029bd700412b7d9787750f78cc79a3dede356e94b238bf8a518b108f556a7efe626871720dd0466de9f31091578ea4e0f5a016f0ae7 languageName: node linkType: hard @@ -12035,14 +12252,14 @@ __metadata: linkType: hard "@octokit/rest@npm:^19.0.3": - version: 19.0.4 - resolution: "@octokit/rest@npm:19.0.4" + version: 19.0.5 + resolution: "@octokit/rest@npm:19.0.5" dependencies: - "@octokit/core": ^4.0.0 - "@octokit/plugin-paginate-rest": ^4.0.0 + "@octokit/core": ^4.1.0 + "@octokit/plugin-paginate-rest": ^5.0.0 "@octokit/plugin-request-log": ^1.0.4 - "@octokit/plugin-rest-endpoint-methods": ^6.0.0 - checksum: 7eba9148b707c713705ba8d75c25fbb22488f30abef7967ce92884a51e411e709b90ff56b0e6fa5521b261f343a7fd33b8ad5d0b87cab4bc2e178002b2566cf2 + "@octokit/plugin-rest-endpoint-methods": ^6.7.0 + checksum: ed4c36859aafb64e23f7f708086fe7e2ecda17ffd8c1594817d539f766f5855af79f17f5d225d96d34cd9b97cbfea988dac3df39a7cc928b2d2b7b75ed981056 languageName: node linkType: hard @@ -12083,9 +12300,9 @@ __metadata: linkType: hard "@octokit/webhooks-methods@npm:^3.0.0": - version: 3.0.1 - resolution: "@octokit/webhooks-methods@npm:3.0.1" - checksum: a65344315175459fcc43d1e8ea20f73aa73f0c47a692e0b02d45dfb8fda7075cf5503ff33654a9b6683d32d7e5737965f1ff40618d21a7c637180ae73bf888a4 + version: 3.0.2 + resolution: "@octokit/webhooks-methods@npm:3.0.2" + checksum: 4608d6a394bd94846301b709f44adc2bde0f43517840c49d235e3cb355986e2e9736d60b4a39c3492b31c06d10401f32cab878ec83e83b890606f58619cad5ef languageName: node linkType: hard @@ -12097,14 +12314,14 @@ __metadata: linkType: hard "@octokit/webhooks@npm:^10.0.0": - version: 10.4.0 - resolution: "@octokit/webhooks@npm:10.4.0" + version: 10.5.1 + resolution: "@octokit/webhooks@npm:10.5.1" dependencies: "@octokit/request-error": ^3.0.0 "@octokit/webhooks-methods": ^3.0.0 "@octokit/webhooks-types": 6.7.0 aggregate-error: ^3.1.0 - checksum: 418de82c4840024d608bb523ffc6c98f07179a40096a9970d9ac2e09bc98e99a25c035d57038c992b3c764ae085a62befbc0165ebacda8963aa513aa72330f74 + checksum: af8e4712fb1cbbda6ec5627586f9a7a5ee0c3bb6dc3af1875c42cdf3a1b10e959f9c05a5249722d9aac2ffefe8d572b03a77975f7cd9eacea114e01ebddb959a languageName: node linkType: hard @@ -12170,19 +12387,19 @@ __metadata: languageName: node linkType: hard -"@oriflame/backstage-plugin-score-card@npm:^0.5.1": - version: 0.5.7 - resolution: "@oriflame/backstage-plugin-score-card@npm:0.5.7" +"@oriflame/backstage-plugin-score-card@npm:^0.6.0": + version: 0.6.1 + resolution: "@oriflame/backstage-plugin-score-card@npm:0.6.1" dependencies: - "@backstage/catalog-model": ^1.1.2 - "@backstage/config": ^1.0.3 - "@backstage/core-components": ^0.11.2 - "@backstage/core-plugin-api": ^1.0.7 - "@backstage/plugin-catalog-common": ^1.0.7 - "@backstage/plugin-catalog-react": ^1.2.0 + "@backstage/catalog-model": ^1.1.3 + "@backstage/config": ^1.0.4 + "@backstage/core-components": ^0.12.0 + "@backstage/core-plugin-api": ^1.1.0 + "@backstage/plugin-catalog-common": ^1.0.8 + "@backstage/plugin-catalog-react": ^1.2.1 "@backstage/theme": ^0.2.16 - "@backstage/types": ^1.0.0 - "@backstage/version-bridge": ^1.0.1 + "@backstage/types": ^1.0.1 + "@backstage/version-bridge": ^1.0.2 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.11.2 "@material-ui/lab": ^4.0.0-alpha.57 @@ -12190,7 +12407,7 @@ __metadata: peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 - checksum: 9a3e933dfd212ba8b1a786d13bca9859b23d7ab333745afbe358f8ca084f09a92e724326c5d0d00ed320e01f73fbbb265625c8c9af872aaadc01c945e56e0863 + checksum: 745e90ece212759f8d3c018b2ebe282e38529c11b13f1b8446ebc548b3a1c2a4a5d1219b8476f79e93ad0e9a919f6efcd372a27f1c3bab61e8e3165921abe8f0 languageName: node linkType: hard @@ -12339,34 +12556,18 @@ __metadata: languageName: node linkType: hard -"@react-hookz/deep-equal@npm:^1.0.3": - version: 1.0.3 - resolution: "@react-hookz/deep-equal@npm:1.0.3" - checksum: d482b43746a0371094b90e1957d3e3a6aa70cbe8bd9cd88c759d8dcf21c2c1f57fbd1846b2103bccc20600e77d04d44e35c320ba9001fb5382c70a9a3385d34a - languageName: node - linkType: hard - -"@react-hookz/web@npm:^15.0.0": - version: 15.1.0 - resolution: "@react-hookz/web@npm:15.1.0" - dependencies: - "@react-hookz/deep-equal": ^1.0.3 - peerDependencies: - js-cookie: ^3.0.1 - react: ^16.8 || ^17 || ^18 - react-dom: ^16.8 || ^17 || ^18 - peerDependenciesMeta: - js-cookie: - optional: true - checksum: 74854629a0e86d3035f8fec97a618c79c6d8ae5a71513e6a29b717c5142109e2ec33eea835b9250686d27e9fdb66e7ccf72c7e89edf9300596fac450821130cc +"@react-hookz/deep-equal@npm:^1.0.4": + version: 1.0.4 + resolution: "@react-hookz/deep-equal@npm:1.0.4" + checksum: 0923e364d309e32ee54e0850471a86488faf149d7a04ee838552cf5d54f493964623a8d742880ec82410cc1105530123f056e66dfc72b7da235d4cc93fad708f languageName: node linkType: hard "@react-hookz/web@npm:^20.0.0": - version: 20.0.2 - resolution: "@react-hookz/web@npm:20.0.2" + version: 20.1.0 + resolution: "@react-hookz/web@npm:20.1.0" dependencies: - "@react-hookz/deep-equal": ^1.0.3 + "@react-hookz/deep-equal": ^1.0.4 peerDependencies: js-cookie: ^3.0.1 react: ^16.8 || ^17 || ^18 @@ -12374,20 +12575,27 @@ __metadata: peerDependenciesMeta: js-cookie: optional: true - checksum: 38e9f660d247cd434d1de428f9ae49baf243f65187af3ebe2d4cd8ac1ecd660e37c64cec916dc9e9d4b7d609071b4c31d486ace3193e506fda64b11db96c5321 + checksum: bb393f892c2c81deff37d5f18faf8ec17431a24994d72d88ec390dcc1579b27318a7c8c6260070c87b66e8c635e4daec4436c33abf2622f842d1567235ed457d languageName: node linkType: hard -"@remix-run/router@npm:1.0.5": - version: 1.0.5 - resolution: "@remix-run/router@npm:1.0.5" - checksum: 5d66750b7defc10c80d9748fa003fcfe2af9ef82de3c06be88c926ede36a15b9e971ed2222981db843494e2f77c3de14470efe6dc877530cea774dc31162ec6f +"@remix-run/router@npm:1.2.1": + version: 1.2.1 + resolution: "@remix-run/router@npm:1.2.1" + checksum: 71c947f83e130bf006226332aca395f626ad599b6d35dfe936f6a8f139cf37278bc1b36bce38c30f6062724402358296329f31c385b11ae59b13b76a2716d701 languageName: node linkType: hard -"@rjsf/core-v5@npm:@rjsf/core@^5.0.0-beta.14": - version: 5.0.0-beta.14 - resolution: "@rjsf/core@npm:5.0.0-beta.14" +"@repeaterjs/repeater@npm:3.0.4": + version: 3.0.4 + resolution: "@repeaterjs/repeater@npm:3.0.4" + checksum: cca0db3e802bc26fcce0b4a574074d9956da53bf43094de03c0e4732d05e13441279a92f0b96e2a7a39da50933684947a138c1213406eaafe39cfd4683d6c0df + languageName: node + linkType: hard + +"@rjsf/core-v5@npm:@rjsf/core@5.0.0-beta.16": + version: 5.0.0-beta.16 + resolution: "@rjsf/core@npm:5.0.0-beta.16" dependencies: lodash: ^4.17.15 lodash-es: ^4.17.15 @@ -12396,7 +12604,7 @@ __metadata: peerDependencies: "@rjsf/utils": ^5.0.0-beta.1 react: ^16.14.0 || >=17 - checksum: 2e1a1ba4b4385401868628a127da72439a617abc72952c64e07dd1134f2252dcc13a4ec57876cb3bc44ab519e1d3c05eccfd3764eb76178526ebea051179a6ba + checksum: 38b0e02cfc394958d714f1c2b29262e95c5da01fbfffd657db7af8546ae5b00d1900fd0484be07be13d354dd1e48833cabcdcdaa8e9ffa0dfba63fba7e9556c3 languageName: node linkType: hard @@ -12419,16 +12627,16 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@^5.0.0-beta.14": - version: 5.0.0-beta.14 - resolution: "@rjsf/material-ui@npm:5.0.0-beta.14" +"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.0.0-beta.16": + version: 5.0.0-beta.16 + resolution: "@rjsf/material-ui@npm:5.0.0-beta.16" peerDependencies: "@material-ui/core": ^4.12.3 "@material-ui/icons": ^4.11.2 "@rjsf/core": ^5.0.0-beta.1 "@rjsf/utils": ^5.0.0-beta.1 react: ^16.14.0 || >=17 - checksum: 5abc14a274b97a29288abd489f80f9b3fca53e4429ff96f6c03368dfe625d34b3f66ec2e446a84a8a1874d9dc81cb62ef5a706fc1b200bbe1632c612960a9dc6 + checksum: b8252dd7edd07435c065393cf4a86f7a8db0224646f71206561f9d300fb8d39a658282b5181f1b0100b069f775620953c03f89818fecdf34c52076e39108b93f languageName: node linkType: hard @@ -12444,9 +12652,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:^5.0.0-beta.14": - version: 5.0.0-beta.14 - resolution: "@rjsf/utils@npm:5.0.0-beta.14" +"@rjsf/utils@npm:5.0.0-beta.16": + version: 5.0.0-beta.16 + resolution: "@rjsf/utils@npm:5.0.0-beta.16" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -12455,31 +12663,31 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 66d29377c98f6e778ec0b167734a949528b0ca2bfb4776dea74fd70add1fb339e14ec878b9162a152e83804bc8094c3ebcd9ebf8b1b68a63c6ee2bf4548938c8 + checksum: 7a0f04f20b1b12eff33322bef322ee96e222fc621142fb34906cb18386a2a0dd97224fd97851899644994a1adaab33c6f107076f344b66108219fcb809132703 languageName: node linkType: hard -"@rjsf/validator-ajv6@npm:^5.0.0-beta.14": - version: 5.0.0-beta.14 - resolution: "@rjsf/validator-ajv6@npm:5.0.0-beta.14" +"@rjsf/validator-ajv6@npm:5.0.0-beta.16": + version: 5.0.0-beta.16 + resolution: "@rjsf/validator-ajv6@npm:5.0.0-beta.16" dependencies: ajv: ^6.7.0 lodash: ^4.17.15 lodash-es: ^4.17.15 peerDependencies: "@rjsf/utils": ^5.0.0-beta.1 - checksum: 57b5c6968475a66762f644f2832aad077f8dde0ca9e71c8b0b27c06174855b7e6330f44fa6078fc0f347b728a4a5fd62399378fad26ada3cde32da89bddf6f9f + checksum: c4296e37608907c904424c46c884a15991101229e708caaa43e2e3c7d7e44a7e88ba206a902f80853f9a7f4c78d129fe47452ee5265cfd845b916051e99cd70d languageName: node linkType: hard "@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": - version: 2.1.1 - resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.1" + version: 2.1.2 + resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.2" dependencies: - "@backstage/catalog-model": ^1.1.3 - "@backstage/core-components": ^0.12.0 - "@backstage/core-plugin-api": ^1.1.0 - "@backstage/plugin-catalog-react": ^1.2.1 + "@backstage/catalog-model": ^1.1.4 + "@backstage/core-components": ^0.12.2 + "@backstage/core-plugin-api": ^1.2.0 + "@backstage/plugin-catalog-react": ^1.2.3 "@backstage/theme": ^0.2.16 "@material-ui/core": ^4.12.1 "@material-ui/icons": ^4.11.2 @@ -12492,19 +12700,19 @@ __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: 04121a556d6745cef4db0f2bc60218e0774056f26c09c195e4cf7ba29d8c7a601c24d13c8e077c904df312a1f6464942467c29be796b49156774af4029b7ec7b + checksum: fc607c7eac3a680db9ecc4c33bc65e84cdff432dc1079343f6e1ce66459324eba31a16a647b669c163e87c8b1794a01e66b4ba4f9fd77611d3081a0317cf68ac languageName: node linkType: hard "@roadiehq/backstage-plugin-github-insights@npm:^2.0.5": - version: 2.2.2 - resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.2.2" + version: 2.3.2 + resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.2" dependencies: - "@backstage/catalog-model": ^1.1.3 - "@backstage/core-components": ^0.12.0 - "@backstage/core-plugin-api": ^1.1.0 - "@backstage/integration-react": ^1.1.6 - "@backstage/plugin-catalog-react": ^1.2.1 + "@backstage/catalog-model": ^1.1.4 + "@backstage/core-components": ^0.12.2 + "@backstage/core-plugin-api": ^1.2.0 + "@backstage/integration-react": ^1.1.8 + "@backstage/plugin-catalog-react": ^1.2.3 "@backstage/theme": ^0.2.16 "@date-io/core": 2.10.7 "@material-ui/core": ^4.11.0 @@ -12520,19 +12728,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: 866d0ec0cb169855c6206e075bea16122450c9be533f4937e3c7f9869d9dc32cf9a770b42b1468078c37484cc3745dc785dcf39431c5a66d6f54573994f20a34 + checksum: 9c38cb944a9f37c3a0836dd4d5b41bc8329f124a026ce5f0c5ea467477ae87e6f699669c1c0873a9d29d791f6f870279bc7e83bc426111f540f8f6f54aad6f8a languageName: node linkType: hard "@roadiehq/backstage-plugin-github-pull-requests@npm:^2.2.7": - version: 2.4.1 - resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.4.1" + version: 2.4.2 + resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.4.2" dependencies: - "@backstage/catalog-model": ^1.1.3 - "@backstage/core-components": ^0.12.0 - "@backstage/core-plugin-api": ^1.1.0 - "@backstage/plugin-catalog-react": ^1.2.1 - "@backstage/plugin-home": ^0.4.27 + "@backstage/catalog-model": ^1.1.4 + "@backstage/core-components": ^0.12.2 + "@backstage/core-plugin-api": ^1.2.0 + "@backstage/plugin-catalog-react": ^1.2.3 + "@backstage/plugin-home": ^0.4.29 "@material-ui/core": ^4.11.0 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.60 @@ -12549,18 +12757,18 @@ __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: 41fa25e70fbe01bd26ea97cfd98fcff6c32771f437a28a3ed37078906290daf5d52ec0f0613caa559a09b6f8cacb923c0b6522d78de488909911f46433e189ee + checksum: d2b80b4c25a0bdca2e6dcd8ddf2fc26aa75374d5278fc235551fb213f3c0269e81cb141afd98c3a2a3073c39cfe35db69b1c265a615dd880777ab2e6c6a69d22 languageName: node linkType: hard "@roadiehq/backstage-plugin-travis-ci@npm:^2.0.5": - version: 2.1.1 - resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.1" + version: 2.1.2 + resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.2" dependencies: - "@backstage/catalog-model": ^1.1.3 - "@backstage/core-components": ^0.12.0 - "@backstage/core-plugin-api": ^1.1.0 - "@backstage/plugin-catalog-react": ^1.2.1 + "@backstage/catalog-model": ^1.1.4 + "@backstage/core-components": ^0.12.2 + "@backstage/core-plugin-api": ^1.2.0 + "@backstage/plugin-catalog-react": ^1.2.3 "@backstage/theme": ^0.2.16 "@material-ui/core": ^4.11.3 "@material-ui/icons": ^4.11.2 @@ -12575,7 +12783,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: 23cb8760c6d140052fcdc22007b59349332afd565ee2b65e8bba4a1b5c5d409ef6505f292d1e5c62d3c281898b65eb83397aa790480e9e1becda3452ef6d086c + checksum: 64e2878fd517e63eb765a65c60f1276cc6a12e4abb128001ed92a1e634546c0ec9236cbb67c6b534ece126fe64b5fb251e985fe3e5f42ce4500b6108b9f7f889 languageName: node linkType: hard @@ -12683,9 +12891,9 @@ __metadata: languageName: node linkType: hard -"@rushstack/node-core-library@npm:3.45.4": - version: 3.45.4 - resolution: "@rushstack/node-core-library@npm:3.45.4" +"@rushstack/node-core-library@npm:3.53.3": + version: 3.53.3 + resolution: "@rushstack/node-core-library@npm:3.53.3" dependencies: "@types/node": 12.20.24 colors: ~1.2.1 @@ -12694,31 +12902,30 @@ __metadata: jju: ~1.4.0 resolve: ~1.17.0 semver: ~7.3.0 - timsort: ~0.3.0 z-schema: ~5.0.2 - checksum: f7049be8c145ef1d1ee2ee29b917440a3c88a5e4906c5b6bebe0d4c7854c93b759b7563475be383a4cedf8afd3914b34a6b988fe67b8dfce33545223b2a46cca + checksum: 265d18e176079b8e90cd507e5d4d45f3afb1f811efdf491ea26f25f0397b77c0e9d42065166bf79a04503426c844ea92034cd3f8d5961b2a116de82e45cf6d6a languageName: node linkType: hard -"@rushstack/rig-package@npm:0.3.11": - version: 0.3.11 - resolution: "@rushstack/rig-package@npm:0.3.11" +"@rushstack/rig-package@npm:0.3.17": + version: 0.3.17 + resolution: "@rushstack/rig-package@npm:0.3.17" dependencies: resolve: ~1.17.0 strip-json-comments: ~3.1.1 - checksum: a6354152a9ac7503a217e7903d2739d35f305b2331f880fca94e6f309ba78e86b58fa8eda888238429bc4203a5cef4df4218f80e636fa75290e68875b971697a + checksum: 54eeea471c85b547575d7efc84fad3c9588f10106e2bfd8cd022bccb02c2fb0bf8ff597fab9114450b3c262abab0f0a4e52dd074bfd120e850b95037cd7b3102 languageName: node linkType: hard -"@rushstack/ts-command-line@npm:4.10.10": - version: 4.10.10 - resolution: "@rushstack/ts-command-line@npm:4.10.10" +"@rushstack/ts-command-line@npm:4.13.1": + version: 4.13.1 + resolution: "@rushstack/ts-command-line@npm:4.13.1" dependencies: "@types/argparse": 1.0.38 argparse: ~1.0.9 colors: ~1.2.1 string-argv: ~0.3.1 - checksum: e2d47cbe6df4c47e297ef84b83f1f6f2306ae14cd765066ea966f3e6ed48e1382d20c942a324ff9e389f5e673a9e1ba477f5b9514303709fcf85f28e14cdd26c + checksum: fea24b2549ecb7d3409b6b485d7c58bf8af8f8d1dd19c43a6b3532c45579ffc546bc4533b5db29c91ae1716581fdee4cb725f6a81ecb300e902ef06600e59f1d languageName: node linkType: hard @@ -12787,7 +12994,7 @@ __metadata: languageName: node linkType: hard -"@sinonjs/commons@npm:^1.6.0, @sinonjs/commons@npm:^1.7.0, @sinonjs/commons@npm:^1.8.3": +"@sinonjs/commons@npm:^1.7.0": version: 1.8.3 resolution: "@sinonjs/commons@npm:1.8.3" dependencies: @@ -12823,17 +13030,6 @@ __metadata: languageName: node linkType: hard -"@sinonjs/samsam@npm:^6.1.1": - version: 6.1.1 - resolution: "@sinonjs/samsam@npm:6.1.1" - dependencies: - "@sinonjs/commons": ^1.6.0 - lodash.get: ^4.4.2 - type-detect: ^4.0.8 - checksum: a09b0914bf573f0da82bd03c64ba413df81a7c173818dc3f0a90c2652240ac835ef583f4d52f0b215e626633c91a4095c255e0669f6ead97241319f34f05e7fc - languageName: node - linkType: hard - "@sinonjs/samsam@npm:^7.0.1": version: 7.0.1 resolution: "@sinonjs/samsam@npm:7.0.1" @@ -13087,90 +13283,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-darwin-arm64@npm:1.3.23" +"@swc/core-darwin-arm64@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-darwin-arm64@npm:1.3.26" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-darwin-x64@npm:1.3.23" +"@swc/core-darwin-x64@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-darwin-x64@npm:1.3.26" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.23" +"@swc/core-linux-arm-gnueabihf@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.26" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.23" +"@swc/core-linux-arm64-gnu@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.26" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.23" +"@swc/core-linux-arm64-musl@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.26" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.23" +"@swc/core-linux-x64-gnu@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.26" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-linux-x64-musl@npm:1.3.23" +"@swc/core-linux-x64-musl@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-linux-x64-musl@npm:1.3.26" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.23" +"@swc/core-win32-arm64-msvc@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.26" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.23" +"@swc/core-win32-ia32-msvc@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.26" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.23": - version: 1.3.23 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.23" +"@swc/core-win32-x64-msvc@npm:1.3.26": + version: 1.3.26 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.26" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.23 - resolution: "@swc/core@npm:1.3.23" + version: 1.3.26 + resolution: "@swc/core@npm:1.3.26" dependencies: - "@swc/core-darwin-arm64": 1.3.23 - "@swc/core-darwin-x64": 1.3.23 - "@swc/core-linux-arm-gnueabihf": 1.3.23 - "@swc/core-linux-arm64-gnu": 1.3.23 - "@swc/core-linux-arm64-musl": 1.3.23 - "@swc/core-linux-x64-gnu": 1.3.23 - "@swc/core-linux-x64-musl": 1.3.23 - "@swc/core-win32-arm64-msvc": 1.3.23 - "@swc/core-win32-ia32-msvc": 1.3.23 - "@swc/core-win32-x64-msvc": 1.3.23 + "@swc/core-darwin-arm64": 1.3.26 + "@swc/core-darwin-x64": 1.3.26 + "@swc/core-linux-arm-gnueabihf": 1.3.26 + "@swc/core-linux-arm64-gnu": 1.3.26 + "@swc/core-linux-arm64-musl": 1.3.26 + "@swc/core-linux-x64-gnu": 1.3.26 + "@swc/core-linux-x64-musl": 1.3.26 + "@swc/core-win32-arm64-msvc": 1.3.26 + "@swc/core-win32-ia32-msvc": 1.3.26 + "@swc/core-win32-x64-msvc": 1.3.26 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -13192,9 +13388,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - bin: - swcx: run_swcx.js - checksum: 2a92949c33f292a369f4a750a8a9759f88f6f399bc0beef54768fce3d1af5cf0c33a4c8f3c2478020ae95e99d99b7c17f301b79163cdbcdf533b91675f1d2e8d + checksum: 656a2197bd8bd50b112077e8c7f9156527ec66cb06fed2cefb9e2610e3cde13e8416783f84edda67b9af4e27d6b169bc1a447d7c6c73cf64a1b3ec428b0737ab languageName: node linkType: hard @@ -13228,18 +13422,18 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:4.20.4": - version: 4.20.4 - resolution: "@tanstack/query-core@npm:4.20.4" - checksum: bdb652296e4093d8cb042a67b9c035bc0a756e09a3b12aeb070068b07adc1c71174c2e6108f2a8c3322a26cb73ba57f431326aa0b813c81621674b9cc208cd93 +"@tanstack/query-core@npm:4.22.0": + version: 4.22.0 + resolution: "@tanstack/query-core@npm:4.22.0" + checksum: d24c13f8e21b65380230055a6673ae670aca5ee550c2f9a24b89fd3ac5243b465bb25f61b29da8ca285fc7fb0f4c2f8add3864f742eafac5131e777f3e52767a languageName: node linkType: hard "@tanstack/react-query@npm:^4.1.3": - version: 4.20.4 - resolution: "@tanstack/react-query@npm:4.20.4" + version: 4.22.0 + resolution: "@tanstack/react-query@npm:4.22.0" dependencies: - "@tanstack/query-core": 4.20.4 + "@tanstack/query-core": 4.22.0 use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -13250,7 +13444,7 @@ __metadata: optional: true react-native: optional: true - checksum: ba9e2f175c58bde592c0ad14285f289585474763f8d68072d651fa75263a3a7f75eead5b62aa3140db133b95468498bc58817d07513f6f857be2bd8031b491da + checksum: b146774b44a79dd5a6412d981ce04790e66da5a36f907a03c85c36f50a38fb4e4dfbfca7b1561c86b39fb0df1c0c1ae0a0ef2930c06b444da3f430b9bad450f1 languageName: node linkType: hard @@ -13289,15 +13483,15 @@ __metadata: languageName: unknown linkType: soft -"@testing-library/cypress@npm:^8.0.2": - version: 8.0.7 - resolution: "@testing-library/cypress@npm:8.0.7" +"@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: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 - checksum: e005bc1a7ec808706c57e95ed312069fb5be39ea7362900dc2a32c09f124d478ade69ebcd7df88c076e3867ab328ae6e6ce13791bdf042621ff66b56552bf74b + cypress: ^12.0.0 + checksum: fbd24e8f0b8a60279b336de5f6bc0e7ad6fb31316eacab5128dacc7fccde1eb40935b90f2c3bddc7d814115fe3965c6dbf011785448cd15b5a5b0bc40ef5bb4c languageName: node linkType: hard @@ -13419,15 +13613,15 @@ __metadata: languageName: node linkType: hard -"@ts-morph/common@npm:~0.16.0": - version: 0.16.0 - resolution: "@ts-morph/common@npm:0.16.0" +"@ts-morph/common@npm:~0.18.0": + version: 0.18.1 + resolution: "@ts-morph/common@npm:0.18.1" dependencies: - fast-glob: ^3.2.11 + fast-glob: ^3.2.12 minimatch: ^5.1.0 mkdirp: ^1.0.4 path-browserify: ^1.0.1 - checksum: 0ef97330a164a42b81b0499b042e91db8e39d705bb983ef83cbc80cc32ab36123e26baefb78203953d1a0c6e3b92cad9bc7a5e0ea409623a5e7db90cb3742112 + checksum: 848fff5f7a6428d7c2f055de20cf8df864a967aac0cc03adc558d853442085a8fd9dec70429da24d67d263794b315edb0791c46d23ad9ae513251a7702df8031 languageName: node linkType: hard @@ -13621,11 +13815,11 @@ __metadata: linkType: hard "@types/codemirror@npm:^5.0.0": - version: 5.60.5 - resolution: "@types/codemirror@npm:5.60.5" + version: 5.60.6 + resolution: "@types/codemirror@npm:5.60.6" dependencies: "@types/tern": "*" - checksum: 423b6378b6415b626d9f54d37d69477f96940b30a695d4ec36402feb59a96f7ab42d1c17b8472fbb222a0966f6061deee234e37bcd3e34c75836e989dc95929d + checksum: 10b8c2a689f9ed610b0048d9d5ded1a7eb90c45014156b84b41c4f52f4720172414f7172d56f13c8a0b35d429704fb9d240414cf205776c807caa39105b33481 languageName: node linkType: hard @@ -13778,9 +13972,9 @@ __metadata: linkType: hard "@types/d3-force@npm:^3.0.0": - version: 3.0.3 - resolution: "@types/d3-force@npm:3.0.3" - checksum: 1082a07c028b454fccbb250381e1388818606faff0a7b81d80bc4ab53c5f86f2618fcbb12226402880476d96be9bb24c6c38f175c5e697e94ea4cf8af389be6c + version: 3.0.4 + resolution: "@types/d3-force@npm:3.0.4" + checksum: 779fb597fb41e7bc6a5e1b8969d500deb95c4a73428c7c268bf0ca6f3ed668dd2ed6aa652de7af14d2f9c192dad4f6e7badf2c5bc330624bd8405ac88440b278 languageName: node linkType: hard @@ -13833,9 +14027,9 @@ __metadata: linkType: hard "@types/d3-selection@npm:*, @types/d3-selection@npm:^3.0.1": - version: 3.0.3 - resolution: "@types/d3-selection@npm:3.0.3" - checksum: 24d4ac0b8f76bfdf5d3d90e6724ff7703057375ba482d2924f8d959e5481eaab55e0e39b5ca68a6d4e99bce100561333dee4146f497c9fc3605f1a308a7e713c + version: 3.0.4 + resolution: "@types/d3-selection@npm:3.0.4" + checksum: b1e486db7f020610c854996a96b2f59a43b89d48bc7ac2ef9479f6f6e6324d3b21d7dfc8031a0b6d049a84b769b14eca65d73fc42613ab0044ef67973a9fe6ca languageName: node linkType: hard @@ -13858,11 +14052,11 @@ __metadata: linkType: hard "@types/d3-shape@npm:^3.0.1": - version: 3.1.0 - resolution: "@types/d3-shape@npm:3.1.0" + version: 3.1.1 + resolution: "@types/d3-shape@npm:3.1.1" dependencies: "@types/d3-path": "*" - checksum: 19d43b9762cbff503806d014be1b8a5d22dd12c71635f1f0b30696d3b3b31528b978175afe2ba183542fd16e4fc740f56e7a84100ead00f7d95eaeb890ac8b78 + checksum: 8f1762ecdeb4833a3802be1c65363cbc7cca753d0b836a3855fde4ba12f8e6fc142dba3c5f6d669a9e89374cc6dc414464e4f2d04e72fafd4bc64819ce30bb63 languageName: node linkType: hard @@ -13874,12 +14068,12 @@ __metadata: linkType: hard "@types/d3-zoom@npm:^3.0.1": - version: 3.0.1 - resolution: "@types/d3-zoom@npm:3.0.1" + version: 3.0.2 + resolution: "@types/d3-zoom@npm:3.0.2" dependencies: "@types/d3-interpolate": "*" "@types/d3-selection": "*" - checksum: f813b3e6f27efc8508d6a2d575c21d0b1ba338160e498b901bc103d813c47ce609f691912a4ef73e9678cdbbdebbee81fecaf7432f777e9a8a54bf4087c21eba + checksum: c55b18ec5d5108c265d3e19299f51469e48d215f179a665f5797ac18bf8458dcbefd0c682154f8d8eb9d297a7486a5853115f72444af9cd02b3b4b5d1e4f9b22 languageName: node linkType: hard @@ -13927,11 +14121,11 @@ __metadata: linkType: hard "@types/dompurify@npm:^2.1.0, @types/dompurify@npm:^2.2.2, @types/dompurify@npm:^2.3.3": - version: 2.3.4 - resolution: "@types/dompurify@npm:2.3.4" + version: 2.4.0 + resolution: "@types/dompurify@npm:2.4.0" dependencies: "@types/trusted-types": "*" - checksum: ea55678bc9fd32fcdae904ca191f2b8cc5b475277937e5e4c024690b0c3b9c73accfb7391f56d26d0f53fcff496a013773293e189a07a79afdd2b2ed4efacd5f + checksum: b48cd81e997794ebc390c7c5bef1a67ec14a6f2f0521973e07e06af186c7583abe114d94d24868c0632b9573f5bd77131a4b76f3fffdf089ba99a4e53dd46c39 languageName: node linkType: hard @@ -13990,7 +14184,18 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:4.17.31, @types/express-serve-static-core@npm:^4.17.18, @types/express-serve-static-core@npm:^4.17.5": +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18, @types/express-serve-static-core@npm:^4.17.31, @types/express-serve-static-core@npm:^4.17.5": + version: 4.17.32 + resolution: "@types/express-serve-static-core@npm:4.17.32" + dependencies: + "@types/node": "*" + "@types/qs": "*" + "@types/range-parser": "*" + checksum: 70ec1b8f386628850b315a7b9fd4240a5a70297b41ef1c39af65c8b9661d2c775cfff4686b491fd90e5b6eef43088af203700c5541aec0d063db0c6cbeff254c + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:4.17.31": version: 4.17.31 resolution: "@types/express-serve-static-core@npm:4.17.31" dependencies: @@ -14020,7 +14225,19 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:4.17.14, @types/express@npm:^4.17.13, @types/express@npm:^4.17.6": +"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.15, @types/express@npm:^4.17.6": + version: 4.17.15 + resolution: "@types/express@npm:4.17.15" + dependencies: + "@types/body-parser": "*" + "@types/express-serve-static-core": ^4.17.31 + "@types/qs": "*" + "@types/serve-static": "*" + checksum: b4acd8a836d4f6409cdf79b12d6e660485249b62500cccd61e7997d2f520093edf77d7f8498ca79d64a112c6434b6de5ca48039b8fde2c881679eced7e96979b + languageName: node + linkType: hard + +"@types/express@npm:4.17.14": version: 4.17.14 resolution: "@types/express@npm:4.17.14" dependencies: @@ -14226,12 +14443,12 @@ __metadata: linkType: hard "@types/jest@npm:*, @types/jest@npm:^29.0.0": - version: 29.2.4 - resolution: "@types/jest@npm:29.2.4" + version: 29.2.5 + resolution: "@types/jest@npm:29.2.5" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: 9deb4756fe1b438d41ff1aae7d6c216c9e49e5fe60f539f8edb6698ffeb530ff7b25d37e223439b03602ca3a7397c9c2e53e1a39c7bd616353472fce0cc04107 + checksum: d668470f00ec4cb8b8457f1fd90f7358fad8f22d74b85006dad6be522d6b9bf10f49f597e88d1d1a518d211c1b65be32a1f27f0e49ce0658d110a9206b8ea310 languageName: node linkType: hard @@ -14246,11 +14463,11 @@ __metadata: linkType: hard "@types/jquery@npm:^3.3.34": - version: 3.5.14 - resolution: "@types/jquery@npm:3.5.14" + version: 3.5.16 + resolution: "@types/jquery@npm:3.5.16" dependencies: "@types/sizzle": "*" - checksum: 159d6f804ed1a204b3f79f2d591a271d82e866bd45bd49fb6ef40561a25dbe0f47ec7815681b44cc2db5598425f72811e7e80ab0e983d980470998ac56feb375 + checksum: 13c995f15d1c2f1d322103dc1cb0a22b95eecc3e7546f00279b8731aea21d7ec04550af40e609ee48e755d4e11bf61c25b4aa9f53df3bcbec4b8fe8e81471732 languageName: node linkType: hard @@ -14326,7 +14543,7 @@ __metadata: languageName: node linkType: hard -"@types/jsonwebtoken@npm:^8.3.3, @types/jsonwebtoken@npm:^8.5.0": +"@types/jsonwebtoken@npm:^8.5.0": version: 8.5.0 resolution: "@types/jsonwebtoken@npm:8.5.0" dependencies: @@ -14335,6 +14552,15 @@ __metadata: languageName: node linkType: hard +"@types/jsonwebtoken@npm:^9.0.0": + version: 9.0.0 + resolution: "@types/jsonwebtoken@npm:9.0.0" + dependencies: + "@types/node": "*" + checksum: c7791354ba895759524c18ba609ea04efdc576e2b660bd6f80d5b917db8dc4b01acd4d1bc115a62d35406a82e627067973d475c4b36035dabaa27862b141ae49 + languageName: node + linkType: hard + "@types/jwt-decode@npm:^3.1.0": version: 3.1.0 resolution: "@types/jwt-decode@npm:3.1.0" @@ -14398,9 +14624,9 @@ __metadata: linkType: hard "@types/luxon@npm:*, @types/luxon@npm:^3.0.0": - version: 3.1.0 - resolution: "@types/luxon@npm:3.1.0" - checksum: 04768029342ad76fc2a9339436c143ea64797b35cf9b03ddded787c13eae30f0ca1246e51c2c5365ed912f98068e13a967a3931b137eb4585248a0ad7ec3fa86 + version: 3.2.0 + resolution: "@types/luxon@npm:3.2.0" + checksum: 051bfbf841c6ce98728df6538342ce4aaddfcf0ec6e8b473e0195dcfc3ba6b1fe4b3ce17f2ba6d25344f41cb70032c1debe96da9e384e5f6e639665c1e6d368c languageName: node linkType: hard @@ -14482,11 +14708,11 @@ __metadata: linkType: hard "@types/morgan@npm:^1.9.0": - version: 1.9.3 - resolution: "@types/morgan@npm:1.9.3" + version: 1.9.4 + resolution: "@types/morgan@npm:1.9.4" dependencies: "@types/node": "*" - checksum: 0b9bc8641ce03f7176f617523b8da300e5d47225b1667396749950ac7fdfa1f990447d490648fbaff050c2b0ef5fa60c3f2f00c6b76efec06fe5148de5020813 + checksum: d1e99c66a43501dcdf6e94e013dfff4e6c152cbb5f782d954bb722d230a9c1c0fe06fab6df3f3dfa3547735a7598f9471633cc6813d794e9562fd022e217c6ae languageName: node linkType: hard @@ -14527,9 +14753,9 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 18.11.9 - resolution: "@types/node@npm:18.11.9" - checksum: cc0aae109e9b7adefc32eecb838d6fad931663bb06484b5e9cbbbf74865c721b03d16fd8d74ad90e31dbe093d956a7c2c306ba5429ba0c00f3f7505103d7a496 + version: 18.11.18 + resolution: "@types/node@npm:18.11.18" + checksum: 03f17f9480f8d775c8a72da5ea7e9383db5f6d85aa5fefde90dd953a1449bd5e4ffde376f139da4f3744b4c83942166d2a7603969a6f8ea826edfb16e6e3b49d languageName: node linkType: hard @@ -14569,9 +14795,9 @@ __metadata: linkType: hard "@types/node@npm:^16.0.0, @types/node@npm:^16.11.26, @types/node@npm:^16.9.2": - version: 16.18.3 - resolution: "@types/node@npm:16.18.3" - checksum: 6b8ba2ea5d842f7986e366cb9184c54d273d492784dc62e08fd5afeae938d9b61aec6e4222d2541cd18f9b1412ba361bbcb3f4204fb003608af80a2a6af959f9 + version: 16.18.11 + resolution: "@types/node@npm:16.18.11" + checksum: 2a3b1da13063debe6e26f732defb5f03ef4ef732c3e08daba838d8850433bd00e537ce1a97ce9bcfc4b15db5218d701d1265fae94e0d6926906bec157e6b46e0 languageName: node linkType: hard @@ -14777,11 +15003,11 @@ __metadata: linkType: hard "@types/react-syntax-highlighter@npm:^15.0.0": - version: 15.5.5 - resolution: "@types/react-syntax-highlighter@npm:15.5.5" + version: 15.5.6 + resolution: "@types/react-syntax-highlighter@npm:15.5.6" dependencies: "@types/react": "*" - checksum: c0b3a5b7aa39c8c1b823d4d64818ac53900c1a5bd65ed43fae56402b746f8d21e2b768ba7201d9d9b15447b377c271d09aebd75af05b02a1ff67459670c5d2f7 + checksum: 81a9f26da41606ff595d42a064ec4097cd17c4ef242558aa5b3b76a1063729b2ae73f063350069a4692218cf6843d7ea59d3eaeac4df2a4894d969d911fb80b2 languageName: node linkType: hard @@ -14922,11 +15148,11 @@ __metadata: linkType: hard "@types/sanitize-html@npm:^2.6.2": - version: 2.6.2 - resolution: "@types/sanitize-html@npm:2.6.2" + version: 2.8.0 + resolution: "@types/sanitize-html@npm:2.8.0" dependencies: - htmlparser2: ^6.0.0 - checksum: 08b43427427cbd8acd2843bbf9e00576c06e3916fc523d27fd9016f39563f7999f78b632ff473ef83a77f86bdea9286de2f81e3a8f8a05af6721687651c84f1c + htmlparser2: ^8.0.0 + checksum: 6e583cac673832536fac8da53890073f753baf2c49826fd0c2831e615cb5527692d03b2b5ba9eb8caf8694de4bfb1c31fd12398d2b68331725590a6ceb8f82fe languageName: node linkType: hard @@ -15309,12 +15535,12 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^5.9.0": - version: 5.45.1 - resolution: "@typescript-eslint/eslint-plugin@npm:5.45.1" + version: 5.48.1 + resolution: "@typescript-eslint/eslint-plugin@npm:5.48.1" dependencies: - "@typescript-eslint/scope-manager": 5.45.1 - "@typescript-eslint/type-utils": 5.45.1 - "@typescript-eslint/utils": 5.45.1 + "@typescript-eslint/scope-manager": 5.48.1 + "@typescript-eslint/type-utils": 5.48.1 + "@typescript-eslint/utils": 5.48.1 debug: ^4.3.4 ignore: ^5.2.0 natural-compare-lite: ^1.4.0 @@ -15327,7 +15553,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 9fc7cc17ebd1d6f9b1321afa3dcedb936ba538f95a026035a436c4b75eb976ac61140be44be304634c8f87612e30690ce12bf3498ac59826134387d91d75d888 + checksum: d8d73d123d16fc9b50b500ef21816dcabdffe0d2dcfdb15089dc5a1015d57cbad709de565d1c830f5058c0d7b410069e2554c0b53d1485fe7b237ea8089e58be languageName: node linkType: hard @@ -15348,29 +15574,29 @@ __metadata: linkType: hard "@typescript-eslint/parser@npm:^5.9.0": - version: 5.45.1 - resolution: "@typescript-eslint/parser@npm:5.45.1" + version: 5.48.1 + resolution: "@typescript-eslint/parser@npm:5.48.1" dependencies: - "@typescript-eslint/scope-manager": 5.45.1 - "@typescript-eslint/types": 5.45.1 - "@typescript-eslint/typescript-estree": 5.45.1 + "@typescript-eslint/scope-manager": 5.48.1 + "@typescript-eslint/types": 5.48.1 + "@typescript-eslint/typescript-estree": 5.48.1 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 48704224972e67d7ecf928118d47a1eda6732afd585bb4aab6716b7d363e5d4a2e0b0f1bbb92cbef80c7dd75ede10b610e858eb0cb86a67d1866fd17d0722895 + checksum: c624d24eb209b4ce7f0a6c8116712363f10a9c9a5138f240e254ff265526ee4b0fd73b7b6b4b6a0e7611bd9934c42036350dd27f96ae2fa4efdade1a7ebd0e9e languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.45.1": - version: 5.45.1 - resolution: "@typescript-eslint/scope-manager@npm:5.45.1" +"@typescript-eslint/scope-manager@npm:5.48.1": + version: 5.48.1 + resolution: "@typescript-eslint/scope-manager@npm:5.48.1" dependencies: - "@typescript-eslint/types": 5.45.1 - "@typescript-eslint/visitor-keys": 5.45.1 - checksum: ee0f47ad85e6d8649a5c25cc923933e439542079929e02a7eb20332e18291674af36b25ab579f7d067745ca27c2b37e5d9be605902269968e274d26c1d2b684e + "@typescript-eslint/types": 5.48.1 + "@typescript-eslint/visitor-keys": 5.48.1 + checksum: f60a7efe917798cccf8652925de6be58b023ded6c6ee44ce74d074f0c2a1927680398a6d73bab33d500c69474ad8c54d63b90fcc6e13256712707d12a60e0a64 languageName: node linkType: hard @@ -15384,12 +15610,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.45.1": - version: 5.45.1 - resolution: "@typescript-eslint/type-utils@npm:5.45.1" +"@typescript-eslint/type-utils@npm:5.48.1": + version: 5.48.1 + resolution: "@typescript-eslint/type-utils@npm:5.48.1" dependencies: - "@typescript-eslint/typescript-estree": 5.45.1 - "@typescript-eslint/utils": 5.45.1 + "@typescript-eslint/typescript-estree": 5.48.1 + "@typescript-eslint/utils": 5.48.1 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -15397,14 +15623,14 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: dcb9f425803b399c340ab3d72c3f7e61f2a136d4281bd710853e954c1c101064ac0bb4b768c84c1ad310ec493cd8dc6b754054d9a81cb56be37ef1f4130c2c3a + checksum: 2739b35caf48c9edbeab82936de58ce0759ab34955ce7eec1786690d6a63146ae0a6c5d9c76034605d9fe200c87a73ede0772c6244c5df6e66df992d9ebbab72 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.45.1": - version: 5.45.1 - resolution: "@typescript-eslint/types@npm:5.45.1" - checksum: 7f809d2951812ae5752c9d1617b7e6dfd662370390b0ddba72005ebc62bd5f04745567bb62cf00a9e43db9dfd222d18ea22945f5457f76ea86386ef7b98c8424 +"@typescript-eslint/types@npm:5.48.1": + version: 5.48.1 + resolution: "@typescript-eslint/types@npm:5.48.1" + checksum: 8437986e9d86d792b23327517ae2f9861ec55992d5a9cd55991e525409b6244169436cd708f3987ab7c579e45e59b6eab5a9d3583f7729219e25691164293094 languageName: node linkType: hard @@ -15415,12 +15641,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.45.1": - version: 5.45.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.45.1" +"@typescript-eslint/typescript-estree@npm:5.48.1": + version: 5.48.1 + resolution: "@typescript-eslint/typescript-estree@npm:5.48.1" dependencies: - "@typescript-eslint/types": 5.45.1 - "@typescript-eslint/visitor-keys": 5.45.1 + "@typescript-eslint/types": 5.48.1 + "@typescript-eslint/visitor-keys": 5.48.1 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -15429,7 +15655,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 867b19ba050af7410c75e4e42b511d4299c8043d238959e9794bb65d7a9db1a875880e5dd50f112896218f3a3d163cd8ce61db94034ca628eca4f7ddccb1d348 + checksum: 2b26e5848ef131e1bb99ed54d8c0efa8279cf8e8f7d8b72de00c2ca6cf2799d96c20f5bbbcf26e14e81b7b9d1035ba509bff30f2d852c174815879e8f14c27ed languageName: node linkType: hard @@ -15451,31 +15677,31 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.45.1, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.13.0": - version: 5.45.1 - resolution: "@typescript-eslint/utils@npm:5.45.1" +"@typescript-eslint/utils@npm:5.48.1, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.13.0": + version: 5.48.1 + resolution: "@typescript-eslint/utils@npm:5.48.1" dependencies: "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.45.1 - "@typescript-eslint/types": 5.45.1 - "@typescript-eslint/typescript-estree": 5.45.1 + "@typescript-eslint/scope-manager": 5.48.1 + "@typescript-eslint/types": 5.48.1 + "@typescript-eslint/typescript-estree": 5.48.1 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 7e673b07e207a0b596b23f60e6c2d4b04fd534bd15dc326ce67d7f61637ed2c211fe5a5ffdcf6b3fa3f39000fe61de0bf7d0c7feb03dcd3d72c382ae35287ad9 + checksum: 2d112cbb6a920f147c6c3322e404ca3c56c1170e1ede3bcbf16fb779960dc24cdba688b1f2d06acd242859fc1dbc8702da5f8fa8bbf53e7081e41d80bec4c236 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.45.1": - version: 5.45.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.45.1" +"@typescript-eslint/visitor-keys@npm:5.48.1": + version: 5.48.1 + resolution: "@typescript-eslint/visitor-keys@npm:5.48.1" dependencies: - "@typescript-eslint/types": 5.45.1 + "@typescript-eslint/types": 5.48.1 eslint-visitor-keys: ^3.3.0 - checksum: 725a434fb05010b6ead7e880fa1fcdb4dbc7421b80667e96ad27fcfb3c2b2b0edde64be488740577dd147547fc4a9eac52e2602eb6a8a261ee14a917d4a50c4f + checksum: 2bda10cf4e6bc48b0d463767617e48a832d708b9434665dff6ed101f7d33e0d592f02af17a2259bde1bd17e666246448ae78d0fe006148cb93d897fff9b1d134 languageName: node linkType: hard @@ -15489,9 +15715,9 @@ __metadata: languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.19.4": - version: 4.19.4 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.4" +"@uiw/codemirror-extensions-basic-setup@npm:4.19.6": + version: 4.19.6 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.6" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -15508,19 +15734,19 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: 041f6c67ad43a1991b2b5dea49bc907937b47de26f44d75de81c9937c9ac61193ed08e114b8dfacfa3de45fd05799d76cab0f529577671e61c04d52536287bb1 + checksum: 775c6c190b27ed0ffeb9fec9b03c60a4d621f33480e7c878c3841cb0fa983baab46d13612d7ac9a14a3e810b83d9ab12aa387a291e5e5a0726bf33f28d89d1c0 languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.9.3": - version: 4.19.4 - resolution: "@uiw/react-codemirror@npm:4.19.4" + version: 4.19.6 + resolution: "@uiw/react-codemirror@npm:4.19.6" dependencies: "@babel/runtime": ^7.18.6 "@codemirror/commands": ^6.1.0 "@codemirror/state": ^6.1.1 "@codemirror/theme-one-dark": ^6.0.0 - "@uiw/codemirror-extensions-basic-setup": 4.19.4 + "@uiw/codemirror-extensions-basic-setup": 4.19.6 codemirror: ^6.0.0 peerDependencies: "@babel/runtime": ">=7.11.0" @@ -15530,7 +15756,7 @@ __metadata: codemirror: ">=6.0.0" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 88f931ae71f42609db4ca81453d9d68774a57938c06827423588c7e8dabc0c5e0dfce18ca790d5ca078b69b68372ab5a929344333ca7915b27f6a6f66470c5d8 + checksum: 64c0374dd221e7ddab2f8c2531ad5271f595fad116e37b45acaa9f1d8b8d5659bccdd4aea47a558cce4c62d46e90b8d074760a5b328e9e99c253c79ec99e8b6a languageName: node linkType: hard @@ -15685,6 +15911,22 @@ __metadata: languageName: node linkType: hard +"@whatwg-node/fetch@npm:0.5.3, @whatwg-node/fetch@npm:^0.5.0": + version: 0.5.3 + resolution: "@whatwg-node/fetch@npm:0.5.3" + dependencies: + "@peculiar/webcrypto": ^1.4.0 + abort-controller: ^3.0.0 + busboy: ^1.6.0 + form-data-encoder: ^1.7.1 + formdata-node: ^4.3.1 + node-fetch: ^2.6.7 + undici: ^5.12.0 + web-streams-polyfill: ^3.2.0 + checksum: 73087779b3b0e70d0abf8b2a5d82919c29c26f8062e16db0cad413fe45c7b58c3c12cc2bcd5942aebdfdc4feee97b01cf1ff6c5d92d9507a140afdcafa410b12 + languageName: node + linkType: hard + "@whatwg-node/fetch@npm:^0.2.4": version: 0.2.6 resolution: "@whatwg-node/fetch@npm:0.2.6" @@ -15702,9 +15944,9 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/fetch@npm:^0.5.0": - version: 0.5.3 - resolution: "@whatwg-node/fetch@npm:0.5.3" +"@whatwg-node/fetch@npm:^0.6.0": + version: 0.6.1 + resolution: "@whatwg-node/fetch@npm:0.6.1" dependencies: "@peculiar/webcrypto": ^1.4.0 abort-controller: ^3.0.0 @@ -15713,8 +15955,9 @@ __metadata: formdata-node: ^4.3.1 node-fetch: ^2.6.7 undici: ^5.12.0 + urlpattern-polyfill: ^6.0.2 web-streams-polyfill: ^3.2.0 - checksum: 73087779b3b0e70d0abf8b2a5d82919c29c26f8062e16db0cad413fe45c7b58c3c12cc2bcd5942aebdfdc4feee97b01cf1ff6c5d92d9507a140afdcafa410b12 + checksum: 81b469c03e53f49f6a1a2d8059ba28d40b710611e01a60f6396cf95f0d4b48d596c176dccc19876e32b3c67b77b1e72c1053cea05f6417f1c5340150037a3da1 languageName: node linkType: hard @@ -15968,14 +16211,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.8.0": - version: 8.11.2 - resolution: "ajv@npm:8.11.2" + version: 8.12.0 + resolution: "ajv@npm:8.12.0" dependencies: fast-deep-equal: ^3.1.1 json-schema-traverse: ^1.0.0 require-from-string: ^2.0.2 uri-js: ^4.2.2 - checksum: 53435bf79ee7d1eabba8085962dba4c08d08593334b304db7772887f0b7beebc1b3d957432f7437ed4b60e53b5d966a57b439869890209c50fed610459999e3e + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 languageName: node linkType: hard @@ -15987,9 +16230,9 @@ __metadata: linkType: hard "already@npm:^3.2.0": - version: 3.4.0 - resolution: "already@npm:3.4.0" - checksum: 622742936621eb744734bf30be9fcfcd847d499483629f27041fb31c069d61d993d9c6444fd22a5d1a57c36ee6086921d5a1ca6d50dc4fd72ebb0aba38f6c216 + version: 3.4.1 + resolution: "already@npm:3.4.1" + checksum: 4bc145ca4d3c0b92d8cdbd9c47590f5b1e52f7cb112d16961aeab35496cf4639b6f49c5c7bb9056cfdcf47f2c26ac9c9c09a86d11a5108d605e79628d9f64d93 languageName: node linkType: hard @@ -16368,20 +16611,12 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^4.2.2": - version: 4.2.2 - resolution: "aria-query@npm:4.2.2" +"aria-query@npm:^5.0.0, aria-query@npm:^5.1.3": + version: 5.1.3 + resolution: "aria-query@npm:5.1.3" dependencies: - "@babel/runtime": ^7.10.2 - "@babel/runtime-corejs3": ^7.10.2 - checksum: 38401a9a400f26f3dcc24b84997461a16b32869a9893d323602bed8da40a8bcc0243b8d2880e942249a1496cea7a7de769e93d21c0baa439f01e1ee936fed665 - languageName: node - linkType: hard - -"aria-query@npm:^5.0.0": - version: 5.0.0 - resolution: "aria-query@npm:5.0.0" - checksum: c41f98866c5a304561ee8cae55856711cddad6f3f85d8cb43cc5f79667078d9b8979ce32d244c1ff364e6463a4d0b6865804a33ccc717fed701b281cf7dc6296 + deep-equal: ^2.0.5 + checksum: 929ff95f02857b650fb4cbcd2f41072eee2f46159a6605ea03bf63aa572e35ffdff43d69e815ddc462e16e07de8faba3978afc2813650b4448ee18c9895d982b languageName: node linkType: hard @@ -16392,13 +16627,6 @@ __metadata: languageName: node linkType: hard -"array-filter@npm:^1.0.0": - version: 1.0.0 - resolution: "array-filter@npm:1.0.0" - checksum: 467054291f522d7f633b1f5e79aac9008ade50a7354e0178d9ec8f0091ec03bc19a41d4eb22985daf2279a5c27be6d7cf410733539e7fccb0742145b89aca438 - languageName: node - linkType: hard - "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -16654,12 +16882,10 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.2": - version: 1.0.2 - resolution: "available-typed-arrays@npm:1.0.2" - dependencies: - array-filter: ^1.0.0 - checksum: 915a89f31bb9ba51f7396d5ae7d8eff99bc6d6ba9f337068a6916e9ba56fa47bfea7ea69f6f6ad131eac57f76582c721e5f0594e8fea7156894313fc41203fbd +"available-typed-arrays@npm:^1.0.5": + version: 1.0.5 + resolution: "available-typed-arrays@npm:1.0.5" + checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a languageName: node linkType: hard @@ -16713,19 +16939,19 @@ __metadata: linkType: hard "aws-sdk-mock@npm:^5.2.1": - version: 5.7.0 - resolution: "aws-sdk-mock@npm:5.7.0" + version: 5.8.0 + resolution: "aws-sdk-mock@npm:5.8.0" dependencies: - aws-sdk: ^2.1122.0 - sinon: ^13.0.2 + aws-sdk: ^2.1231.0 + sinon: ^14.0.1 traverse: ^0.6.6 - checksum: 9ac22cffc2e99c64af7aa29d2b4030ff8fdbb36d98cb27008952371d159ce974d31538fded372484e5d89e3fa9c22df0b7835d635a325734696a68c96a09e668 + checksum: c0b06d63d375a6f6664a5860815bdcc21cbe752f227f3617db8bd9042e48604e5cc26834876909c8fc1e68ac937166f4cb0637b3cb565d05c9a64aa025fe3407 languageName: node linkType: hard -"aws-sdk@npm:^2.1122.0, aws-sdk@npm:^2.814.0, aws-sdk@npm:^2.840.0, aws-sdk@npm:^2.948.0": - version: 2.1224.0 - resolution: "aws-sdk@npm:2.1224.0" +"aws-sdk@npm:^2.1231.0, aws-sdk@npm:^2.814.0, aws-sdk@npm:^2.840.0, aws-sdk@npm:^2.948.0": + version: 2.1279.0 + resolution: "aws-sdk@npm:2.1279.0" dependencies: buffer: 4.9.2 events: 1.1.1 @@ -16737,7 +16963,7 @@ __metadata: util: ^0.12.4 uuid: 8.0.0 xml2js: 0.4.19 - checksum: 990b4db8b72462432cfd75b4fe2c71ff8b24abed2b0d6b6441d51211167afd00b002ff91d7c3ff02379b34f6e5dcae72bdf9e31f55a9c105f50ad96cfc8f08da + checksum: ee8e8ee7baea9abaa0e1d08294be8ff00795b9db606101ef69a45d1465dac936187e43079fbe7a28ff4a463c8f9cd728d9bfee3e3974b0b5b88eb437dc81295b languageName: node linkType: hard @@ -16749,16 +16975,16 @@ __metadata: linkType: hard "aws4@npm:^1.11.0, aws4@npm:^1.8.0": - version: 1.11.0 - resolution: "aws4@npm:1.11.0" - checksum: 5a00d045fd0385926d20ebebcfba5ec79d4482fe706f63c27b324d489a04c68edb0db99ed991e19eda09cb8c97dc2452059a34d97545cebf591d7a2b5a10999f + version: 1.12.0 + resolution: "aws4@npm:1.12.0" + checksum: 68f79708ac7c335992730bf638286a3ee0a645cf12575d557860100767c500c08b30e24726b9f03265d74116417f628af78509e1333575e9f8d52a80edfe8cbc languageName: node linkType: hard -"axe-core@npm:^4.4.3": - version: 4.4.3 - resolution: "axe-core@npm:4.4.3" - checksum: c3ea000d9ace3ba0bc747c8feafc24b0de62a0f7d93021d0f77b19c73fca15341843510f6170da563d51535d6cfb7a46c5fc0ea36170549dbb44b170208450a2 +"axe-core@npm:^4.6.2": + version: 4.6.2 + resolution: "axe-core@npm:4.6.2" + checksum: 81523eeaf101a3a129545a936d448d235ecf1f8c0daccdee224d29f63bec716fa38cf1a65c8462548b1f995624277eed790d9d9977ae40ba692c4cadf1196403 languageName: node linkType: hard @@ -16813,10 +17039,12 @@ __metadata: languageName: node linkType: hard -"axobject-query@npm:^2.2.0": - version: 2.2.0 - resolution: "axobject-query@npm:2.2.0" - checksum: 96b8c7d807ca525f41ad9b286186e2089b561ba63a6d36c3e7d73dc08150714660995c7ad19cda05784458446a0793b45246db45894631e13853f48c1aa3117f +"axobject-query@npm:^3.1.1": + version: 3.1.1 + resolution: "axobject-query@npm:3.1.1" + dependencies: + deep-equal: ^2.0.5 + checksum: c12a5da10dc7bab75e1cda9b6a3b5fcf10eba426ddf1a17b71ef65a434ed707ede7d1c4f013ba1609e970bc8c0cddac01365080d376204314e9b294719acd8a5 languageName: node linkType: hard @@ -17165,14 +17393,14 @@ __metadata: languageName: node linkType: hard -"better-sqlite3@npm:^7.5.0": - version: 7.6.2 - resolution: "better-sqlite3@npm:7.6.2" +"better-sqlite3@npm:^8.0.0": + version: 8.0.1 + resolution: "better-sqlite3@npm:8.0.1" dependencies: bindings: ^1.5.0 node-gyp: latest prebuild-install: ^7.1.0 - checksum: 45159e535d2c4f81456f85adcfef82e8a49025ca3e70a79bb8c0a47c13e4d822633a51b457cc37b986c42f8912344152091c91cab485048a187900aab7e7d619 + checksum: 533b2cc32bd54e2a943a4f63e079f8cc8945879b7a0ebd2085b948824ea067792f6f903ab75ba75d7cafc5f8f973354cdf9a042fa6216e077925d07a8df1bead languageName: node linkType: hard @@ -17852,14 +18080,14 @@ __metadata: linkType: hard "canvas@npm:^2.10.2": - version: 2.10.2 - resolution: "canvas@npm:2.10.2" + version: 2.11.0 + resolution: "canvas@npm:2.11.0" dependencies: "@mapbox/node-pre-gyp": ^1.0.0 nan: ^2.17.0 node-gyp: latest simple-get: ^3.0.3 - checksum: b2e3eb4c3635fa2f67857619621c3d314f935a9e51904536dadf4908ab580dff4f5bcbaafe6eb0255247fa027ca494d5cd97c33376a49a0f994997263fa9944b + checksum: a69a6e0c90014a1b02e52c4c38a627d1a01ffe9539047bec84105cb3554907a947cf39b4a333be43fc1583dd142b641bb5480a4e23f59c6098618c33bf78f67f languageName: node linkType: hard @@ -18354,12 +18582,10 @@ __metadata: languageName: node linkType: hard -"code-block-writer@npm:^11.0.0": - version: 11.0.0 - resolution: "code-block-writer@npm:11.0.0" - dependencies: - tslib: 2.3.1 - checksum: d3d92a06f762d5926ecdb2033e4f30eb4c51aca365ea69ef424afbce7cc2b1518a50deff2645cc17b6fa53f234d664631f2268a4caf91af6a1fd696aa0b2fefb +"code-block-writer@npm:^11.0.3": + version: 11.0.3 + resolution: "code-block-writer@npm:11.0.3" + checksum: f0a2605f19963d7087267c9b0fd0b05a6638a50e7b29b70f97aa01a514f59475b0626f8aa092188df853ee6d96745426dfa132d6a677795df462c6ce32c21639 languageName: node linkType: hard @@ -18585,9 +18811,9 @@ __metadata: linkType: hard "commander@npm:*, commander@npm:^9.1.0, commander@npm:^9.4.1": - version: 9.4.1 - resolution: "commander@npm:9.4.1" - checksum: bfb18e325a5bdf772763c2213d5c7d9e77144d944124e988bcd8e5e65fb6d45d5d4e86b09155d0f2556c9a59c31e428720e57968bcd050b2306e910a0bf3cf13 + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade languageName: node linkType: hard @@ -19001,9 +19227,9 @@ __metadata: linkType: hard "core-js@npm:^3.4.1, core-js@npm:^3.6.5": - version: 3.26.1 - resolution: "core-js@npm:3.26.1" - checksum: 0a01149f51ff1e9f41d1ea49cc4c9222047949ea597189ede7c4cf8cde3b097766b9c7615acc77c86fe65b4002f20b638a133dfba7b41dba830d707aeeed45ad + version: 3.27.1 + resolution: "core-js@npm:3.27.1" + checksum: d50b5f88aea4302512ad9446c18e90f4d35dea1e6d8d3f87337690677061565ff11a670f1e0c87de57aa6074375fbb25ed5784076c040d3c4de8b4bce7d2ebeb languageName: node linkType: hard @@ -19024,37 +19250,27 @@ __metadata: languageName: node linkType: hard -"cosmiconfig-toml-loader@npm:1.0.0": - version: 1.0.0 - resolution: "cosmiconfig-toml-loader@npm:1.0.0" - dependencies: - "@iarna/toml": ^2.2.5 - checksum: 00836a57c3c029a0d23f4eeeafc59a0be45cdf2707c5a6859020f545d50f939bfb01bc047fa41118faa92e69e25001f34d7687b05a97a469ed59fc870528b875 - languageName: node - linkType: hard - -"cosmiconfig-typescript-loader@npm:4.1.1, cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.1.1 - resolution: "cosmiconfig-typescript-loader@npm:4.1.1" +"cosmiconfig-typescript-loader@npm:4.3.0": + version: 4.3.0 + resolution: "cosmiconfig-typescript-loader@npm:4.3.0" peerDependencies: "@types/node": "*" cosmiconfig: ">=7" ts-node: ">=10" typescript: ">=3" - checksum: a774961868f0406d0fd75e448c2e1a0ddb95de27d477fa325a37369a2cbd892cf4d639a109082cd886840dea7707ea9bed5c38a468b52de18400c4f1d495d35a + checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb languageName: node linkType: hard -"cosmiconfig@npm:7.0.1, cosmiconfig@npm:^7.0.0, cosmiconfig@npm:^7.0.1": - version: 7.0.1 - resolution: "cosmiconfig@npm:7.0.1" +"cosmiconfig@npm:8.0.0": + version: 8.0.0 + resolution: "cosmiconfig@npm:8.0.0" dependencies: - "@types/parse-json": ^4.0.0 import-fresh: ^3.2.1 + js-yaml: ^4.1.0 parse-json: ^5.0.0 path-type: ^4.0.0 - yaml: ^1.10.0 - checksum: 4be63e7117955fd88333d7460e4c466a90f556df6ef34efd59034d2463484e339666c41f02b523d574a797ec61f4a91918c5b89a316db2ea2f834e0d2d09465b + checksum: ff4cdf89ac1ae52e7520816622c21a9e04380d04b82d653f5139ec581aa4f7f29e096d46770bc76c4a63c225367e88a1dfa233ea791669a35101f5f9b972c7d1 languageName: node linkType: hard @@ -19071,6 +19287,19 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^7.0.0, cosmiconfig@npm:^7.0.1": + version: 7.0.1 + resolution: "cosmiconfig@npm:7.0.1" + dependencies: + "@types/parse-json": ^4.0.0 + import-fresh: ^3.2.1 + parse-json: ^5.0.0 + path-type: ^4.0.0 + yaml: ^1.10.0 + checksum: 4be63e7117955fd88333d7460e4c466a90f556df6ef34efd59034d2463484e339666c41f02b523d574a797ec61f4a91918c5b89a316db2ea2f834e0d2d09465b + languageName: node + linkType: hard + "cpu-features@npm:0.0.2": version: 0.0.2 resolution: "cpu-features@npm:0.0.2" @@ -19155,11 +19384,11 @@ __metadata: linkType: hard "cron@npm:^2.0.0": - version: 2.1.0 - resolution: "cron@npm:2.1.0" + version: 2.2.0 + resolution: "cron@npm:2.2.0" dependencies: - luxon: ^1.23.x - checksum: 9395875c091f56db7964491c249cb143d2e4ba77560d7132da783943c1b0537ef1814eb8f552c81eda5a2aa153216dd3f5b7ff63e372a68a063fcfafe8231f91 + luxon: ^3.2.1 + checksum: 53905d0f55e052742cf4fed34598a4ebfc311f4f9143c90384225bb4376fa639cd12f485cbf5d3dca00db377bf5117f27a1cae405f15e4745d1f69808e4fb9ac languageName: node linkType: hard @@ -19709,10 +19938,10 @@ __metadata: languageName: node linkType: hard -"d3-path@npm:1 - 3": - version: 3.0.1 - resolution: "d3-path@npm:3.0.1" - checksum: 6347c7055e0af330acadbe7f02144963eecabff560a791ecfeaffb45662e4d38eedabc6109dc481478f136b41d03707d3a43321ca9a115962888c99732ceb41a +"d3-path@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-path@npm:3.1.0" + checksum: 2306f1bd9191e1eac895ec13e3064f732a85f243d6e627d242a313f9777756838a2215ea11562f0c7630c7c3b16a19ec1fe0948b1c82f3317fac55882f6ee5d8 languageName: node linkType: hard @@ -19753,11 +19982,11 @@ __metadata: linkType: hard "d3-shape@npm:^3.0.0": - version: 3.1.0 - resolution: "d3-shape@npm:3.1.0" + version: 3.2.0 + resolution: "d3-shape@npm:3.2.0" dependencies: - d3-path: 1 - 3 - checksum: 3dffe31b56feaf0817954748c9823c0e1fb6ab888b83775e9d568176ffa369546064ae49403963aac70108272988f632452634851f1c8a92805134d0c40e6dba + d3-path: ^3.1.0 + checksum: de2af5fc9a93036a7b68581ca0bfc4aca2d5a328aa7ba7064c11aedd44d24f310c20c40157cb654359d4c15c3ef369f95ee53d71221017276e34172c7b719cfa languageName: node linkType: hard @@ -20031,6 +20260,31 @@ __metadata: languageName: node linkType: hard +"deep-equal@npm:^2.0.5": + version: 2.2.0 + resolution: "deep-equal@npm:2.2.0" + dependencies: + call-bind: ^1.0.2 + es-get-iterator: ^1.1.2 + get-intrinsic: ^1.1.3 + is-arguments: ^1.1.1 + is-array-buffer: ^3.0.1 + is-date-object: ^1.0.5 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + isarray: ^2.0.5 + object-is: ^1.1.5 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + side-channel: ^1.0.4 + which-boxed-primitive: ^1.0.2 + which-collection: ^1.0.1 + which-typed-array: ^1.1.9 + checksum: 46a34509d2766d6c6dc5aec4756089cf0cc137e46787e91f08f1ee0bb570d874f19f0493146907df0cf18aed4a7b4b50f6f62c899240a76c323f057528b122e3 + languageName: node + linkType: hard + "deep-extend@npm:0.6.0, deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -20305,9 +20559,9 @@ __metadata: linkType: hard "diff@npm:^5.0.0": - version: 5.0.0 - resolution: "diff@npm:5.0.0" - checksum: f19fe29284b633afdb2725c2a8bb7d25761ea54d321d8e67987ac851c5294be4afeab532bd84531e02583a3fe7f4014aa314a3eda84f5590e7a9e6b371ef3b46 + version: 5.1.0 + resolution: "diff@npm:5.1.0" + checksum: c7bf0df7c9bfbe1cf8a678fd1b2137c4fb11be117a67bc18a0e03ae75105e8533dbfb1cda6b46beb3586ef5aed22143ef9d70713977d5fb1f9114e21455fba90 languageName: node linkType: hard @@ -20452,6 +20706,17 @@ __metadata: languageName: node linkType: hard +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: ^2.3.0 + domhandler: ^5.0.2 + entities: ^4.2.0 + checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 + languageName: node + linkType: hard + "dom-walk@npm:^0.1.0": version: 0.1.1 resolution: "dom-walk@npm:0.1.1" @@ -20466,10 +20731,10 @@ __metadata: languageName: node linkType: hard -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": - version: 2.2.0 - resolution: "domelementtype@npm:2.2.0" - checksum: 24cb386198640cd58aa36f8c987f2ea61859929106d06ffcc8f547e70cb2ed82a6dc56dcb8252b21fba1f1ea07df6e4356d60bfe57f77114ca1aed6828362629 +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 languageName: node linkType: hard @@ -20500,6 +20765,15 @@ __metadata: languageName: node linkType: hard +"domhandler@npm:^5.0.1, domhandler@npm:^5.0.2": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: ^2.3.0 + checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c + languageName: node + linkType: hard + "dompurify@npm:=2.3.10": version: 2.3.10 resolution: "dompurify@npm:2.3.10" @@ -20508,9 +20782,9 @@ __metadata: linkType: hard "dompurify@npm:^2.2.7, dompurify@npm:^2.2.9, dompurify@npm:^2.3.6": - version: 2.4.0 - resolution: "dompurify@npm:2.4.0" - checksum: c93ea73cf8e3ba044588450198563e56ce6902e36d0e16e3699df2fa59e82c4fdd11d4ad04ef5024569ce96a35b46f29d0bbea522516add33cd39a7f56a8a675 + version: 2.4.3 + resolution: "dompurify@npm:2.4.3" + checksum: b440981f2a38cada2085759cc3d1e2f94571afc34343d011a8a6aa1ad91ae6abf651adbfa4994b0e2283f0ce81f7891cdb04b67d0b234c8d190cb70e9691f026 languageName: node linkType: hard @@ -20525,6 +20799,17 @@ __metadata: languageName: node linkType: hard +"domutils@npm:^3.0.1": + version: 3.0.1 + resolution: "domutils@npm:3.0.1" + dependencies: + dom-serializer: ^2.0.0 + domelementtype: ^2.3.0 + domhandler: ^5.0.1 + checksum: 23aa7a840572d395220e173cb6263b0d028596e3950100520870a125af33ff819e6f609e1606d6f7d73bd9e7feb03bb404286e57a39063b5384c62b724d987b3 + languageName: node + linkType: hard + "dot-case@npm:^3.0.4": version: 3.0.4 resolution: "dot-case@npm:3.0.4" @@ -20549,7 +20834,7 @@ __metadata: languageName: node linkType: hard -"dset@npm:^3.1.2": +"dset@npm:3.1.2": version: 3.1.2 resolution: "dset@npm:3.1.2" checksum: 4f8066f517aa0a70af688c66e9a0a5590f0aada76f6edc7ba9ddb309e27d3a6d65c0a2e31ab2a84005d4c791e5327773cdde59b8ab169050330a0dc283663e87 @@ -20842,7 +21127,7 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.3.0, entities@npm:^4.4.0": +"entities@npm:^4.2.0, entities@npm:^4.3.0, entities@npm:^4.4.0": version: 4.4.0 resolution: "entities@npm:4.4.0" checksum: 84d250329f4b56b40fa93ed067b194db21e8815e4eb9b59f43a086f0ecd342814f6bc483de8a77da5d64e0f626033192b1b4f1792232a7ea6b970ebe0f3187c2 @@ -20902,7 +21187,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.18.0-next.1, es-abstract@npm:^1.18.0-next.2, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5, es-abstract@npm:^1.20.4": +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5, es-abstract@npm:^1.20.4": version: 1.20.4 resolution: "es-abstract@npm:1.20.4" dependencies: @@ -20934,6 +21219,22 @@ __metadata: languageName: node linkType: hard +"es-get-iterator@npm:^1.1.2": + version: 1.1.2 + resolution: "es-get-iterator@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.0 + has-symbols: ^1.0.1 + is-arguments: ^1.1.0 + is-map: ^2.0.2 + is-set: ^2.0.2 + is-string: ^1.0.5 + isarray: ^2.0.5 + checksum: f75e66acb6a45686fa08b3ade9c9421a70d36a0c43ed4363e67f4d7aab2226cb73dd977cb48abbaf75721b946d3cd810682fcf310c7ad0867802fbf929b17dcf + languageName: node + linkType: hard + "es-module-lexer@npm:^0.9.0, es-module-lexer@npm:^0.9.3": version: 0.9.3 resolution: "es-module-lexer@npm:0.9.3" @@ -21202,31 +21503,31 @@ __metadata: linkType: hard "esbuild@npm:^0.16.0": - version: 0.16.7 - resolution: "esbuild@npm:0.16.7" + version: 0.16.16 + resolution: "esbuild@npm:0.16.16" dependencies: - "@esbuild/android-arm": 0.16.7 - "@esbuild/android-arm64": 0.16.7 - "@esbuild/android-x64": 0.16.7 - "@esbuild/darwin-arm64": 0.16.7 - "@esbuild/darwin-x64": 0.16.7 - "@esbuild/freebsd-arm64": 0.16.7 - "@esbuild/freebsd-x64": 0.16.7 - "@esbuild/linux-arm": 0.16.7 - "@esbuild/linux-arm64": 0.16.7 - "@esbuild/linux-ia32": 0.16.7 - "@esbuild/linux-loong64": 0.16.7 - "@esbuild/linux-mips64el": 0.16.7 - "@esbuild/linux-ppc64": 0.16.7 - "@esbuild/linux-riscv64": 0.16.7 - "@esbuild/linux-s390x": 0.16.7 - "@esbuild/linux-x64": 0.16.7 - "@esbuild/netbsd-x64": 0.16.7 - "@esbuild/openbsd-x64": 0.16.7 - "@esbuild/sunos-x64": 0.16.7 - "@esbuild/win32-arm64": 0.16.7 - "@esbuild/win32-ia32": 0.16.7 - "@esbuild/win32-x64": 0.16.7 + "@esbuild/android-arm": 0.16.16 + "@esbuild/android-arm64": 0.16.16 + "@esbuild/android-x64": 0.16.16 + "@esbuild/darwin-arm64": 0.16.16 + "@esbuild/darwin-x64": 0.16.16 + "@esbuild/freebsd-arm64": 0.16.16 + "@esbuild/freebsd-x64": 0.16.16 + "@esbuild/linux-arm": 0.16.16 + "@esbuild/linux-arm64": 0.16.16 + "@esbuild/linux-ia32": 0.16.16 + "@esbuild/linux-loong64": 0.16.16 + "@esbuild/linux-mips64el": 0.16.16 + "@esbuild/linux-ppc64": 0.16.16 + "@esbuild/linux-riscv64": 0.16.16 + "@esbuild/linux-s390x": 0.16.16 + "@esbuild/linux-x64": 0.16.16 + "@esbuild/netbsd-x64": 0.16.16 + "@esbuild/openbsd-x64": 0.16.16 + "@esbuild/sunos-x64": 0.16.16 + "@esbuild/win32-arm64": 0.16.16 + "@esbuild/win32-ia32": 0.16.16 + "@esbuild/win32-x64": 0.16.16 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -21274,7 +21575,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 53732942109a8a22d647810d90623dd48418f49fd9d1613688585a6f81677fd8525f53658778a7b92f1124cdfbf73e6efb74385be52cf6aa11aa97f8397ec93c + checksum: d3163ec01e017776df6b68e1825caa2323918f0d03eb92250bdcdff80410a2c0eb5b3807955db84d83b1b91cf24af9815a1d19efc2343c490be3e5d7b27a834f languageName: node linkType: hard @@ -21359,13 +21660,13 @@ __metadata: linkType: hard "eslint-config-prettier@npm:^8.3.0": - version: 8.5.0 - resolution: "eslint-config-prettier@npm:8.5.0" + version: 8.6.0 + resolution: "eslint-config-prettier@npm:8.6.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 0d0f5c32e7a0ad91249467ce71ca92394ccd343178277d318baf32063b79ea90216f4c81d1065d60f96366fdc60f151d4d68ae7811a58bd37228b84c2083f893 + checksum: ff0d0dfc839a556355422293428637e8d35693de58dabf8638bf0b6529131a109d0b2ade77521aa6e54573bb842d7d9d322e465dd73dd61c7590fa3834c3fa81 languageName: node linkType: hard @@ -21451,8 +21752,8 @@ __metadata: linkType: hard "eslint-plugin-jest@npm:^27.0.0": - version: 27.1.7 - resolution: "eslint-plugin-jest@npm:27.1.7" + version: 27.2.1 + resolution: "eslint-plugin-jest@npm:27.2.1" dependencies: "@typescript-eslint/utils": ^5.10.0 peerDependencies: @@ -21463,30 +21764,33 @@ __metadata: optional: true jest: optional: true - checksum: 1173e60450d8fa7a913d654e80e26176cc64c35f287d680d6fe4187a53974fd8c6883749924c8ea2a9328e295cba4d1be0b3047492653270e9341da1a3fec580 + checksum: 579a4d26304cc6748b2e6dff6c965ea7a21b618d8b051eb02727d25cf5c7767f6db8ef5237531635ff77e242b983b973e7cb8c820a4d20d5bda73358c452a8ab languageName: node linkType: hard "eslint-plugin-jsx-a11y@npm:^6.5.1": - version: 6.6.1 - resolution: "eslint-plugin-jsx-a11y@npm:6.6.1" + version: 6.7.0 + resolution: "eslint-plugin-jsx-a11y@npm:6.7.0" dependencies: - "@babel/runtime": ^7.18.9 - aria-query: ^4.2.2 - array-includes: ^3.1.5 + "@babel/runtime": ^7.20.7 + aria-query: ^5.1.3 + array-includes: ^3.1.6 + array.prototype.flatmap: ^1.3.1 ast-types-flow: ^0.0.7 - axe-core: ^4.4.3 - axobject-query: ^2.2.0 + axe-core: ^4.6.2 + axobject-query: ^3.1.1 damerau-levenshtein: ^1.0.8 emoji-regex: ^9.2.2 has: ^1.0.3 - jsx-ast-utils: ^3.3.2 - language-tags: ^1.0.5 + jsx-ast-utils: ^3.3.3 + language-tags: =1.0.5 minimatch: ^3.1.2 + object.entries: ^1.1.6 + object.fromentries: ^2.0.6 semver: ^6.3.0 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: baae7377f0e25a0cc9b34dc333a3dc6ead9ee8365e445451eff554c3ca267a0a6cb88127fe90395c578ab1b92cfed246aef7dc8d2b48b603389e10181799e144 + checksum: b7ea212bcf84912d264229e5e3cf255bc95a1193de1c7453d275a7afc959ce679c1bffb77cfd3d17f9b7105f41e0f62c8edb7f6d76985c79647edaa9f08aa814 languageName: node linkType: hard @@ -21528,8 +21832,8 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.28.0": - version: 7.31.11 - resolution: "eslint-plugin-react@npm:7.31.11" + version: 7.32.1 + resolution: "eslint-plugin-react@npm:7.32.1" dependencies: array-includes: ^3.1.6 array.prototype.flatmap: ^1.3.1 @@ -21543,12 +21847,12 @@ __metadata: object.hasown: ^1.1.2 object.values: ^1.1.6 prop-types: ^15.8.1 - resolve: ^2.0.0-next.3 + resolve: ^2.0.0-next.4 semver: ^6.3.0 string.prototype.matchall: ^4.0.8 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: a3d612f6647bef33cf2a67c81a6b37b42c075300ed079cffecf5fb475c0d6ab855c1de340d1cbf361a0126429fb906dda597527235d2d12c4404453dbc712fc6 + checksum: e20eab61161a3db6211c2bd1eb9be3e407fd14e72c06c5f39a078b6ac37427b2af6056ee70e3954249bca0a04088ae797a0c8ba909fb8802e29712de2a41262d languageName: node linkType: hard @@ -21625,11 +21929,11 @@ __metadata: linkType: hard "eslint@npm:^8.6.0": - version: 8.29.0 - resolution: "eslint@npm:8.29.0" + version: 8.31.0 + resolution: "eslint@npm:8.31.0" dependencies: - "@eslint/eslintrc": ^1.3.3 - "@humanwhocodes/config-array": ^0.11.6 + "@eslint/eslintrc": ^1.4.1 + "@humanwhocodes/config-array": ^0.11.8 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 ajv: ^6.10.0 @@ -21648,7 +21952,7 @@ __metadata: file-entry-cache: ^6.0.1 find-up: ^5.0.0 glob-parent: ^6.0.2 - globals: ^13.15.0 + globals: ^13.19.0 grapheme-splitter: ^1.0.4 ignore: ^5.2.0 import-fresh: ^3.0.0 @@ -21669,7 +21973,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: e05204b05907b82d910983995cb946e0ba62ca514eb2b6791c43f623333b143564a2eee0139909d31c10935c21877d815b1f76dd674a59cb91c471064325c4ab + checksum: 5e5688bb864edc6b12d165849994812eefa67fb3fc44bb26f53659b63edcd8bcc68389d27cc6cc9e5b79ee22f24b6f311fa3ed047bddcafdec7d84c1b5561e4f languageName: node linkType: hard @@ -21902,6 +22206,7 @@ __metadata: "@backstage/plugin-playlist": "workspace:^" "@backstage/plugin-rollbar": "workspace:^" "@backstage/plugin-scaffolder": "workspace:^" + "@backstage/plugin-scaffolder-react": "workspace:^" "@backstage/plugin-search": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/plugin-search-react": "workspace:^" @@ -21922,12 +22227,12 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 "@octokit/rest": ^19.0.3 - "@oriflame/backstage-plugin-score-card": ^0.5.1 + "@oriflame/backstage-plugin-score-card": ^0.6.0 "@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": ^8.0.2 + "@testing-library/cypress": ^9.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -21973,6 +22278,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/integration": "workspace:^" + "@backstage/plugin-adr-backend": "workspace:^" "@backstage/plugin-app-backend": "workspace:^" "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" @@ -22014,7 +22320,7 @@ __metadata: "@types/express-serve-static-core": ^4.17.5 "@types/luxon": ^3.0.0 azure-devops-node-api: ^11.0.1 - better-sqlite3: ^7.5.0 + better-sqlite3: ^8.0.0 dockerode: ^3.3.1 example-app: "link:../app" express: ^4.17.1 @@ -22171,7 +22477,7 @@ __metadata: languageName: node linkType: hard -"express-promise-router@npm:^4.1.0": +"express-promise-router@npm:^4.1.0, express-promise-router@npm:^4.1.1": version: 4.1.1 resolution: "express-promise-router@npm:4.1.1" dependencies: @@ -22213,7 +22519,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1": +"express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1, express@npm:^4.18.2": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: @@ -22343,16 +22649,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": - version: 3.2.11 - resolution: "fast-glob@npm:3.2.11" +"fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" dependencies: "@nodelib/fs.stat": ^2.0.2 "@nodelib/fs.walk": ^1.2.3 glob-parent: ^5.1.2 merge2: ^1.3.0 micromatch: ^4.0.4 - checksum: f473105324a7780a20c06de842e15ddbb41d3cb7e71d1e4fe6e8373204f22245d54f5ab9e2061e6a1c613047345954d29b022e0e76f5c28b1df9858179a0e6d7 + checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 languageName: node linkType: hard @@ -22364,9 +22670,9 @@ __metadata: linkType: hard "fast-json-patch@npm:^3.0.0-1": - version: 3.0.0-1 - resolution: "fast-json-patch@npm:3.0.0-1" - checksum: d4a8dff174357a90f3e2b79812df4bcc179143524e7eb1ab84a3bd5a80bd283f6be53996abe5c38527aeb28e994f0d03084c9ce5fcd8eb3e2881986e991105aa + version: 3.1.1 + resolution: "fast-json-patch@npm:3.1.1" + checksum: c4525b61b2471df60d4b025b4118b036d99778a93431aa44d1084218182841d82ce93056f0f3bbd731a24e6a8e69820128adf1873eb2199a26c62ef58d137833 languageName: node linkType: hard @@ -22770,7 +23076,16 @@ __metadata: languageName: node linkType: hard -"foreach@npm:^2.0.4, foreach@npm:^2.0.5": +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + languageName: node + linkType: hard + +"foreach@npm:^2.0.4": version: 2.0.5 resolution: "foreach@npm:2.0.5" checksum: dab4fbfef0b40b69ee5eab81bcb9626b8fa8b3469c8cfa26480f3e5e1ee08c40eae07048c9a967c65aeda26e774511ccc70b3f10a604c01753c6ef24361f0fc8 @@ -22816,8 +23131,8 @@ __metadata: linkType: hard "fork-ts-checker-webpack-plugin@npm:^7.0.0-alpha.8": - version: 7.2.14 - resolution: "fork-ts-checker-webpack-plugin@npm:7.2.14" + version: 7.3.0 + resolution: "fork-ts-checker-webpack-plugin@npm:7.3.0" dependencies: "@babel/code-frame": ^7.16.7 chalk: ^4.1.2 @@ -22838,7 +23153,7 @@ __metadata: peerDependenciesMeta: vue-template-compiler: optional: true - checksum: bf4b44e606677da14c5b8127693897003607e7f13ed93a92991665aea5ad5aa3f5629c022d95dbf9380b40bfc02d34fa42857f298525c7688194d1e94f2a2850 + checksum: 49c2af801e264349a3fdf0afe4ad33065960c43bd7e56c8351a5e0d32c8c54146cc89d6a0b70b1e0f810de96787bd0c7fd275cc8727a9aea1a077c53de99659a languageName: node linkType: hard @@ -23254,13 +23569,6 @@ __metadata: languageName: node linkType: hard -"get-port@npm:^6.1.2": - version: 6.1.2 - resolution: "get-port@npm:6.1.2" - checksum: e3c3d591492a11393455ef220f24c812a28f7da56ec3e4a2512d931a1f196d42850b50ac6138349a44622eda6dc3c0ccd8495cd91376d968e2d9e6f6f849e0a9 - languageName: node - linkType: hard - "get-stdin@npm:^8.0.0": version: 8.0.0 resolution: "get-stdin@npm:8.0.0" @@ -23471,12 +23779,12 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.15.0": - version: 13.15.0 - resolution: "globals@npm:13.15.0" +"globals@npm:^13.19.0": + version: 13.19.0 + resolution: "globals@npm:13.19.0" dependencies: type-fest: ^0.20.2 - checksum: 383ade0873b2ab29ce6d143466c203ed960491575bc97406395e5c8434026fb02472ab2dfff5bc16689b8460269b18fda1047975295cd0183904385c51258bae + checksum: a000dbd00bcf28f0941d8a29c3522b1c3b8e4bfe4e60e262c477a550c3cbbe8dbe2925a6905f037acd40f9a93c039242e1f7079c76b0fd184bc41dcc3b5c8e2e languageName: node linkType: hard @@ -23534,7 +23842,7 @@ __metadata: languageName: node linkType: hard -"google-gax@npm:^3.5.1, google-gax@npm:^3.5.2": +"google-gax@npm:^3.5.2": version: 3.5.2 resolution: "google-gax@npm:3.5.2" dependencies: @@ -23577,6 +23885,15 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + "got@npm:^11.8.3": version: 11.8.5 resolution: "got@npm:11.8.5" @@ -23636,26 +23953,25 @@ __metadata: languageName: node linkType: hard -"graphql-config@npm:4.3.6": - version: 4.3.6 - resolution: "graphql-config@npm:4.3.6" +"graphql-config@npm:4.4.0": + version: 4.4.0 + resolution: "graphql-config@npm:4.4.0" dependencies: "@graphql-tools/graphql-file-loader": ^7.3.7 "@graphql-tools/json-file-loader": ^7.3.7 "@graphql-tools/load": ^7.5.5 "@graphql-tools/merge": ^8.2.6 "@graphql-tools/url-loader": ^7.9.7 - "@graphql-tools/utils": ^8.6.5 - cosmiconfig: 7.0.1 - cosmiconfig-toml-loader: 1.0.0 - cosmiconfig-typescript-loader: ^4.0.0 + "@graphql-tools/utils": ^9.0.0 + cosmiconfig: 8.0.0 minimatch: 4.2.1 string-env-interpolation: 1.0.1 - ts-node: ^10.8.1 tslib: ^2.4.0 peerDependencies: + cosmiconfig-toml-loader: ^1.0.0 + cosmiconfig-typescript-loader: ^4.0.0 graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 528f69c2c3620b51fe3d609e65d13861bdc11ccfdfcb75d476f758dc6e3047c78117a260f69b5e7efa5f0b66da1980c352a8b4053532ffb3018377f784331e21 + checksum: 2f8cbb4710a7c0a411074eb843317bc66e5602fdab7eefa9765812d986d4b04fc2d285d3c0811ed0efaef12ea58351676561d704e79880f5848ed970badab500 languageName: node linkType: hard @@ -23687,16 +24003,17 @@ __metadata: languageName: node linkType: hard -"graphql-request@npm:^4.0.0": - version: 4.2.0 - resolution: "graphql-request@npm:4.2.0" +"graphql-request@npm:^5.0.0": + version: 5.1.0 + resolution: "graphql-request@npm:5.1.0" dependencies: + "@graphql-typed-document-node/core": ^3.1.1 cross-fetch: ^3.1.5 extract-files: ^9.0.0 form-data: ^3.0.0 peerDependencies: graphql: 14 - 16 - checksum: c508705ebdbb94ce4599c9236c06993dd19481d1765b8f316c8ad6eee81c18afaaf9362fa4f6f00227f26e793b4ec38a6aea44708da0ca4a1b4324f41691bbdc + checksum: 8b65d5c1b0cad8996a843b52305b2712ffbf842c700487d4cee1ed719f22baacaacfddafb65572bcddd67d57fd1d2d389dee2430ffba4b34c3ab542d079446c7 languageName: node linkType: hard @@ -23720,7 +24037,7 @@ __metadata: languageName: node linkType: hard -"graphql-ws@npm:^5.4.1, graphql-ws@npm:^5.9.0": +"graphql-ws@npm:5.11.2, graphql-ws@npm:^5.4.1, graphql-ws@npm:^5.9.0": version: 5.11.2 resolution: "graphql-ws@npm:5.11.2" peerDependencies: @@ -24169,7 +24486,7 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:^6.0.0, htmlparser2@npm:^6.1.0": +"htmlparser2@npm:^6.1.0": version: 6.1.0 resolution: "htmlparser2@npm:6.1.0" dependencies: @@ -24181,6 +24498,18 @@ __metadata: languageName: node linkType: hard +"htmlparser2@npm:^8.0.0": + version: 8.0.1 + resolution: "htmlparser2@npm:8.0.1" + dependencies: + domelementtype: ^2.3.0 + domhandler: ^5.0.2 + domutils: ^3.0.1 + entities: ^4.3.0 + checksum: 06d5c71e8313597722bc429ae2a7a8333d77bd3ab07ccb916628384b37332027b047f8619448d8f4a3312b6609c6ea3302a4e77435d859e9e686999e6699ca39 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": version: 4.1.0 resolution: "http-cache-semantics@npm:4.1.0" @@ -24372,11 +24701,11 @@ __metadata: linkType: hard "husky@npm:^8.0.0": - version: 8.0.2 - resolution: "husky@npm:8.0.2" + version: 8.0.3 + resolution: "husky@npm:8.0.3" bin: husky: lib/bin.js - checksum: e101656fcb56163d610488f186448c78b132626aa427094489d886ce9374955a90274912b0f3a34af3326eaa74977883b032e5f701d7aaf4554daa5a7931be43 + checksum: 837bc7e4413e58c1f2946d38fb050f5d7324c6f16b0fd66411ffce5703b294bd21429e8ba58711cd331951ee86ed529c5be4f76805959ff668a337dbfa82a1b0 languageName: node linkType: hard @@ -24500,9 +24829,9 @@ __metadata: linkType: hard "immer@npm:^9.0.1, immer@npm:^9.0.7": - version: 9.0.16 - resolution: "immer@npm:9.0.16" - checksum: e9a5ca65c929b329da7a3b7beccf7984271cda7bdd47b2cab619eac3277dcd56598c211b55cc340786b6eff0c06652ac018808d9fd744443f06882364dece6bc + version: 9.0.18 + resolution: "immer@npm:9.0.18" + checksum: 85b3153dd01fce73c40591d0d6d7cd95878dab49f8ec4744c044adac05e0dab847b30c26259c478a5f87f974897be6df2780ff5bf86c8a0a27578fdeb300eb10 languageName: node linkType: hard @@ -24871,10 +25200,24 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.0.4": - version: 1.0.4 - resolution: "is-arguments@npm:1.0.4" - checksum: a40ce1580cbb28b67790afe91d9c39a9016f165e724021f2c61da016d7382a1b04a202d9d4ea1c8b5d7fda7c15144aa5c4e92ea4ed0896e2b95f4f665a966cd5 +"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.0, is-arguments@npm:^1.1.1": + version: 1.1.1 + resolution: "is-arguments@npm:1.1.1" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.1": + version: 3.0.1 + resolution: "is-array-buffer@npm:3.0.1" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-typed-array: ^1.1.10 + checksum: f26ab87448e698285daf707e52a533920449f7abf63714140ffab9d5571aa5a71ac2fa2677e8b793ad0d5d3e40078d4d2c8a0ab39c957e3cfc6513bb6c9dfdc9 languageName: node linkType: hard @@ -24936,7 +25279,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac @@ -24965,7 +25308,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.1.0, is-core-module@npm:^2.2.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": version: 2.10.0 resolution: "is-core-module@npm:2.10.0" dependencies: @@ -24974,7 +25317,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -25120,6 +25463,13 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.1, is-map@npm:^2.0.2": + version: 2.0.2 + resolution: "is-map@npm:2.0.2" + checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 + languageName: node + linkType: hard + "is-module@npm:^1.0.0": version: 1.0.0 resolution: "is-module@npm:1.0.0" @@ -25294,6 +25644,13 @@ __metadata: languageName: node linkType: hard +"is-set@npm:^2.0.1, is-set@npm:^2.0.2": + version: 2.0.2 + resolution: "is-set@npm:2.0.2" + checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 + languageName: node + linkType: hard + "is-shared-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" @@ -25360,16 +25717,16 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.3": - version: 1.1.5 - resolution: "is-typed-array@npm:1.1.5" +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.3": + version: 1.1.10 + resolution: "is-typed-array@npm:1.1.10" dependencies: - available-typed-arrays: ^1.0.2 + available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 - es-abstract: ^1.18.0-next.2 - foreach: ^2.0.5 - has-symbols: ^1.0.1 - checksum: ba435c83dc1dc0f205c0169f7e93a082816c6b261631a55e473f6f4e18fdf76c1997b326e2e63ae6139e0f75fb47d76252fc76ce75e6b2a74aa41c39743774cb + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 languageName: node linkType: hard @@ -25412,6 +25769,13 @@ __metadata: languageName: node linkType: hard +"is-weakmap@npm:^2.0.1": + version: 2.0.1 + resolution: "is-weakmap@npm:2.0.1" + checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 + languageName: node + linkType: hard + "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -25421,6 +25785,16 @@ __metadata: languageName: node linkType: hard +"is-weakset@npm:^2.0.1": + version: 2.0.2 + resolution: "is-weakset@npm:2.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + languageName: node + linkType: hard + "is-windows@npm:^1.0.0, is-windows@npm:^1.0.1": version: 1.0.2 resolution: "is-windows@npm:1.0.2" @@ -25458,6 +25832,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + "isbinaryfile@npm:^4.0.10, isbinaryfile@npm:^4.0.8": version: 4.0.10 resolution: "isbinaryfile@npm:4.0.10" @@ -25537,6 +25918,15 @@ __metadata: languageName: node linkType: hard +"isomorphic-ws@npm:5.0.0": + version: 5.0.0 + resolution: "isomorphic-ws@npm:5.0.0" + peerDependencies: + ws: "*" + checksum: e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 + languageName: node + linkType: hard + "isomorphic-ws@npm:^4.0.1": version: 4.0.1 resolution: "isomorphic-ws@npm:4.0.1" @@ -25546,15 +25936,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:^5.0.0": - version: 5.0.0 - resolution: "isomorphic-ws@npm:5.0.0" - peerDependencies: - ws: "*" - checksum: e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 - languageName: node - linkType: hard - "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -26265,9 +26646,9 @@ __metadata: linkType: hard "jose@npm:^4.10.0, jose@npm:^4.6.0": - version: 4.11.1 - resolution: "jose@npm:4.11.1" - checksum: cd15cba258d0fd20f6168631ce2e94fda8442df80e43c1033c523915cecdf390a1cc8efe0eab0c2d65935ca973d791c668aea80724d2aa9c2879d4e70f3081d7 + version: 4.11.2 + resolution: "jose@npm:4.11.2" + checksum: bc9b2271c31683603857b2fd2903afa29f826fffd4bcefc0845355ed86995def87eaadf502033207996109d76698c912e5a986e279326d9629321a50504fe466 languageName: node linkType: hard @@ -26293,9 +26674,9 @@ __metadata: linkType: hard "js-base64@npm:^3.6.0": - version: 3.7.3 - resolution: "js-base64@npm:3.7.3" - checksum: ee19bed9ba21693e4583a47773dd701938de63db82e7c324d4c19093046157f0d87905cc20540f194f1d0ec88d6e1bfc4056aea916bcb873ebcf95942d26aa5a + version: 3.7.4 + resolution: "js-base64@npm:3.7.4" + checksum: b8f6b10033b57bbb87fa34629f44bc665cb8b7bcba49610a29b296592616e633e9c186afaa02de5a54d60c08aaa36c8c8ad585db095a96fb331fe022f54792a2 languageName: node linkType: hard @@ -26746,11 +27127,11 @@ __metadata: linkType: hard "json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.0, json5@npm:^2.2.1": - version: 2.2.2 - resolution: "json5@npm:2.2.2" + version: 2.2.3 + resolution: "json5@npm:2.2.3" bin: json5: lib/cli.js - checksum: 9a878d66b72157b073cf0017f3e5d93ec209fa5943abcb38d37a54b208917c166bd473c26a24695e67a016ce65759aeb89946592991f8f9174fb96c8e2492683 + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 languageName: node linkType: hard @@ -26828,21 +27209,15 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:^8.5.1": - version: 8.5.1 - resolution: "jsonwebtoken@npm:8.5.1" +"jsonwebtoken@npm:^9.0.0": + version: 9.0.0 + resolution: "jsonwebtoken@npm:9.0.0" dependencies: jws: ^3.2.2 - lodash.includes: ^4.3.0 - lodash.isboolean: ^3.0.3 - lodash.isinteger: ^4.0.4 - lodash.isnumber: ^3.0.3 - lodash.isplainobject: ^4.0.6 - lodash.isstring: ^4.0.1 - lodash.once: ^4.0.0 + lodash: ^4.17.21 ms: ^2.1.1 - semver: ^5.6.0 - checksum: 93c9e3f23c59b758ac88ba15f4e4753b3749dfce7a6f7c40fb86663128a1e282db085eec852d4e0cbca4cefdcd3a8275ee255dbd08fcad0df26ad9f6e4cc853a + semver: ^7.3.8 + checksum: b9181cecf9df99f1dc0253f91ba000a1aa4d91f5816d1608c0dba61a5623726a0bfe200b51df25de18c1a6000825d231ad7ce2788aa54fd48dcb760ad9eb9514 languageName: node linkType: hard @@ -26957,25 +27332,25 @@ __metadata: languageName: node linkType: hard -"jss@npm:^10.5.1, jss@npm:~10.8.2": - version: 10.8.2 - resolution: "jss@npm:10.8.2" +"jss@npm:^10.5.1, jss@npm:~10.9.0": + version: 10.9.2 + resolution: "jss@npm:10.9.2" dependencies: "@babel/runtime": ^7.3.1 csstype: ^3.0.2 is-in-browser: ^1.1.3 tiny-warning: ^1.0.2 - checksum: b2647e44435e665c53eda80af2305addfea7e49c3b0c0271dc183abd8b1bb7c88bc5d77baf7bb8b2460640190eed900358fda514742d0bf4ebbc203984c879ba + checksum: 7ae5cd2f8602bf197ec90251d774b9f10d55eb2db0854ac78dc7fb6983828c202e8eb0d5c8c59c73b2f64718ebd33d6063afa799d625a995986a22dc1cc27230 languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.2": - version: 3.3.2 - resolution: "jsx-ast-utils@npm:3.3.2" +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.3": + version: 3.3.3 + resolution: "jsx-ast-utils@npm:3.3.3" dependencies: array-includes: ^3.1.5 - object.assign: ^4.1.2 - checksum: 61d4596d44480afc03ae0a7ebb272aa6603dc4c3645805dea0fc8d9f0693542cd0959f3ba7c0c9b16c13dd5a900c7c4310108bada273132a8355efe3fed22064 + object.assign: ^4.1.3 + checksum: a2ed78cac49a0f0c4be8b1eafe3c5257a1411341d8e7f1ac740debae003de04e5f6372bfcfbd9d082e954ffd99aac85bcda85b7c6bc11609992483f4cdc0f745 languageName: node linkType: hard @@ -27105,8 +27480,8 @@ __metadata: linkType: hard "knex@npm:^2.0.0": - version: 2.3.0 - resolution: "knex@npm:2.3.0" + version: 2.4.0 + resolution: "knex@npm:2.4.0" dependencies: colorette: 2.0.19 commander: ^9.1.0 @@ -27139,7 +27514,7 @@ __metadata: optional: true bin: knex: bin/cli.js - checksum: ec00da6dd622a386507881e9d8ad44b9c5a4d9f272889b181cafb856fd26d7fdb19ef009cecdbbdedaf7c76f985a8fd14348ae47a0bb77b3dbec15f2c03c0dfe + checksum: 66b4ae8412c61125b78512a66d924af95116628e16026efce4d03b80b2ced6b63208b37bb49fb52a499761da5e8981e136b48fcefcd48c3fe9fc72d9d17c5661 languageName: node linkType: hard @@ -27164,7 +27539,7 @@ __metadata: languageName: node linkType: hard -"language-tags@npm:^1.0.5": +"language-tags@npm:=1.0.5": version: 1.0.5 resolution: "language-tags@npm:1.0.5" dependencies: @@ -27613,13 +27988,6 @@ __metadata: languageName: node linkType: hard -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6 - languageName: node - linkType: hard - "lodash.isarguments@npm:^3.1.0": version: 3.1.0 resolution: "lodash.isarguments@npm:3.1.0" @@ -27627,13 +27995,6 @@ __metadata: languageName: node linkType: hard -"lodash.isboolean@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isboolean@npm:3.0.3" - checksum: b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 - languageName: node - linkType: hard - "lodash.isempty@npm:^4.4.0": version: 4.4.0 resolution: "lodash.isempty@npm:4.4.0" @@ -27648,13 +28009,6 @@ __metadata: languageName: node linkType: hard -"lodash.isinteger@npm:^4.0.4": - version: 4.0.4 - resolution: "lodash.isinteger@npm:4.0.4" - checksum: 6034821b3fc61a2ffc34e7d5644bb50c5fd8f1c0121c554c21ac271911ee0c0502274852845005f8651d51e199ee2e0cfebfe40aaa49c7fe617f603a8a0b1691 - languageName: node - linkType: hard - "lodash.isnil@npm:^4.0.0": version: 4.0.0 resolution: "lodash.isnil@npm:4.0.0" @@ -27662,13 +28016,6 @@ __metadata: languageName: node linkType: hard -"lodash.isnumber@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isnumber@npm:3.0.3" - checksum: 913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 - languageName: node - linkType: hard - "lodash.isobject@npm:^3.0.2": version: 3.0.2 resolution: "lodash.isobject@npm:3.0.2" @@ -27718,7 +28065,7 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.0.0, lodash.once@npm:^4.1.1": +"lodash.once@npm:^4.1.1": version: 4.1.1 resolution: "lodash.once@npm:4.1.1" checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 @@ -27911,17 +28258,10 @@ __metadata: languageName: node linkType: hard -"luxon@npm:^1.23.x": - version: 1.28.0 - resolution: "luxon@npm:1.28.0" - checksum: 5250cb9f138b6048eeb0b3a9044a4ac994d0058f680c72a0da4b6aeaec8612460385639cba2b1052ef6d5564879e9ed144d686f26d9d97b38ab920d82e18281c - languageName: node - linkType: hard - -"luxon@npm:^3.0.0": - version: 3.1.1 - resolution: "luxon@npm:3.1.1" - checksum: 388fb35d3c51a19d8b305a3338e7e74634b08562e7d2f9ed5c05a7f4bc9ee1c1ab6a2546b6d9c4c104516b24043757d65f5f3fe3d78b206fbf55a9586ab62230 +"luxon@npm:^3.0.0, luxon@npm:^3.2.1": + version: 3.2.1 + resolution: "luxon@npm:3.2.1" + checksum: 3fa3def2c5f5d3032b4c46220c4da8aeb467ac979888fc9d2557adcd22195f93516b4ad5909a75862bec8dc6ddc0953b0f38e6d2f4a8ab8450ddc531a83cf20d languageName: node linkType: hard @@ -28105,11 +28445,11 @@ __metadata: linkType: hard "marked@npm:^4.0.10, marked@npm:^4.0.14": - version: 4.2.4 - resolution: "marked@npm:4.2.4" + version: 4.2.12 + resolution: "marked@npm:4.2.12" bin: marked: bin/marked.js - checksum: 5eb5bfa6ee4cf85712a3ccbe2a549c397e8886f5d18312a02696c7e3817625a6b91a8ad27a6ed43b06ddbdfb812f471b1270517c4b8fb068a6a9e5b4d555a5aa + checksum: bd551cd61028ee639d4ca2ccdfcc5a6ba4227c1b143c4538f3cde27f569dcb57df8e6313560394645b418b84a7336c07ab1e438b89b6324c29d7d8cdd3102d63 languageName: node linkType: hard @@ -28436,15 +28776,15 @@ __metadata: languageName: node linkType: hard -"meros@npm:^1.1.4": - version: 1.1.4 - resolution: "meros@npm:1.1.4" +"meros@npm:1.2.1, meros@npm:^1.1.4": + version: 1.2.1 + resolution: "meros@npm:1.2.1" peerDependencies: - "@types/node": ">=12" + "@types/node": ">=13" peerDependenciesMeta: "@types/node": optional: true - checksum: f85f33ea05a0e20598f034696b477924254b742b6d81f77c8bbd7dee1f875656a3d98a1a2a988c481fef7de5c313715ee409b3cb3058ae6c4fe16a7f2fc598a3 + checksum: 2201c3f7c58ad2a5b5f7d6b1c644d79bde513e25cb64b51a8c41381ec74bc02cd3423425e34f60c96bf3991f1ec51d65dc8b8e3354cbb060cc9f8226b4666a5a languageName: node linkType: hard @@ -28958,12 +29298,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.0, minimatch@npm:^5.0.1, minimatch@npm:^5.1.0, minimatch@npm:^5.1.1": - version: 5.1.1 - resolution: "minimatch@npm:5.1.1" +"minimatch@npm:^5.0.0, minimatch@npm:^5.0.1, minimatch@npm:^5.1.0, minimatch@npm:^5.1.1, minimatch@npm:^5.1.2": + version: 5.1.2 + resolution: "minimatch@npm:5.1.2" dependencies: brace-expansion: ^2.0.1 - checksum: 215edd0978320a3354188f84a537d45841f2449af4df4379f79b9b777e71aa4f5722cc9d1717eabd2a70d38ef76ab7b708d24d83ea6a6c909dfd8833de98b437 + checksum: 32ffda25b9fb8270a1c1beafdb7489dc0e411af553495136509a945691f63c9b6b000eeeaaf8bffe3efa609c1d6d3bc0f5a106f6c3443b5c05da649100ded964 languageName: node linkType: hard @@ -29444,7 +29784,7 @@ __metadata: languageName: node linkType: hard -"nise@npm:^5.1.1, nise@npm:^5.1.2": +"nise@npm:^5.1.2": version: 5.1.2 resolution: "nise@npm:5.1.2" dependencies: @@ -29972,6 +30312,16 @@ __metadata: languageName: node linkType: hard +"object-is@npm:^1.1.5": + version: 1.1.5 + resolution: "object-is@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + checksum: 989b18c4cba258a6b74dc1d74a41805c1a1425bce29f6cabb50dcb1a6a651ea9104a1b07046739a49a5bb1bc49727bcb00efd5c55f932f6ea04ec8927a7901fe + languageName: node + linkType: hard + "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -29979,7 +30329,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": +"object.assign@npm:^4.1.0, object.assign@npm:^4.1.3, object.assign@npm:^4.1.4": version: 4.1.4 resolution: "object.assign@npm:4.1.4" dependencies: @@ -32006,11 +32356,11 @@ __metadata: linkType: hard "prom-client@npm:^14.0.1": - version: 14.1.0 - resolution: "prom-client@npm:14.1.0" + version: 14.1.1 + resolution: "prom-client@npm:14.1.1" dependencies: tdigest: ^0.1.1 - checksum: 88f8e67020c0af07d09ab8f15caaa2a3d0810b01d903d0977d82947d3b0100a539db77bcccfde0bf2449a85060475f7fb05b64e7c34951c8a54b84240ae7ae81 + checksum: 7ff3e85636b1f0ca590b38ad7c7c5f9998b985c06a1c572ffffc69f052d5b4baf84c9124923e3824c63f78b5e8400081c6472173d04382ca296ebdf36d774a88 languageName: node linkType: hard @@ -32479,20 +32829,6 @@ __metadata: languageName: node linkType: hard -"rc-progress@npm:3.4.0": - version: 3.4.0 - resolution: "rc-progress@npm:3.4.0" - 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: a4b243ee89ecbf1a6ca9b805337c7505f5020f549b43af90c691273a55e4a6ef5952e02b88391b1b08dfb39dcbe41751a31a5195582b6dda267afdce8cf9e22b - languageName: node - linkType: hard - "rc-progress@npm:3.4.1": version: 3.4.1 resolution: "rc-progress@npm:3.4.1" @@ -32866,26 +33202,26 @@ __metadata: linkType: hard "react-router-dom-stable@npm:react-router-dom@^6.3.0, react-router-dom@npm:^6.3.0": - version: 6.4.5 - resolution: "react-router-dom@npm:6.4.5" + version: 6.6.2 + resolution: "react-router-dom@npm:6.6.2" dependencies: - "@remix-run/router": 1.0.5 - react-router: 6.4.5 + "@remix-run/router": 1.2.1 + react-router: 6.6.2 peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 09d7841dd52efd2c60947171f95d9d1860cabd7540ac74dede86a6c36a2dd26a645e4928cbc8aa4e1c9d1f906f2ef144ba6da5ac69243590df855a6df8cfe1aa + checksum: e0ee89a2b3768d2eb406ecefedfa24b55428145359b4138f6d38b8a99b60a4f275418910f4cdb12c069ed0237711acced3787b0c7febfa6568d7ea9cd624ff3b languageName: node linkType: hard -"react-router-stable@npm:react-router@^6.3.0, react-router@npm:6.4.5": - version: 6.4.5 - resolution: "react-router@npm:6.4.5" +"react-router-stable@npm:react-router@^6.3.0, react-router@npm:6.6.2": + version: 6.6.2 + resolution: "react-router@npm:6.6.2" dependencies: - "@remix-run/router": 1.0.5 + "@remix-run/router": 1.2.1 peerDependencies: react: ">=16.8" - checksum: 0d471df39f0487224240f9910c2f2939519f3e9909a7b19f72767aeea2caf1c9fa4e8ea9a51b17c20051ec252db0fcc34a7a0b3068b338dd9d8eb656ffd489c1 + checksum: 5960d774bb3a8f697a57ee2e82a3eb0a300b7186a62b27e02773c94f1682e59435bd876d6162a08cc8daf27cac72aaab66d348fcc4d8f59240a63a911cf0050b languageName: node linkType: hard @@ -33388,10 +33724,10 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.13.3, regenerator-runtime@npm:^0.13.4": - version: 0.13.9 - resolution: "regenerator-runtime@npm:0.13.9" - checksum: 65ed455fe5afd799e2897baf691ca21c2772e1a969d19bb0c4695757c2d96249eb74ee3553ea34a91062b2a676beedf630b4c1551cc6299afb937be1426ec55e +"regenerator-runtime@npm:^0.13.11, regenerator-runtime@npm:^0.13.3, regenerator-runtime@npm:^0.13.4": + version: 0.13.11 + resolution: "regenerator-runtime@npm:0.13.11" + checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 languageName: node linkType: hard @@ -33719,7 +34055,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0": +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:~1.22.1": version: 1.22.1 resolution: "resolve@npm:1.22.1" dependencies: @@ -33732,13 +34068,16 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.3": - version: 2.0.0-next.3 - resolution: "resolve@npm:2.0.0-next.3" +"resolve@npm:^2.0.0-next.4": + version: 2.0.0-next.4 + resolution: "resolve@npm:2.0.0-next.4" dependencies: - is-core-module: ^2.2.0 - path-parse: ^1.0.6 - checksum: f34b3b93ada77d64a6d590c06a83e198f3a827624c4ec972260905fa6c4d612164fbf0200d16d2beefea4ad1755b001f4a9a1293d8fc2322a8f7d6bf692c4ff5 + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 languageName: node linkType: hard @@ -33761,7 +34100,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@~1.22.1#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" dependencies: @@ -33774,13 +34113,16 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.3#~builtin": - version: 2.0.0-next.3 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin::version=2.0.0-next.3&hash=07638b" +"resolve@patch:resolve@^2.0.0-next.4#~builtin": + version: 2.0.0-next.4 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=07638b" dependencies: - is-core-module: ^2.2.0 - path-parse: ^1.0.6 - checksum: 21684b4d99a4877337cdbd5484311c811b3e8910edb5d868eec85c6e6550b0f570d911f9a384f9e176172d6713f2715bd0b0887fa512cb8c6aeece018de6a9f8 + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011 languageName: node linkType: hard @@ -34736,21 +35078,7 @@ __metadata: languageName: node linkType: hard -"sinon@npm:^13.0.2": - version: 13.0.2 - resolution: "sinon@npm:13.0.2" - dependencies: - "@sinonjs/commons": ^1.8.3 - "@sinonjs/fake-timers": ^9.1.2 - "@sinonjs/samsam": ^6.1.1 - diff: ^5.0.0 - nise: ^5.1.1 - supports-color: ^7.2.0 - checksum: 237f21c8c4a8b31574c71b1b9f4c0f74a63dde5c0e86bd116effa4ce63c52467bd45fb4034a8fa32656a7919d9b19fc7b108ca9e1e6e3144f3735da96dad2877 - languageName: node - linkType: hard - -"sinon@npm:^14.0.2": +"sinon@npm:^14.0.1, sinon@npm:^14.0.2": version: 14.0.2 resolution: "sinon@npm:14.0.2" dependencies: @@ -36004,12 +36332,14 @@ __metadata: languageName: node linkType: hard -"swr@npm:^1.1.2": - version: 1.3.0 - resolution: "swr@npm:1.3.0" +"swr@npm:^2.0.0": + version: 2.0.0 + resolution: "swr@npm:2.0.0" + dependencies: + use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: e7a184f0d560e9c8be85c023cc8e65e56a88a6ed46f9394b301b07f838edca23d2e303685319a4fcd620b81d447a7bcb489c7fa0a752c259f91764903c690cdb + checksum: 4852d8318ed022a681b40a384e675f65e211104d62075c1250b02f47cc8b739cb9138a954e2191c700e2de22b010b9bd05a113c71b193abe0c351d3c4f4646d8 languageName: node linkType: hard @@ -36359,7 +36689,7 @@ __metadata: languageName: node linkType: hard -"timsort@npm:^0.3.0, timsort@npm:~0.3.0": +"timsort@npm:^0.3.0": version: 0.3.0 resolution: "timsort@npm:0.3.0" checksum: 1a66cb897dacabd7dd7c91b7e2301498ca9e224de2edb9e42d19f5b17c4b6dc62a8d4cbc64f28be82aaf1541cb5a78ab49aa818f42a2989ebe049a64af731e2a @@ -36654,17 +36984,17 @@ __metadata: languageName: node linkType: hard -"ts-morph@npm:^15.0.0": - version: 15.1.0 - resolution: "ts-morph@npm:15.1.0" +"ts-morph@npm:^17.0.0": + version: 17.0.1 + resolution: "ts-morph@npm:17.0.1" dependencies: - "@ts-morph/common": ~0.16.0 - code-block-writer: ^11.0.0 - checksum: 95e026214282850f08d1d4de673e969cdc166cb6d9366e455e1ea0251a204f80cffcb958c8ed7b1f351e56b972c4244e0dc7be0b13df3c4a6f22abdd4d4608e4 + "@ts-morph/common": ~0.18.0 + code-block-writer: ^11.0.3 + checksum: 4748ab45d0fb0be235f69399ea217cf1c5984ad2ef3ff9eba5a417571f73098c6f1f765fc011eaadc48179471b977f1e44f72eb993932e5c74c5031ab6c60f3a languageName: node linkType: hard -"ts-node@npm:^10.0.0, ts-node@npm:^10.4.0, ts-node@npm:^10.8.1, ts-node@npm:^10.9.1": +"ts-node@npm:^10.0.0, ts-node@npm:^10.4.0, ts-node@npm:^10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: @@ -36867,7 +37197,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^2.0.0, type-fest@npm:^2.19.0": +"type-fest@npm:^2.19.0": version: 2.19.0 resolution: "type-fest@npm:2.19.0" checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 @@ -36920,16 +37250,6 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~4.6.3": - version: 4.6.4 - resolution: "typescript@npm:4.6.4" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: e7bfcc39cd4571a63a54e5ea21f16b8445268b9900bf55aee0e02ad981be576acc140eba24f1af5e3c1457767c96cea6d12861768fb386cf3ffb34013718631a - languageName: node - linkType: hard - "typescript@npm:~4.7.0": version: 4.7.4 resolution: "typescript@npm:4.7.4" @@ -36940,7 +37260,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~4.8.2": +"typescript@npm:~4.8.2, typescript@npm:~4.8.4": version: 4.8.4 resolution: "typescript@npm:4.8.4" bin: @@ -36950,16 +37270,6 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@~4.6.3#~builtin": - version: 4.6.4 - resolution: "typescript@patch:typescript@npm%3A4.6.4#~builtin::version=4.6.4&hash=a1c5e5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 1cb434fbc637d347be90e3a0c6cd05e33c38f941713c8786d3031faf1842c2c148ba91d2fac01e7276b0ae3249b8633f1660e32686cc7a8c6a8fd5361dc52c66 - languageName: node - linkType: hard - "typescript@patch:typescript@~4.7.0#~builtin": version: 4.7.4 resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=a1c5e5" @@ -36970,7 +37280,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@~4.8.2#~builtin": +"typescript@patch:typescript@~4.8.2#~builtin, typescript@patch:typescript@~4.8.4#~builtin": version: 4.8.4 resolution: "typescript@patch:typescript@npm%3A4.8.4#~builtin::version=4.8.4&hash=a1c5e5" bin: @@ -37232,13 +37542,13 @@ __metadata: languageName: node linkType: hard -"universal-github-app-jwt@npm:^1.0.1": - version: 1.1.0 - resolution: "universal-github-app-jwt@npm:1.1.0" +"universal-github-app-jwt@npm:^1.1.1": + version: 1.1.1 + resolution: "universal-github-app-jwt@npm:1.1.1" dependencies: - "@types/jsonwebtoken": ^8.3.3 - jsonwebtoken: ^8.5.1 - checksum: b6ebbe2533881639701e936ca54c9ec02aae1e9b36bf2495ed66632d5057e06a7d4a118ac38a3d96f63993e19a47ee6e282858e1f4a9c2ceede19a856ca08fcc + "@types/jsonwebtoken": ^9.0.0 + jsonwebtoken: ^9.0.0 + checksum: 31d30150b9eafa9fa8bf57bd6f97d7d91d4509ad24fa673a6e29ac2295b8f1fc293a70cb44fa807af7cfd787db1cf6edd3876fc0cae31230c5292b76677159fc languageName: node linkType: hard @@ -37364,6 +37674,15 @@ __metadata: languageName: node linkType: hard +"urlpattern-polyfill@npm:^6.0.2": + version: 6.0.2 + resolution: "urlpattern-polyfill@npm:6.0.2" + dependencies: + braces: ^3.0.2 + checksum: 564fb223761b67ea76d015f11dfec145db98c71cc35641015d1c9ec164da494b1fab614e652a844e14a72cda31236b9c3a59b22fdcca71166c315ab059fab676 + languageName: node + linkType: hard + "use-deep-compare-effect@npm:^1.8.1": version: 1.8.1 resolution: "use-deep-compare-effect@npm:1.8.1" @@ -37376,13 +37695,13 @@ __metadata: languageName: node linkType: hard -"use-immer@npm:^0.7.0": - version: 0.7.0 - resolution: "use-immer@npm:0.7.0" +"use-immer@npm:^0.8.0": + version: 0.8.1 + resolution: "use-immer@npm:0.8.1" peerDependencies: immer: ">=2.0.0" react: ^16.8.0 || ^17.0.1 || ^18.0.0 - checksum: 4711403fa2c3648c06b8e6795433eb43adb2c6e9bd00f45971ce6948ba8fc1c3e3cf73820a8d597b22979caa6445d0b791508e147975c3cc435a1ec1e5ce47db + checksum: 9ffc1a201a92b6b026c420718e6a00e72ba48b62420bb515927b379bb1d791b5b4766b57c755b4851c0e1f80000e639bc1cf8e73424e44466741c159391d35dd languageName: node linkType: hard @@ -37625,13 +37944,20 @@ __metadata: languageName: node linkType: hard -"value-or-promise@npm:1.0.11, value-or-promise@npm:^1.0.11": +"value-or-promise@npm:1.0.11": version: 1.0.11 resolution: "value-or-promise@npm:1.0.11" checksum: 13f8f2ef620118c73b4d1beee8ce6045d7182bbf15090ecfbcafb677ec43698506a5e9ace6bea5ea35c32bc612c9b1f824bb59b6581cdfb5c919052745c277d5 languageName: node linkType: hard +"value-or-promise@npm:1.0.12, value-or-promise@npm:^1.0.11": + version: 1.0.12 + resolution: "value-or-promise@npm:1.0.12" + checksum: f53a66c75b7447c90bbaf946a757ca09c094629cb80ba742f59c980ec3a69be0a385a0e75505dedb4e757862f1a994ca4beaf083a831f24d3ffb3d4bb18cd1e1 + languageName: node + linkType: hard + "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -38123,6 +38449,18 @@ __metadata: languageName: node linkType: hard +"which-collection@npm:^1.0.1": + version: 1.0.1 + resolution: "which-collection@npm:1.0.1" + dependencies: + is-map: ^2.0.1 + is-set: ^2.0.1 + is-weakmap: ^2.0.1 + is-weakset: ^2.0.1 + checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + languageName: node + linkType: hard + "which-module@npm:^1.0.0": version: 1.0.0 resolution: "which-module@npm:1.0.0" @@ -38147,18 +38485,17 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.2": - version: 1.1.4 - resolution: "which-typed-array@npm:1.1.4" +"which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": + version: 1.1.9 + resolution: "which-typed-array@npm:1.1.9" dependencies: - available-typed-arrays: ^1.0.2 - call-bind: ^1.0.0 - es-abstract: ^1.18.0-next.1 - foreach: ^2.0.5 - function-bind: ^1.1.1 - has-symbols: ^1.0.1 - is-typed-array: ^1.1.3 - checksum: 369597a623b0e446eb7b6ce9e2f515c2f6a0b3f5040b9c592d9ed07fb3357a90ab45311230f7e687cf0f0d410b47e98fba620dbb7eece9f556309a3448b4fa3e + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + is-typed-array: ^1.1.10 + checksum: fe0178ca44c57699ca2c0e657b64eaa8d2db2372a4e2851184f568f98c478ae3dc3fdb5f7e46c384487046b0cf9e23241423242b277e03e8ba3dabc7c84c98ef languageName: node linkType: hard @@ -38306,7 +38643,22 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.8.1, ws@npm:^8.3.0, ws@npm:^8.4.2, ws@npm:^8.8.0": +"ws@npm:8.11.0, ws@npm:^8.4.2, ws@npm:^8.8.0": + version: 8.11.0 + resolution: "ws@npm:8.11.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 316b33aba32f317cd217df66dbfc5b281a2f09ff36815de222bc859e3424d83766d9eb2bd4d667de658b6ab7be151f258318fb1da812416b30be13103e5b5c67 + languageName: node + linkType: hard + +"ws@npm:8.8.1": version: 8.8.1 resolution: "ws@npm:8.8.1" peerDependencies: @@ -38827,6 +39179,22 @@ __metadata: languageName: node linkType: hard +"zen-observable-ts@npm:^1.1.0": + version: 1.2.5 + resolution: "zen-observable-ts@npm:1.2.5" + dependencies: + zen-observable: 0.8.15 + checksum: 3b707b7a0239a9bc40f73ba71b27733a689a957c1f364fabb9fa9cbd7d04b7c2faf0d517bf17004e3ed3f4330ac613e84c0d32313e450ddaa046f3350af44541 + languageName: node + linkType: hard + +"zen-observable@npm:0.8.15": + version: 0.8.15 + resolution: "zen-observable@npm:0.8.15" + checksum: b7289084bc1fc74a559b7259faa23d3214b14b538a8843d2b001a35e27147833f4107590b1b44bf5bc7f6dfe6f488660d3a3725f268e09b3925b3476153b7821 + languageName: node + linkType: hard + "zen-observable@npm:^0.10.0": version: 0.10.0 resolution: "zen-observable@npm:0.10.0" @@ -38834,13 +39202,6 @@ __metadata: languageName: node linkType: hard -"zen-observable@npm:^0.8.15": - version: 0.8.15 - resolution: "zen-observable@npm:0.8.15" - checksum: b7289084bc1fc74a559b7259faa23d3214b14b538a8843d2b001a35e27147833f4107590b1b44bf5bc7f6dfe6f488660d3a3725f268e09b3925b3476153b7821 - languageName: node - linkType: hard - "zenscroll@npm:^4.0.2": version: 4.0.2 resolution: "zenscroll@npm:4.0.2" @@ -38868,7 +39229,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.11.6, zod@npm:~3.18.0": +"zod@npm:~3.18.0": version: 3.18.0 resolution: "zod@npm:3.18.0" checksum: 86a9a9928f4b40a07020d4b9832842fa4a70050c2d7bd1b2866bc1acfd734aa53a40f87a99a4312a637341a608b0105770c7a1f83b56df78e97691b4f5badcd8