diff --git a/.changeset/afraid-mangos-sip.md b/.changeset/afraid-mangos-sip.md
deleted file mode 100644
index 5cf1b72dc5..0000000000
--- a/.changeset/afraid-mangos-sip.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-kubernetes': patch
----
-
-Add support to fetch data for Stateful Sets and display an accordion in the same way as with Deployments
diff --git a/.changeset/beige-deers-remember.md b/.changeset/beige-deers-remember.md
deleted file mode 100644
index 4fcba4f0c6..0000000000
--- a/.changeset/beige-deers-remember.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-cost-insights': patch
----
-
-Add missing `export` in configuration schema.
diff --git a/.changeset/beige-horses-scream.md b/.changeset/beige-horses-scream.md
new file mode 100644
index 0000000000..2034491108
--- /dev/null
+++ b/.changeset/beige-horses-scream.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-github-pull-requests-board': patch
+---
+
+Fix bug on fetching teams repositories where were being filtered by type service unnecessarily
diff --git a/.changeset/blue-roses-give.md b/.changeset/blue-roses-give.md
deleted file mode 100644
index 2479c33e46..0000000000
--- a/.changeset/blue-roses-give.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/plugin-catalog-react': patch
----
-
-Accessibility updates:
-
-- Wrapped the `EntityLifecyclePicker`, `EntityOwnerPicker`, `EntityTagPicker`, in `label` elements
-- Changed group name `Typography` component to `span` (from default `h6`), added `aria-label` to the `List` component, and `role` of `menuitem` to the container of the `MenuItem` component
diff --git a/.changeset/chilled-mirrors-grab.md b/.changeset/chilled-mirrors-grab.md
new file mode 100644
index 0000000000..ecc95680e2
--- /dev/null
+++ b/.changeset/chilled-mirrors-grab.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+Fix parsing of S3 URLs for the default region.
diff --git a/.changeset/curvy-weeks-matter.md b/.changeset/curvy-weeks-matter.md
new file mode 100644
index 0000000000..a0a9c43076
--- /dev/null
+++ b/.changeset/curvy-weeks-matter.md
@@ -0,0 +1,8 @@
+---
+'@backstage/backend-common': patch
+'@backstage/catalog-model': patch
+'@backstage/core-components': patch
+'@backstage/plugin-techdocs-react': patch
+---
+
+Updated JSDoc to be MDX compatible.
diff --git a/.changeset/eleven-mice-collect.md b/.changeset/eleven-mice-collect.md
new file mode 100644
index 0000000000..66c4591d8e
--- /dev/null
+++ b/.changeset/eleven-mice-collect.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': minor
+---
+
+Added a new `/v2/dry-run` endpoint that allows for a synchronous dry run of a provided template. A `supportsDryRun` option has been added to `createTemplateAction`, which signals whether the action should be executed during dry runs. When enabled, the action context will have the new `isDryRun` property set to signal if the action is being executed during a dry run.
diff --git a/.changeset/fluffy-candles-learn.md b/.changeset/fluffy-candles-learn.md
deleted file mode 100644
index 6fe3f1e09b..0000000000
--- a/.changeset/fluffy-candles-learn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-Updates the `isKind`, `รฌsComponentType`, and `isNamespace` to allow an array of possible values
diff --git a/.changeset/fresh-items-punch.md b/.changeset/fresh-items-punch.md
deleted file mode 100644
index 1893dc7661..0000000000
--- a/.changeset/fresh-items-punch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated Lockfile to support new versions of yarn as well as the legacy 1 version
diff --git a/.changeset/funny-suns-pay.md b/.changeset/funny-suns-pay.md
deleted file mode 100644
index b736d34cc1..0000000000
--- a/.changeset/funny-suns-pay.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-tasks': patch
----
-
-Allow tasks that fail to retry on a loop emitting a warning log every time it fails with the amount of attempts it has
diff --git a/.changeset/great-roses-pump.md b/.changeset/great-roses-pump.md
new file mode 100644
index 0000000000..16a49bd464
--- /dev/null
+++ b/.changeset/great-roses-pump.md
@@ -0,0 +1,23 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as `white`.
+
+This was an issue for themes that use a header with a white background. By default, the color of the icon is now `theme.palette.bursts.fontColor`.
+
+It can now also be overridden in the theme, which is only necessary if the header title, subtitle and three-dots icon need to have different colors. For example:
+
+```typescript
+export function createThemeOverrides(theme: BackstageTheme): Overrides {
+ return {
+ PluginCatalogEntityContextMenu: {
+ button: {
+ color: 'blue',
+ },
+ },
+ ...
+ },
+ ...
+ }
+```
diff --git a/.changeset/large-kangaroos-poke.md b/.changeset/large-kangaroos-poke.md
new file mode 100644
index 0000000000..3a9444cfa1
--- /dev/null
+++ b/.changeset/large-kangaroos-poke.md
@@ -0,0 +1,13 @@
+---
+'@backstage/create-app': patch
+---
+
+Added an explicit `node-gyp` dependency to the root `package.json`. This is to work around a bug in older versions of `node-gyp` that causes Python execution to fail on macOS.
+
+You can add this workaround to your existing project by adding `node-gyp` as a `devDependency` in your root `package.json` file:
+
+```diff
+ "devDependencies": {
++ "node-gyp": "^9.0.0"
+ },
+```
diff --git a/.changeset/loud-jars-kick.md b/.changeset/loud-jars-kick.md
deleted file mode 100644
index b53006f7f9..0000000000
--- a/.changeset/loud-jars-kick.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-allure': patch
----
-
-Add export for `isAllureReportAvailable` and `ALLURE_PROJECT_ID_ANNOTATION` so it can be used outside of plugin
diff --git a/.changeset/loud-walls-itch.md b/.changeset/loud-walls-itch.md
deleted file mode 100644
index eff8c8b5c6..0000000000
--- a/.changeset/loud-walls-itch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Updated the `--version` flag to output the version of the current backstage release instead of the version of create-app.
diff --git a/.changeset/modern-ducks-lay.md b/.changeset/modern-ducks-lay.md
new file mode 100644
index 0000000000..bd62c309ba
--- /dev/null
+++ b/.changeset/modern-ducks-lay.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-stack-overflow': patch
+---
+
+- Publicly exports `StackOverflowIcon`.
+- `HomePageStackOverflowQuestions` accepts optional icon property.
diff --git a/.changeset/nasty-zoos-cross.md b/.changeset/nasty-zoos-cross.md
new file mode 100644
index 0000000000..7a658d7209
--- /dev/null
+++ b/.changeset/nasty-zoos-cross.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-github-pull-requests-board': patch
+---
+
+Support namespaced teams and fetch all kinds
diff --git a/.changeset/nervous-gorillas-approve.md b/.changeset/nervous-gorillas-approve.md
deleted file mode 100644
index 8c0d742b7b..0000000000
--- a/.changeset/nervous-gorillas-approve.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-aws': patch
-'@backstage/plugin-catalog-backend-module-gerrit': patch
----
-
-Inline config interfaces
diff --git a/.changeset/nervous-humans-sip.md b/.changeset/nervous-humans-sip.md
new file mode 100644
index 0000000000..aa1ca2c60a
--- /dev/null
+++ b/.changeset/nervous-humans-sip.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-app-api': patch
+---
+
+The `signOut` method of the `IdentityApi` will now navigate the user back to the base URL of the app as indicated by the `app.baseUrl` config.
diff --git a/.changeset/olive-rats-rest.md b/.changeset/olive-rats-rest.md
deleted file mode 100644
index 46e76f7c17..0000000000
--- a/.changeset/olive-rats-rest.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Accessibility updates:
-
-- Added `aria-label` to the sidebar Logo link. To enable this for an existing app, please make the following changes:
-
-`packages/app/src/components/Root/Root.tsx`
-
-```diff
-const SidebarLogo = () => {
- const classes = useSidebarLogoStyles();
- const { isOpen } = useContext(SidebarContext);
-
- return (
-
-
- {isOpen ? : }
-
-
- );
-};
-```
diff --git a/.changeset/plenty-garlics-shop.md b/.changeset/plenty-garlics-shop.md
deleted file mode 100644
index cccbae0109..0000000000
--- a/.changeset/plenty-garlics-shop.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-kubernetes-common': minor
----
-
-Add support to fetch data for Stateful Sets
diff --git a/.changeset/polite-eagles-invite.md b/.changeset/polite-eagles-invite.md
new file mode 100644
index 0000000000..f9c5073a83
--- /dev/null
+++ b/.changeset/polite-eagles-invite.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-scaffolder': minor
+---
+
+A new template editor has been added which is accessible via the context menu on the top right hand corner of the Create page. It allows you to load a template from a local directory, edit it with a preview, execute it in dry-run mode, and view the results. Note that the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API) must be supported by your browser for this to be available.
+
+To support the new template editor the `ScaffolderApi` now has an optional `dryRun` method, which is implemented by the default `ScaffolderClient`.
diff --git a/.changeset/polite-spiders-pay.md b/.changeset/polite-spiders-pay.md
deleted file mode 100644
index 41528aff6b..0000000000
--- a/.changeset/polite-spiders-pay.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-backend': patch
----
-
-Added configurable algorithm field for TokenFactory
diff --git a/.changeset/pre.json b/.changeset/pre.json
index aff34f172d..500bf4ac83 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -2,157 +2,161 @@
"mode": "pre",
"tag": "next",
"initialVersions": {
- "example-app": "0.2.71",
- "@backstage/app-defaults": "1.0.2",
- "example-backend": "0.2.71",
- "@backstage/backend-common": "0.13.3",
- "@backstage/backend-tasks": "0.3.1",
- "@backstage/backend-test-utils": "0.1.24",
- "@backstage/catalog-client": "1.0.2",
- "@backstage/catalog-model": "1.0.2",
- "@backstage/cli": "0.17.1",
+ "example-app": "0.2.72",
+ "@backstage/app-defaults": "1.0.3",
+ "example-backend": "0.2.72",
+ "@backstage/backend-common": "0.14.0",
+ "@backstage/backend-tasks": "0.3.2",
+ "@backstage/backend-test-utils": "0.1.25",
+ "@backstage/catalog-client": "1.0.3",
+ "@backstage/catalog-model": "1.0.3",
+ "@backstage/cli": "0.17.2",
"@backstage/cli-common": "0.1.9",
"@backstage/codemods": "0.1.38",
"@backstage/config": "1.0.1",
- "@backstage/config-loader": "1.1.1",
- "@backstage/core-app-api": "1.0.2",
- "@backstage/core-components": "0.9.4",
- "@backstage/core-plugin-api": "1.0.2",
- "@backstage/create-app": "0.4.27",
- "@backstage/dev-utils": "1.0.2",
+ "@backstage/config-loader": "1.1.2",
+ "@backstage/core-app-api": "1.0.3",
+ "@backstage/core-components": "0.9.5",
+ "@backstage/core-plugin-api": "1.0.3",
+ "@backstage/create-app": "0.4.28",
+ "@backstage/dev-utils": "1.0.3",
"e2e-test": "0.2.0",
"@backstage/errors": "1.0.0",
- "@backstage/integration": "1.2.0",
- "@backstage/integration-react": "1.1.0",
- "@backstage/release-manifests": "0.0.3",
- "@backstage/search-common": "0.3.4",
- "@techdocs/cli": "1.1.1",
- "techdocs-cli-embedded-app": "0.2.70",
- "@backstage/techdocs-common": "0.11.15",
- "@backstage/test-utils": "1.1.0",
+ "@backstage/integration": "1.2.1",
+ "@backstage/integration-react": "1.1.1",
+ "@backstage/release-manifests": "0.0.4",
+ "@techdocs/cli": "1.1.2",
+ "techdocs-cli-embedded-app": "0.2.71",
+ "@backstage/test-utils": "1.1.1",
"@backstage/theme": "0.2.15",
"@backstage/types": "1.0.0",
"@backstage/version-bridge": "1.0.1",
- "@backstage/plugin-adr": "0.1.0",
- "@backstage/plugin-adr-backend": "0.1.0",
- "@backstage/plugin-adr-common": "0.1.0",
- "@backstage/plugin-airbrake": "0.3.5",
- "@backstage/plugin-airbrake-backend": "0.2.5",
- "@backstage/plugin-allure": "0.1.21",
- "@backstage/plugin-analytics-module-ga": "0.1.16",
- "@backstage/plugin-apache-airflow": "0.1.13",
- "@backstage/plugin-api-docs": "0.8.5",
- "@backstage/plugin-app-backend": "0.3.32",
- "@backstage/plugin-auth-backend": "0.14.0",
- "@backstage/plugin-auth-node": "0.2.1",
- "@backstage/plugin-azure-devops": "0.1.21",
- "@backstage/plugin-azure-devops-backend": "0.3.11",
+ "@backstage/plugin-adr": "0.1.1",
+ "@backstage/plugin-adr-backend": "0.1.1",
+ "@backstage/plugin-adr-common": "0.1.1",
+ "@backstage/plugin-airbrake": "0.3.6",
+ "@backstage/plugin-airbrake-backend": "0.2.6",
+ "@backstage/plugin-allure": "0.1.22",
+ "@backstage/plugin-analytics-module-ga": "0.1.17",
+ "@backstage/plugin-apache-airflow": "0.1.14",
+ "@backstage/plugin-api-docs": "0.8.6",
+ "@backstage/plugin-app-backend": "0.3.33",
+ "@backstage/plugin-auth-backend": "0.14.1",
+ "@backstage/plugin-auth-node": "0.2.2",
+ "@backstage/plugin-azure-devops": "0.1.22",
+ "@backstage/plugin-azure-devops-backend": "0.3.12",
"@backstage/plugin-azure-devops-common": "0.2.3",
- "@backstage/plugin-badges": "0.2.29",
- "@backstage/plugin-badges-backend": "0.1.26",
- "@backstage/plugin-bazaar": "0.1.20",
- "@backstage/plugin-bazaar-backend": "0.1.16",
- "@backstage/plugin-bitrise": "0.1.32",
- "@backstage/plugin-catalog": "1.2.0",
- "@backstage/plugin-catalog-backend": "1.1.2",
- "@backstage/plugin-catalog-backend-module-aws": "0.1.5",
- "@backstage/plugin-catalog-backend-module-azure": "0.1.3",
- "@backstage/plugin-catalog-backend-module-bitbucket": "0.1.3",
- "@backstage/plugin-catalog-backend-module-gerrit": "0.1.0",
- "@backstage/plugin-catalog-backend-module-github": "0.1.3",
- "@backstage/plugin-catalog-backend-module-gitlab": "0.1.3",
- "@backstage/plugin-catalog-backend-module-ldap": "0.4.3",
- "@backstage/plugin-catalog-backend-module-msgraph": "0.3.2",
- "@backstage/plugin-catalog-common": "1.0.2",
- "@backstage/plugin-catalog-graph": "0.2.17",
- "@backstage/plugin-catalog-graphql": "0.3.9",
- "@backstage/plugin-catalog-import": "0.8.8",
- "@backstage/plugin-catalog-react": "1.1.0",
- "@backstage/plugin-cicd-statistics": "0.1.7",
- "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.1",
- "@backstage/plugin-circleci": "0.3.5",
- "@backstage/plugin-cloudbuild": "0.3.5",
- "@backstage/plugin-code-climate": "0.1.5",
- "@backstage/plugin-code-coverage": "0.1.32",
- "@backstage/plugin-code-coverage-backend": "0.1.30",
- "@backstage/plugin-codescene": "0.1.0",
- "@backstage/plugin-config-schema": "0.1.28",
- "@backstage/plugin-cost-insights": "0.11.27",
- "@internal/plugin-todo-list": "1.0.1",
- "@internal/plugin-todo-list-backend": "1.0.1",
- "@internal/plugin-todo-list-common": "1.0.1",
- "@backstage/plugin-explore": "0.3.36",
- "@backstage/plugin-explore-react": "0.0.17",
- "@backstage/plugin-firehydrant": "0.1.22",
- "@backstage/plugin-fossa": "0.2.37",
- "@backstage/plugin-gcalendar": "0.3.1",
- "@backstage/plugin-gcp-projects": "0.3.24",
- "@backstage/plugin-git-release-manager": "0.3.18",
- "@backstage/plugin-github-actions": "0.5.5",
- "@backstage/plugin-github-deployments": "0.1.36",
- "@backstage/plugin-gitops-profiles": "0.3.23",
- "@backstage/plugin-gocd": "0.1.11",
- "@backstage/plugin-graphiql": "0.2.37",
- "@backstage/plugin-graphql-backend": "0.1.22",
- "@backstage/plugin-home": "0.4.21",
- "@backstage/plugin-ilert": "0.1.31",
- "@backstage/plugin-jenkins": "0.7.4",
- "@backstage/plugin-jenkins-backend": "0.1.22",
- "@backstage/plugin-jenkins-common": "0.1.4",
- "@backstage/plugin-kafka": "0.3.5",
- "@backstage/plugin-kafka-backend": "0.2.25",
- "@backstage/plugin-kubernetes": "0.6.5",
- "@backstage/plugin-kubernetes-backend": "0.5.1",
- "@backstage/plugin-kubernetes-common": "0.2.10",
- "@backstage/plugin-lighthouse": "0.3.5",
- "@backstage/plugin-newrelic": "0.3.23",
- "@backstage/plugin-newrelic-dashboard": "0.1.13",
- "@backstage/plugin-org": "0.5.5",
- "@backstage/plugin-pagerduty": "0.3.32",
- "@backstage/plugin-periskop": "0.1.3",
- "@backstage/plugin-periskop-backend": "0.1.3",
- "@backstage/plugin-permission-backend": "0.5.7",
- "@backstage/plugin-permission-common": "0.6.1",
- "@backstage/plugin-permission-node": "0.6.1",
- "@backstage/plugin-permission-react": "0.4.1",
- "@backstage/plugin-proxy-backend": "0.2.26",
- "@backstage/plugin-rollbar": "0.4.5",
- "@backstage/plugin-rollbar-backend": "0.1.29",
- "@backstage/plugin-scaffolder": "1.2.0",
- "@backstage/plugin-scaffolder-backend": "1.2.0",
- "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.7",
- "@backstage/plugin-scaffolder-backend-module-rails": "0.4.0",
- "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.5",
- "@backstage/plugin-scaffolder-common": "1.1.0",
- "@backstage/plugin-search": "0.8.1",
- "@backstage/plugin-search-backend": "0.5.2",
- "@backstage/plugin-search-backend-module-elasticsearch": "0.1.4",
- "@backstage/plugin-search-backend-module-pg": "0.3.3",
- "@backstage/plugin-search-backend-node": "0.6.1",
- "@backstage/plugin-search-common": "0.3.4",
- "@backstage/plugin-search-react": "0.2.0",
- "@backstage/plugin-sentry": "0.3.43",
- "@backstage/plugin-shortcuts": "0.2.6",
- "@backstage/plugin-sonarqube": "0.3.5",
- "@backstage/plugin-splunk-on-call": "0.3.29",
- "@backstage/plugin-stack-overflow": "0.1.1",
- "@backstage/plugin-stack-overflow-backend": "0.1.1",
- "@backstage/plugin-tech-insights": "0.2.1",
- "@backstage/plugin-tech-insights-backend": "0.4.0",
- "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.16",
+ "@backstage/plugin-badges": "0.2.30",
+ "@backstage/plugin-badges-backend": "0.1.27",
+ "@backstage/plugin-bazaar": "0.1.21",
+ "@backstage/plugin-bazaar-backend": "0.1.17",
+ "@backstage/plugin-bitbucket-cloud-common": "0.1.0",
+ "@backstage/plugin-bitrise": "0.1.33",
+ "@backstage/plugin-catalog": "1.3.0",
+ "@backstage/plugin-catalog-backend": "1.2.0",
+ "@backstage/plugin-catalog-backend-module-aws": "0.1.6",
+ "@backstage/plugin-catalog-backend-module-azure": "0.1.4",
+ "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.0",
+ "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.0",
+ "@backstage/plugin-catalog-backend-module-gerrit": "0.1.1",
+ "@backstage/plugin-catalog-backend-module-github": "0.1.4",
+ "@backstage/plugin-catalog-backend-module-gitlab": "0.1.4",
+ "@backstage/plugin-catalog-backend-module-ldap": "0.5.0",
+ "@backstage/plugin-catalog-backend-module-msgraph": "0.3.3",
+ "@backstage/plugin-catalog-common": "1.0.3",
+ "@backstage/plugin-catalog-graph": "0.2.18",
+ "@backstage/plugin-catalog-graphql": "0.3.10",
+ "@backstage/plugin-catalog-import": "0.8.9",
+ "@backstage/plugin-catalog-react": "1.1.1",
+ "@backstage/plugin-cicd-statistics": "0.1.8",
+ "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.2",
+ "@backstage/plugin-circleci": "0.3.6",
+ "@backstage/plugin-cloudbuild": "0.3.6",
+ "@backstage/plugin-code-climate": "0.1.6",
+ "@backstage/plugin-code-coverage": "0.1.33",
+ "@backstage/plugin-code-coverage-backend": "0.1.31",
+ "@backstage/plugin-codescene": "0.1.1",
+ "@backstage/plugin-config-schema": "0.1.29",
+ "@backstage/plugin-cost-insights": "0.11.28",
+ "@backstage/plugin-dynatrace": "0.1.0",
+ "@internal/plugin-todo-list": "1.0.2",
+ "@internal/plugin-todo-list-backend": "1.0.2",
+ "@internal/plugin-todo-list-common": "1.0.2",
+ "@backstage/plugin-explore": "0.3.37",
+ "@backstage/plugin-explore-react": "0.0.18",
+ "@backstage/plugin-firehydrant": "0.1.23",
+ "@backstage/plugin-fossa": "0.2.38",
+ "@backstage/plugin-gcalendar": "0.3.2",
+ "@backstage/plugin-gcp-projects": "0.3.25",
+ "@backstage/plugin-git-release-manager": "0.3.19",
+ "@backstage/plugin-github-actions": "0.5.6",
+ "@backstage/plugin-github-deployments": "0.1.37",
+ "@backstage/plugin-github-pull-requests-board": "0.1.0",
+ "@backstage/plugin-gitops-profiles": "0.3.24",
+ "@backstage/plugin-gocd": "0.1.12",
+ "@backstage/plugin-graphiql": "0.2.38",
+ "@backstage/plugin-graphql-backend": "0.1.23",
+ "@backstage/plugin-home": "0.4.22",
+ "@backstage/plugin-ilert": "0.1.32",
+ "@backstage/plugin-jenkins": "0.7.5",
+ "@backstage/plugin-jenkins-backend": "0.1.23",
+ "@backstage/plugin-jenkins-common": "0.1.5",
+ "@backstage/plugin-kafka": "0.3.6",
+ "@backstage/plugin-kafka-backend": "0.2.26",
+ "@backstage/plugin-kubernetes": "0.6.6",
+ "@backstage/plugin-kubernetes-backend": "0.6.0",
+ "@backstage/plugin-kubernetes-common": "0.3.0",
+ "@backstage/plugin-lighthouse": "0.3.6",
+ "@backstage/plugin-newrelic": "0.3.24",
+ "@backstage/plugin-newrelic-dashboard": "0.1.14",
+ "@backstage/plugin-org": "0.5.6",
+ "@backstage/plugin-pagerduty": "0.4.0",
+ "@backstage/plugin-periskop": "0.1.4",
+ "@backstage/plugin-periskop-backend": "0.1.4",
+ "@backstage/plugin-permission-backend": "0.5.8",
+ "@backstage/plugin-permission-common": "0.6.2",
+ "@backstage/plugin-permission-node": "0.6.2",
+ "@backstage/plugin-permission-react": "0.4.2",
+ "@backstage/plugin-proxy-backend": "0.2.27",
+ "@backstage/plugin-rollbar": "0.4.6",
+ "@backstage/plugin-rollbar-backend": "0.1.30",
+ "@backstage/plugin-scaffolder": "1.3.0",
+ "@backstage/plugin-scaffolder-backend": "1.3.0",
+ "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.8",
+ "@backstage/plugin-scaffolder-backend-module-rails": "0.4.1",
+ "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.6",
+ "@backstage/plugin-scaffolder-common": "1.1.1",
+ "@backstage/plugin-search": "0.9.0",
+ "@backstage/plugin-search-backend": "0.5.3",
+ "@backstage/plugin-search-backend-module-elasticsearch": "0.1.5",
+ "@backstage/plugin-search-backend-module-pg": "0.3.4",
+ "@backstage/plugin-search-backend-node": "0.6.2",
+ "@backstage/plugin-search-common": "0.3.5",
+ "@backstage/plugin-search-react": "0.2.1",
+ "@backstage/plugin-sentry": "0.3.44",
+ "@backstage/plugin-shortcuts": "0.2.7",
+ "@backstage/plugin-sonarqube": "0.3.6",
+ "@backstage/plugin-splunk-on-call": "0.3.30",
+ "@backstage/plugin-stack-overflow": "0.1.2",
+ "@backstage/plugin-stack-overflow-backend": "0.1.2",
+ "@backstage/plugin-tech-insights": "0.2.2",
+ "@backstage/plugin-tech-insights-backend": "0.4.1",
+ "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.17",
"@backstage/plugin-tech-insights-common": "0.2.4",
- "@backstage/plugin-tech-insights-node": "0.3.0",
- "@backstage/plugin-tech-radar": "0.5.12",
- "@backstage/plugin-techdocs": "1.1.1",
- "@backstage/plugin-techdocs-addons-test-utils": "1.0.0",
- "@backstage/plugin-techdocs-backend": "1.1.1",
- "@backstage/plugin-techdocs-module-addons-contrib": "1.0.0",
- "@backstage/plugin-techdocs-node": "1.1.1",
- "@backstage/plugin-techdocs-react": "1.0.0",
- "@backstage/plugin-todo": "0.2.7",
- "@backstage/plugin-todo-backend": "0.1.29",
- "@backstage/plugin-user-settings": "0.4.4",
- "@backstage/plugin-xcmetrics": "0.2.25"
+ "@backstage/plugin-tech-insights-node": "0.3.1",
+ "@backstage/plugin-tech-radar": "0.5.13",
+ "@backstage/plugin-techdocs": "1.2.0",
+ "@backstage/plugin-techdocs-addons-test-utils": "1.0.1",
+ "@backstage/plugin-techdocs-backend": "1.1.2",
+ "@backstage/plugin-techdocs-module-addons-contrib": "1.0.1",
+ "@backstage/plugin-techdocs-node": "1.1.2",
+ "@backstage/plugin-techdocs-react": "1.0.1",
+ "@backstage/plugin-todo": "0.2.8",
+ "@backstage/plugin-todo-backend": "0.1.30",
+ "@backstage/plugin-user-settings": "0.4.5",
+ "@backstage/plugin-vault": "0.1.0",
+ "@backstage/plugin-vault-backend": "0.1.0",
+ "@backstage/plugin-xcmetrics": "0.2.26"
},
"changesets": []
}
diff --git a/.changeset/purple-beans-march.md b/.changeset/purple-beans-march.md
new file mode 100644
index 0000000000..f4a3b45ab2
--- /dev/null
+++ b/.changeset/purple-beans-march.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Fix `webpack-dev-server` deprecations.
diff --git a/.changeset/quick-ladybugs-try.md b/.changeset/quick-ladybugs-try.md
deleted file mode 100644
index aad1b200b6..0000000000
--- a/.changeset/quick-ladybugs-try.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-Accessibility updates:
-
-- Added screen reader elements to describe default table `Action` buttons
diff --git a/.changeset/red-games-decide.md b/.changeset/red-games-decide.md
new file mode 100644
index 0000000000..ca5ff580b4
--- /dev/null
+++ b/.changeset/red-games-decide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-api-docs-module-protoc-gen-doc': major
+---
+
+Added the new `grpcDocsApiWidget` to render `protoc-gen-doc` generated descriptors by the `grpc-docs` package.
diff --git a/.changeset/reject-failed-index-tasks.md b/.changeset/reject-failed-index-tasks.md
deleted file mode 100644
index 3c669ce545..0000000000
--- a/.changeset/reject-failed-index-tasks.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/search-backend-node': patch
----
-
-propagate indexing errors so they don't appear successful to the task scheduler
diff --git a/.changeset/renovate-9454dab.md b/.changeset/renovate-9454dab.md
new file mode 100644
index 0000000000..1f8401e10f
--- /dev/null
+++ b/.changeset/renovate-9454dab.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Updated dependency `google-auth-library` to `^8.0.0`.
diff --git a/.changeset/renovate-ad175cc.md b/.changeset/renovate-ad175cc.md
deleted file mode 100644
index 72e278146e..0000000000
--- a/.changeset/renovate-ad175cc.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/core-components': patch
-'@backstage/plugin-gcp-projects': patch
-'@backstage/plugin-techdocs-module-addons-contrib': patch
----
-
-Updated dependency `@react-hookz/web` to `^14.0.0`.
diff --git a/.changeset/rude-llamas-lie.md b/.changeset/rude-llamas-lie.md
new file mode 100644
index 0000000000..918d61da6d
--- /dev/null
+++ b/.changeset/rude-llamas-lie.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-vault': patch
+---
+
+Export missing parameters and added them to the api-report. Also adapted the API to the expected response from the backend
diff --git a/.changeset/scaffolder-form-context.md b/.changeset/scaffolder-form-context.md
deleted file mode 100644
index 9b0e19ebd0..0000000000
--- a/.changeset/scaffolder-form-context.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-'@backstage/plugin-scaffolder': minor
----
-
-Get data of other fields in Form from a custom field in template Scaffolder.
-following:
-
-```tsx
-const CustomFieldExtensionComponent = (props: FieldExtensionComponentProps) => {
- const { formData } = props.formContext;
- ...
-};
-
-const CustomFieldExtension = scaffolderPlugin.provide(
- createScaffolderFieldExtension({
- name: ...,
- component: CustomFieldExtensionComponent,
- validation: ...
- })
-);
-```
diff --git a/.changeset/shaggy-melons-drive.md b/.changeset/shaggy-melons-drive.md
new file mode 100644
index 0000000000..b5674493f4
--- /dev/null
+++ b/.changeset/shaggy-melons-drive.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-model': minor
+---
+
+Adding an optional type field to entity links to group and categorize links
diff --git a/.changeset/sharp-planes-turn.md b/.changeset/sharp-planes-turn.md
new file mode 100644
index 0000000000..47f6a6176d
--- /dev/null
+++ b/.changeset/sharp-planes-turn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-vault-backend': minor
+---
+
+Throw exceptions instead of swallow them, remove some exported types from the `api-report`, small changes in the API responses & expose the vault `baseUrl` to the frontend as well
diff --git a/.changeset/short-jokes-applaud.md b/.changeset/short-jokes-applaud.md
deleted file mode 100644
index b1b4f55858..0000000000
--- a/.changeset/short-jokes-applaud.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/core-components': patch
----
-
-Accessibility updates:
-
-- Added `aria-label` to the `Select` component
-- Changed heading level used in the header of `Table` component
diff --git a/.changeset/short-olives-train.md b/.changeset/short-olives-train.md
new file mode 100644
index 0000000000..594d95f073
--- /dev/null
+++ b/.changeset/short-olives-train.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-kubernetes-backend': minor
+'@backstage/plugin-kubernetes-common': minor
+---
+
+Refactor `KubernetesObjectsProvider` with new methods, `KubernetesServiceLocator` now takes an `Entity` instead of `serviceId`
diff --git a/.changeset/silly-wombats-flash.md b/.changeset/silly-wombats-flash.md
deleted file mode 100644
index d75196df76..0000000000
--- a/.changeset/silly-wombats-flash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-adr': patch
----
-
-Adding term highlighting support to `AdrSearchResultListItem`
diff --git a/.changeset/sixty-plums-kick.md b/.changeset/sixty-plums-kick.md
deleted file mode 100644
index 5c11d9aaca..0000000000
--- a/.changeset/sixty-plums-kick.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-kubernetes': patch
----
-
-Fix for HPA matching when deploying same HPA in multiple namespaces
diff --git a/.changeset/slimy-elephants-attend.md b/.changeset/slimy-elephants-attend.md
deleted file mode 100644
index 4add8f18a3..0000000000
--- a/.changeset/slimy-elephants-attend.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Allow array as non-spread arguments at the `CatalogBuilder`.
-
-```typescript
-builder.addEntityProvider(...getArrayOfProviders());
-```
-
-can be simplified to
-
-```typescript
-builder.addEntityProvider(getArrayOfProviders());
-```
diff --git a/.changeset/smooth-sheep-hide.md b/.changeset/smooth-sheep-hide.md
new file mode 100644
index 0000000000..8a65602ca9
--- /dev/null
+++ b/.changeset/smooth-sheep-hide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-azure-devops': patch
+---
+
+Exporting azureDevOpsApiRef, AzureGitTagsIcon, and all hooks for the benefit of other plugins.
diff --git a/.changeset/spotty-goats-look.md b/.changeset/spotty-goats-look.md
deleted file mode 100644
index 0759afcd57..0000000000
--- a/.changeset/spotty-goats-look.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Adds more of an explanation when the `publish:github` scaffolder action fails to create a repository.
diff --git a/.changeset/sweet-plants-sparkle.md b/.changeset/sweet-plants-sparkle.md
new file mode 100644
index 0000000000..69e7647849
--- /dev/null
+++ b/.changeset/sweet-plants-sparkle.md
@@ -0,0 +1,5 @@
+---
+'@backstage/integration': patch
+---
+
+Allow frontend visibility for `integrations` itself.
diff --git a/.changeset/tame-guests-wave.md b/.changeset/tame-guests-wave.md
new file mode 100644
index 0000000000..bbf757084d
--- /dev/null
+++ b/.changeset/tame-guests-wave.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-azure-devops-backend': patch
+---
+
+Added comments to example to help avoid confusion as to where lines need to be added
diff --git a/.changeset/tasty-snails-boil.md b/.changeset/tasty-snails-boil.md
deleted file mode 100644
index d5b73d3b1b..0000000000
--- a/.changeset/tasty-snails-boil.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-node': patch
----
-
-Added configurable algorithms array for IdentityClient
diff --git a/.changeset/techdocs-gorgeous-plants-sniff.md b/.changeset/techdocs-gorgeous-plants-sniff.md
new file mode 100644
index 0000000000..f5453f35be
--- /dev/null
+++ b/.changeset/techdocs-gorgeous-plants-sniff.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs': patch
+---
+
+Reorder browser tab title in Techdocs pages to have the site name first.
diff --git a/.changeset/techdocs-paws-study.md b/.changeset/techdocs-paws-study.md
deleted file mode 100644
index adbc8d1b3d..0000000000
--- a/.changeset/techdocs-paws-study.md
+++ /dev/null
@@ -1,64 +0,0 @@
----
-'@backstage/plugin-techdocs-backend': patch
----
-
-Output logs from a TechDocs build to a logging transport in addition to existing
-frontend event stream, for capturing these logs to other sources.
-
-This allows users to capture debugging information around why tech docs fail to build
-without needing to rely on end users capturing information from their web browser.
-
-The most common use case is to log to the same place as the rest of the backend
-application logs.
-
-Sample usage:
-
-```
-import { DockerContainerRunner } from '@backstage/backend-common';
-import {
- createRouter,
- Generators,
- Preparers,
- Publisher,
-} from '@backstage/plugin-techdocs-backend';
-import Docker from 'dockerode';
-import { Router } from 'express';
-import { PluginEnvironment } from '../types';
-
-export default async function createPlugin(
- env: PluginEnvironment,
-): Promise {
- const preparers = await Preparers.fromConfig(env.config, {
- logger: env.logger,
- reader: env.reader,
- });
-
- const dockerClient = new Docker();
- const containerRunner = new DockerContainerRunner({ dockerClient });
-
- const generators = await Generators.fromConfig(env.config, {
- logger: env.logger,
- containerRunner,
- });
-
- const publisher = await Publisher.fromConfig(env.config, {
- logger: env.logger,
- discovery: env.discovery,
- });
-
- await publisher.getReadiness();
-
- return await createRouter({
- preparers,
- generators,
- publisher,
- logger: env.logger,
- // Passing a buildLogTransport as a parameter in createRouter will enable
- // capturing build logs to a backend log stream
- buildLogTransport: env.logger,
- config: env.config,
- discovery: env.discovery,
- cache: env.cache,
- });
-}
-```
diff --git a/.changeset/techdocs-swans-check.md b/.changeset/techdocs-swans-check.md
deleted file mode 100644
index 750648ff8a..0000000000
--- a/.changeset/techdocs-swans-check.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Packages a set of tweaks to the TechDocs addons rendering process:
-
-- Prevents displaying sidebars until page styles are loaded and the sidebar position is updated;
-- Prevents new sidebar locations from being created every time the reader page is rendered if these locations already exist;
-- Centers the styles loaded event to avoid having multiple locations setting the opacity style in Shadow Dom causing the screen to flash multiple times.
diff --git a/.changeset/techdocs-the-whole-pulse.md b/.changeset/techdocs-the-whole-pulse.md
new file mode 100644
index 0000000000..b54fb080ae
--- /dev/null
+++ b/.changeset/techdocs-the-whole-pulse.md
@@ -0,0 +1,5 @@
+---
+'@techdocs/cli': patch
+---
+
+Fixed a bug that prevented docker images from being pulled by default when generating TechDocs.
diff --git a/.changeset/techdocs-ways-type.md b/.changeset/techdocs-ways-type.md
deleted file mode 100644
index 6e147f62a7..0000000000
--- a/.changeset/techdocs-ways-type.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Change the `EntityDocsPage` path to be more specific and also add integration tests for `sub-routes` on this page.
diff --git a/.changeset/techdocs-wolves-carry.md b/.changeset/techdocs-wolves-carry.md
deleted file mode 100644
index 01436ee15f..0000000000
--- a/.changeset/techdocs-wolves-carry.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/plugin-techdocs-react': patch
----
-
-Creates a `TechDocsShadowDom` component that takes a tree of elements and an `onAppend` handler:
-
-- Calls the `onAppend` handler when appending the element tree to the shadow root;
-- Also dispatches an event when styles are loaded to let transformers know that the computed styles are ready to be consumed.
diff --git a/.changeset/thick-radios-drive.md b/.changeset/thick-radios-drive.md
new file mode 100644
index 0000000000..130030be59
--- /dev/null
+++ b/.changeset/thick-radios-drive.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-adr': patch
+---
+
+Track discover event and result rank for `AdrSearchResultListItem`
diff --git a/.changeset/unlucky-lies-pretend.md b/.changeset/unlucky-lies-pretend.md
deleted file mode 100644
index a52f2f394e..0000000000
--- a/.changeset/unlucky-lies-pretend.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-kubernetes-backend': minor
----
-
-Add support to fetch data for Stateful Sets from Kubernetes
diff --git a/.changeset/unlucky-stingrays-juggle.md b/.changeset/unlucky-stingrays-juggle.md
new file mode 100644
index 0000000000..f2e83f7163
--- /dev/null
+++ b/.changeset/unlucky-stingrays-juggle.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-import': patch
+---
+
+Support use without `integrations` or only integrations without frontend visible properties (e.g., `bitbucketCloud`) being configured by checking `integrations.github` directly without attempting to load `integrations`.
diff --git a/.changeset/weak-bananas-deliver.md b/.changeset/weak-bananas-deliver.md
new file mode 100644
index 0000000000..f46c7b7bfe
--- /dev/null
+++ b/.changeset/weak-bananas-deliver.md
@@ -0,0 +1,28 @@
+---
+'@backstage/plugin-pagerduty': minor
+---
+
+Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation.
+_Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_
+
+**BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object and has been refactored to
+accept 2 arguments: config and ClientApiDependencies
+The `PagerDutyClient` now relies on a `fetchApi` being available to execute `fetch` requests.
+
+**BREAKING** A new query method `getServiceByEntity` that is used to query for Services by either the `integrationKey` or `serviceId`
+annotation values if they are defined. The `integrationKey` value is preferred currently over `serviceId`. As such, the previous
+`getServiceByIntegrationKey` method has been removed.
+
+**BREAKING** The return values for each Client query method has been changed to return an object instead of raw values.
+For example, the `getIncidentsByServiceId` query method now returns an object in the shape of `{ incidents: Incident[] }`
+instead of just `Incident[]`.
+This same pattern goes for `getChangeEventsByServiceId` and `getOnCallByPolicyId` functions.
+
+**BREAKING** All public exported types that relate to entities within PagerDuty have been prefixed with `PagerDuty` (e.g. `ServicesResponse` is now `PagerDutyServicesResponse` and `User` is now `PagerDutyUser`)
+
+In addition, various enhancements/bug fixes were introduced:
+
+- The `PagerDutyCard` component now wraps error and loading messages with an `InfoCard` to contain errors/messages. This enforces a consistent experience on the EntityPage
+- If no service can be found for the provided integration key, a new Error Message Empty State component will be shown instead of an error alert
+- Introduces the `fetchApi` to replace standard `window.fetch`
+ - ensures that Identity Authorization is respected and provided in API requests
diff --git a/.changeset/wet-dolphins-act.md b/.changeset/wet-dolphins-act.md
new file mode 100644
index 0000000000..b975f464cb
--- /dev/null
+++ b/.changeset/wet-dolphins-act.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-github-actions': patch
+---
+
+Minor cleanup of the API surface.
diff --git a/.changeset/wicked-icons-grin.md b/.changeset/wicked-icons-grin.md
new file mode 100644
index 0000000000..8d26a9255e
--- /dev/null
+++ b/.changeset/wicked-icons-grin.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Swap usage of `MaterialTable` with `Table` from `core-components`
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index b4f825d221..3401dc5b2b 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -14,10 +14,8 @@ yarn.lock @backstage/reviewers @backst
/docs/assets/search @backstage/reviewers @backstage/techdocs-core
/docs/features/search @backstage/reviewers @backstage/techdocs-core
/docs/features/techdocs @backstage/reviewers @backstage/techdocs-core
-/packages/search-common @backstage/reviewers @backstage/techdocs-core
/packages/techdocs-cli @backstage/reviewers @backstage/techdocs-core
/packages/techdocs-cli-embedded-app @backstage/reviewers @backstage/techdocs-core
-/packages/techdocs-common @backstage/reviewers @backstage/techdocs-core
/plugins/allure @backstage/reviewers @deepak-bhardwaj-ps
/plugins/apache-airflow @backstage/reviewers @cmpadden
/plugins/api-docs @backstage/reviewers @backstage/sda-se-reviewers
@@ -42,14 +40,16 @@ yarn.lock @backstage/reviewers @backst
/plugins/jenkins-backend @backstage/reviewers @timja
/plugins/kafka @backstage/reviewers @nirga
/plugins/kafka-backend @backstage/reviewers @nirga
+/plugins/kubernetes @backstage/reviewers @backstage/warpspeed
+/plugins/kubernetes-* @backstage/reviewers @backstage/warpspeed
/plugins/newrelic-dashboard @backstage/reviewers @mufaddal7
/plugins/scaffolder-backend-module-rails @backstage/reviewers @angeliski
/plugins/scaffolder-backend-module-yeoman @backstage/reviewers @pawelmitka
/plugins/search @backstage/reviewers @backstage/techdocs-core
/plugins/search-* @backstage/reviewers @backstage/techdocs-core
+/plugins/sonarqube @backstage/reviewers @backstage/sda-se-reviewers
/plugins/stack-overflow @backstage/reviewers @backstage/techdocs-core
/plugins/stack-overflow-backend @backstage/reviewers @backstage/techdocs-core
-/plugins/sonarqube @backstage/reviewers @backstage/sda-se-reviewers
/plugins/techdocs @backstage/reviewers @backstage/techdocs-core
/plugins/techdocs-* @backstage/reviewers @backstage/techdocs-core
/tech-insights-backend @backstage/reviewers @xantier @iain-b
diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt
index 7631640199..8428dc2d0e 100644
--- a/.github/vale/Vocab/Backstage/accept.txt
+++ b/.github/vale/Vocab/Backstage/accept.txt
@@ -85,6 +85,8 @@ dockerfiles
Dockerize
dockerode
Docusaurus
+dynatrace
+Dynatrace
ecco
env
Env
@@ -275,6 +277,7 @@ scrollbar
seb
semlas
semver
+serializable
Serverless
shoutout
siloed
@@ -301,6 +304,7 @@ superfences
Superfences
superset
supertype
+storable
talkdesk
Talkdesk
tasklist
diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml
index fe8849a085..736f09571f 100644
--- a/.github/workflows/verify_docs-quality.yml
+++ b/.github/workflows/verify_docs-quality.yml
@@ -21,7 +21,7 @@ jobs:
run: echo "::set-output name=args::$(node scripts/check-docs-quality.js --ci-args)"
- name: documentation quality check
- uses: errata-ai/vale-action@v1.5.0
+ uses: errata-ai/vale-action@v2.0.1
with:
# This also contains --config=.github/vale/config.ini ... :/
files: '${{ steps.generate.outputs.args }}'
diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml
index 129c246a73..934ef8f06c 100644
--- a/.github/workflows/verify_e2e-windows.yml
+++ b/.github/workflows/verify_e2e-windows.yml
@@ -56,3 +56,4 @@ jobs:
run: yarn e2e-test run
env:
DEBUG: zombie
+ CYPRESS_VERIFY_TIMEOUT: 600000
diff --git a/ADOPTERS.md b/ADOPTERS.md
index 3915aee949..10b605a8d4 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -21,7 +21,7 @@ _If you're using Backstage in your organization, please try to add your company
| [Fiverr](https://www.fiverr.com) | [@nirga](https://github.com/nirga) | Unifying separate tools that developers are using today (i.e. monitoring, dead letter queues management, etc.) into a single platform. |
| [Zalando SE](https://www.zalando.de) | [@leviferreira](https://github.com/leviferreira) | Building V2 of the Internal Development Portal. |
| [LegalZoom](https://legalzoom.com) | [@backjo](https://github.com/backjo) | Developer portal - hub for all engineering projects and metadata. |
-| [Expedia Group](https://www.expediagroup.com) | [Mike Turner](mailto:miturner@expediagroup.com), [Sneha Kumar](mailto:snkumar@expediagroup.com), [@guillermomanzo](https://github.com/guillermomanzo), [Erik Lindgren](https://github.com/lindgren) | EG Common Developer Toolkit |
+| [Expedia Group](https://www.expediagroup.com) | [@guillermomanzo](https://github.com/guillermomanzo), [Sheena Sharma](mailto:shesharma@expediagroup.com) | EG Common Developer Toolkit |
| [Paddle.com](https://paddle.com) | [Ioannis Georgoulas](https://github.com/geototti21) | Developer portal (Tech Docs, Service Catalog, Internal Tooling), we use vanilla Backstage FE and custom BE implementation in Go |
| [Acast.com](https://acast.com) | [Olle Lundberg](https://github.com/lndbrg) | Developer portal with tech docs, service catalog and a bunch of other internal tooling |
| [Lunar](https://lunar.app) | [Jacob Valdemar](https://github.com/JacobValdemar) | Internal developer portal for service overview and insights, API documentation, technical guides, onboarding guides and RFC's. |
@@ -36,7 +36,7 @@ _If you're using Backstage in your organization, please try to add your company
| [PagerDuty](https://www.pagerduty.com/) | [Mark Shaw](https://github.com/markshawtoronto) | Developer portal, initially focused on software templates and tech-docs. |
| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process ๐๐๐งโ๐ |
| [FundApps](https://www.fundapps.co/) | [Elliot Greenwood](https://github.com/egnwd) | Developer Portal - A place for us to keep track of our projects and documentation for all services and processes |
-| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). |
+| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com), [Kamil Wolny](https://github.com/mrwolny) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). |
| [HelloFresh](https://www.hellofresh.de/) | [@iammuho](https://github.com/iammuho), [@ElenaForester](https://github.com/ElenaForester), [@diegomarangoni](https://github.com/diegomarangoni) | Our developer portal at HelloFresh - Spread across an organisation of 500+ engineers globally. |
| [FactSet](https://www.factset.com/) | [@kuangp](https://github.com/kuangp) | Developer portal to provide discoverability to all internal components, APIs, documentation, and scaffold templates with integrations to our internal infrastructure tools. |
| [Workrise](https://www.workrise.com/) | [Michael Rode](https://github.com/michaelrode) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
@@ -122,8 +122,64 @@ _If you're using Backstage in your organization, please try to add your company
| [World Fuel Services](https://www.wfscorp.com/) | [Anirudh Kurapathi](https://github.com/anirudhkurapati), [Alex Kwon](https://github.com/alexkwon), [Lester Hernandez](https://github.com/lhernandez-wfscorp), [Avi Boru](https://github.com/aviboru), [Vardhan Annapureddy](https://github.com/harshaaws) | Internal Developer Portal, service catalog product, API's, Software Templates, tech docs and more. |
| [leboncoin](https://www.leboncoin.fr/) | [Andy Ladjadj](https://github.com/aladjadj) | Centralize our multiple UI in a single portal. Simplify onbording, new features and harmonize how people search information. Core features (catalog,api,docs,scafolder) are good to start the adoption. status: internal beta. |
| [Contentful](https://www.contentful.com) | [James Bourne](https://github.com/jamesmbourne) | Centralized documentation of service ownership, APIs, and documentation, and new service creation with a custom scaffolder - [full case study with Roadie](https://roadie.io/case-studies/maintaining-velocity-through-hypergrowth-contentful/). |
-| [Back Market](https://www.backmarket.com) | [Sami Farhat](https://github.com/skfarhat) | Internal Developer Portal featuring catalog, tech-radar, ownership management, component creation (scaffolder) and centralized infrastructure management -- probably more to come. |
-| [Avalia Systems](https://avalia.io) | [Olivier Liechti](https://github.com/wasadigi), [Fabio Velloso](https://github.com/fabiovelloso) | Innersource, software analytics, knowledge base for 360 software assessments, collaborative applications, hub for tracking and sharing IP assets. |
-| [Albert Heijn](https://ah.technology) | [Joost Hofman](https://github.com/joosthofman), [Reindrich Geerman](https://github.com/reinst) | Single point of entry for all our engineers (Developer portal), Tech radar, catalog, templates (paved roads) and tech documentation. |
-| [Wise, formerly TransferWise](https://wise.com) | [Andrew Beveridge](https://github.com/beveradb) | It's early days for us, we're trying to start small with catalog, tech docs and unified search. Future ambitious vision includes scaffolder for one-click component addition, building out integrations with CI/CD tooling, kubernetes clusters, monitoring/alerting tooling etc. and aiming for a frictionless "golden path" for engineers! ๐ |
-
+| [Back Market](https://www.backmarket.com) | [Sami Farhat](https://github.com/skfarhat) | Internal Developer Portal featuring catalog, tech-radar, ownership management, component creation (scaffolder) and centralized infrastructure management -- probably more to come. |
+| [Avalia Systems](https://avalia.io) | [Olivier Liechti](https://github.com/wasadigi), [Fabio Velloso](https://github.com/fabiovelloso) | Innersource, software analytics, knowledge base for 360 software assessments, collaborative applications, hub for tracking and sharing IP assets. |
+| [Albert Heijn](https://ah.technology) | [Joost Hofman](https://github.com/joosthofman), [Reindrich Geerman](https://github.com/reinst) | Single point of entry for all our engineers (Developer portal), Tech radar, catalog, templates (paved roads) and tech documentation. |
+| [Wise, formerly TransferWise](https://wise.com) | [Andrew Beveridge](https://github.com/beveradb) | It's early days for us, we're trying to start small with catalog, tech docs and unified search. Future ambitious vision includes scaffolder for one-click component addition, building out integrations with CI/CD tooling, kubernetes clusters, monitoring/alerting tooling etc. and aiming for a frictionless "golden path" for engineers! ๐ |
+| [Happy Money](http://happymoney.com/) | [Akshit Lomash](mailto:alomash@happymoney.com) | We are moving from a monolith to microservices-based architecture. We are developing a developer portal based on Backstage to create a service catalog for our new services. All the services created are onboarded Backstage and engineering teams are using a cookie-cutter-based template from backstage to initiate a new service. |
+| [Lightspeed](http://lightspeedhq.com/) | [Marcus Crane](mailto:marcus.crane@lightspeedhq.com) | We use it within our X-Series division (https://vendhq.com) to catalog ~100+ systems and ~350 components! |
+| [Siemens](https://www.siemens.com/global/en.html) | [Nizar Chaouch](mailto:nizar.chaouch@siemens.com) | We are using Backstage as our Developer portal |
+| [The Warehouse Group](https://www.thewarehouse.co.nz) | [Matt Law](mailto:matt.law@thewarehouse.co.nz) | Backstage enables us to bootstrap our middleware environment of new services for our Dev teams in a matter of seconds. CI, CD, testing, logging, deployments are all taken care of to get them up and running in less than 60 seconds. |
+| [Tink](https://tink.com/) | [Sebastian Olsson](https://github.com/Sebelino), [Bลaลผej Szum](https://github.com/blazejszumtink), [Anders Eurenius Runvald](https://github.com/anders-er-at-tink) | Internal developer portal which provides templates for creating new Java or Go microservices seamlessly. Also includes a tech radar and a visualization of our CD pipeline. |
+| [Brandwatch](https://brandwatch.com) | [Stefan Buck](https://github.com/stefanbuck) | Our primary focus is on the service catalog. Backstage is replacing our homemade service catalog. The switch was quite simple due to the catalog processor API. |
+| [Laybuy](https://www.laybuy.com) | [Chris Simmons](https://github.com/contrarianchris) | Backstage is the heart of Laybuyโs new centralised Development Platform, bringing disparate development tools and experiences into a single easy-to-use portal. It simplifies software and API discovery, project scaffolding, and technical documentation, enabling us to embrace golden path development and automate software standards. |
+| [Sendinblue](https://engineering.sendinblue.com/) | [Tanguy Antoine](mailto:antoine.tanguy@sendinblue.com) | Helps us drive the change at scale. Puts light on services, resources, and dependencies. One tool that rules them all through plugins we created for that purpose. We are aiming to put Backstage at the center of every developer's work (Actionable items, Debugging, Monitoring, Provisioning, etc...) to improve their happiness |
+| [SafetyCulture](https://safetyculture.com/) | [@R-cen](https://github.com/R-cen), [@lachlancooper](https://github.com/lachlancooper), [@hkf57](https://github.com/hkf57) | Internal developer portal to provide a centralized place for engineers to see an overview of their team's services and information related to the service from other systems. Initially focused on the software catalog, techdocs and search. |
+| [Sana Life Science](https://sanalifescience.com) | [Joe Hillyard](mailto:joe@sanalifescience.com) | API Catalog, Tools Management & Control Hub |
+| [Ndustrial](https://ndustrial.io) | [Jonathan Skubic](mailto:jonathan@ndustrial.io) | Software Project Catalog |
+| [TUI Musement](https://www.musement.com/uk/) | [Simone Fumagalli](mailto:simone.fumagalli@musement.com) | We are importing our catalog into it to keep it under control. The next step is start using templates |
+| [Kambi AB](https://www.kambi.com) | [Martin Norum](mailto:martin.norum@kambi.com) | We want to kick ass at speed, so we're currently building up a catalog of our existing software, and looking into how Backstage can support us in our journey towards autonomous product teams. Both to improve speed to market and operational awareness. |
+| [ANZ](https://www.anz.com.au/personal/) | [Elliot Jackson](mailto:elliot.jackson@anz.com) | Catalog, tech docs and automation |
+| [Genie Solutions](https://www.geniesolutionssoftware.com.au) | [Zainab Bagasrawala](mailto:zainabbagasrawala@geniesolutions.com.au) | Developer Portal to track our projects, documentation, observability tools and more |
+| [MadeiraMadeira](https://www.madeiramadeira.com.br) | [Paulo Eduardo Peixoto](mailto:paulo.peixoto@madeiramadeira.com.br) | As a support tool for developers, following the principles of "Developer Experience". In order to make the developer's day to day more practical, efficient and, why not, happy. |
+| [Sonatype](https://www.sonatype.com) | [Srikar Ananthula](mailto:sananthula@sonatype.com) | Centralize services used internally with many plugins |
+| [CVS Health](https://www.cvshealth.com) | [Ari Ben-Elazar](mailto:abenelazar@gmail.com) | Cataloging and documenting our service offerings to offer our internal developers a better operational journey |
+| [Yatra.com](https://www.yatra.com) | [Matiur Rahman Maitur](mailto:arifrahman4u@gmail.com) | Easy to find out Project details, ownership, dependent services, Documentation, it is very useful for developer. |
+| [Yotpo](https://www.yotpo.com) | [Liran Yogev](mailto:lyogev@yotpo.com) | Services exploration, documentation and project generator |
+| [Mainsail Industries](https://www.mainsailindustries.com) | [Brad Sollar](mailto:brad@mainsailindustries.com) | Internal tool management and docs |
+| [Prisma](https://prismamp.com) | [Sebastian Gravina](mailto:sgravina@prismamp.com) | Is part of our IDP |
+| [Syndetic](https://syndetic.io) | [John Feminella](mailto:robots+swag@syndetic.io) | We're working with multiple F100 clients for digital transformation and Backstage is a key part of our landing and acceleration strategy. |
+| [Imagine Learning](https://www.imaginelearning.com/en/us) | [Jared Stehler](mailto:jared.stehler@imaginelearning.com) | Software catalog, product dependency visualization |
+| [Alef Education](https://www.alefeducation.com) | [Belal Juma](mailto:belal.juma@alefeducation.com) | We use backstage as a Service Catalog and rely on the TechDocs feature |
+| [Zego](https://www.zego.com) | [Sean Kenny](mailto:sean.kenny@zego.com) | Single pane of glass for organisational and operational information for all services across our systems. |
+| [Absa Group Limited](https://www.absa.africa/absaafrica/) | [Chris Kieser](mailto:chris.kieser@absa.africa) | Developer portal for all development needs - security, AWS, k8s, build and deployment pipelines and more |
+| [Nutrien Ag Solutions](https://www.nutrienagsolutions.com.au) | [Jan Quijano](mailto:jan.quijano@nutrien.com.au) | Software Project Catalog |
+| [Lendingkart](https://www.lendingkart.com/) | [Dinesh Rajpoot](mailto:dinesh.rajpoot@lendingkart.com) | Service catalog, Software templates to enforce best practices and tech insights to track mandates & migrations. |
+| [Meltwater](https://underthehood.meltwater.com) | [@spier](https://github.com/spier), [@remen](https://github.com/remen) | Improving developer experience by centralizing documentation and internal APIs. Goal: Foster InnerSource collaboration and speed up onboarding time in our 500+ people Product & Engineering org. |
+| [Doctolib](https://doctolib.engineering/) | [@djiit](https://github.com/djiit) | Rails modularization effort awareness, tech organization discoverability. Improving the daily workflows and collaboration processes of our engineers. |
+| [Twilio](https://www.twilio.com) | [Kyle Smith](https://github.com/knksmith57) | Developer portal, universal software catalog, and centralized taxonomy platform. |
+| [OVHcloud](https://www.ovhcloud.com/fr/) | [Jean-Philippe Blary](https://github.com/blaryjp), [Arnaud Bauer](mailto:arnaud.bauer@ovhcloud.com), [Flavien Chantelot](https://github.com/Dorn-) | We're providing Backstage to our collaborators to ease their daily jobs, and let them extends it using plugins. |
+| [Procter & Gamble](https://us.pg.com/) | [Binita Nayak](https://github.com/binitan), [Josh Rose](https://github.com/joshuarose), [RJ Winkler](https://github.com/rjwink) | P&G leverages Backstage to build internal developer portal to ensure developers' happiness. This developer portal shall act as single source of information needed by development teams to seamlessly create, find and maintain their software components/resources/documentation. |
+| [SANS Institute](https://www.sans.org) | [Christopher Klewin](mailto:cklewin@sans.org) | Developer portal for centralized visibility, reporting, and tooling across multiple organizations. |
+| [Okay](https://www.okayhq.com/) | [Tomas Barreto](mailto:tomas@okayhq.com) | Service catalog, developer portal, and technical documentation |
+| [Kaluza](https://www.kaluza.com) | [James Condren](mailto:james.condron@kaluza.com) | To provide an automated golden path to developers, with a focus on discovery and documentation |
+| [LinkedIn](https://linkedin.com) | [Joshua Lawrence](mailto:jlawrence@linkedin.com) | We are building a platform for internal web tools |
+| [Forto](https://forto.com) | [Rodolfo Matos](mailto:rodolfo.matos@forto.com) | Still in a experimental phase/assessing the organisational fit. We will be using it mostly a developer portal -- pretty standard use case. |
+| [BetterUp](https://betterup.com) | [Jordan Hochenbaum](mailto:jordan.hochenbaum@betterup.co) | We're starting to use Backstage as the central hub for service discovery, documentation, and develop experience. |
+| [warung pintar](https://warungpintar.co.id/) | [Muhammad Rafly Andrianza](mailto:rafly.andrianza@warungpintar.co) | Initial Work Developer Portal with TechRadar, Service Catalogue, TechDocs, anything about platform & infrastructure resources. |
+| [RD](https://rd.com.br/) | [Michael Silva](mailto:midsilva@rd.com.br) | We are building our developer portal. Software catalog, Tech Radar and Scaffolding are among the initial features. |
+| [AEB](https://www.aeb.com/) | [David Fankhรคnel](mailto:dfl@aeb.com) | Central developer platform for creating new apps via templates, getting an overview via software catalog, etc |
+| [SALTO Systems](https://saltosystems.com) | [Ian Cowley](mailto:i.cowley@saltosystems.com) | Currently using Backstage as an internal documentation portal. |
+| [Lummo](https://lummo.com) | [Anjul Sahu](mailto:anjul@lummo.com) | We are building the internal developer portal using Backstage and bringing up all integrations and service information at one place. |
+| [Frontside](https://frontside.com) | [Taras Mankovski](mailto:taras@frontside.com) |
+| [Stepstone](https://www.stepstone.com/en/) | [Neil Kennedy](mailto:neil.kennedy@stepstone.com) | StepStone is using Backstage to solve problems around ownership and visibility of our applications. We have thousands of repos, multiple legacy systems and a growing platform that is hard to maintain. Backstage is forming the centre of our push to embrace the chaos. |
+| [idwall](https://idwall.co) | [Rodrigo Catรฃo Araujo](mailto:rodrigo@idwall.co) | Developer Portal for internal engineers to access service catalog, documentation, observability, infrastructure and internal tooling. |
+| [Jaguar Land Rover](https://www.jaguarlandrover.com) | [Josh Walker](mailto:jwalke18@jaguarlandrover.com) | Users can request a Gitlab user, which creates a commit with the Terraform code. |
+| [Glovo](http://glovoapp.com/) | [Yaser Toutah](mailto:yaser.toutah@glovoapp.com) | Developer Portal to improve our Developer Experience, identify ownership and track metadata for our services and tools. It's our Service Catalog. In addition to that, we use it for Service Creation, and much more. |
+| [Dixa](https://dixa.com) | [Jens Mรธller](mailto:jsc@dixa.com) | We are in early stages, but using it to get overview of our repositories and ownership of these. We want among many things to use it for compliance and easier access to key metrics for our repos. |
+| [Notino](https://notino.com) | [Jan Remunda](mailto:jan.remunda@notino.com) | Backstage is our developer portal. We use it as service catalog and for technical documentation. |
+| [Polarpoint](https://polarpoint.io/) | [Surj Bains](https://github.com/polarpoint-io) | We are using Backstage as our Developer portal as well as for hosting our DevOps portal for software catalog. |
+| [Niche](https://niche.com) | [Zach Romitz](mailto:zach.romitz@niche.com) | We are using the Software Catalog, Software Templates, API documentation, and Techdocs to try and centralize service information. |
+| [Mercedes-Benz.io](https://www.mercedes-benz.io/) | [Manuel Santos](https://github.com/manusant) | At Mercedes-Benz we use it as a developer portal with software catalog, TechDocs, Scaffolding and custom plugins. It provides an overview of our tech ecosystem to our product development teams. The portal also serves as a way to foster collaboration among the numerous companies of the Mercedes-Benz Group.
+| [Funding Circle](https://www.fundingcircle.com/) | [Ariel Pacciaroni](https://github.com/arielpacciaroni) | We are building the internal developer portal using Backstage project and centralizing all services information at one place. The portal helps us track down repositories ownership as well as direct access to key information on every component.
+
diff --git a/app-config.yaml b/app-config.yaml
index eb51c59847..a56a3df9d1 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -115,6 +115,11 @@ proxy:
headers:
Authorization: Basic ${GOCD_AUTH_CREDENTIALS}
+ '/dynatrace':
+ target: https://your.dynatrace.instance.com/api/v2
+ headers:
+ Authorization: 'Api-Token ${DYNATRACE_ACCESS_TOKEN}'
+
organization:
name: My Company
@@ -131,6 +136,9 @@ techdocs:
publisher:
type: 'local' # Alternatives - 'googleGcs' or 'awsS3' or 'azureBlobStorage' or 'openStackSwift'. Read documentation for using alternatives.
+dynatrace:
+ baseUrl: https://your.dynatrace.instance.com
+
sentry:
organization: my-company
@@ -163,26 +171,26 @@ integrations:
github:
- host: github.com
token: ${GITHUB_TOKEN}
- ### Example for how to add your GitHub Enterprise instance using the API:
- # - host: ghe.example.net
- # apiBaseUrl: https://ghe.example.net/api/v3
- # token: ${GHE_TOKEN}
- ### Example for how to add your GitHub Enterprise instance using raw HTTP fetches (token is optional):
- # - host: ghe.example.net
- # rawBaseUrl: https://ghe.example.net/raw
- # token: ${GHE_TOKEN}
+ ### Example for how to add your GitHub Enterprise instance using the API:
+ # - host: ghe.example.net
+ # apiBaseUrl: https://ghe.example.net/api/v3
+ # token: ${GHE_TOKEN}
+ ### Example for how to add your GitHub Enterprise instance using raw HTTP fetches (token is optional):
+ # - host: ghe.example.net
+ # rawBaseUrl: https://ghe.example.net/raw
+ # token: ${GHE_TOKEN}
gitlab:
- host: gitlab.com
token: ${GITLAB_TOKEN}
- bitbucket:
- - host: bitbucket.org
- username: ${BITBUCKET_USERNAME}
- appPassword: ${BITBUCKET_APP_PASSWORD}
- ### Example for how to add your bitbucket server instance using the API:
- # - host: server.bitbucket.com
- # apiBaseUrl: server.bitbucket.com
- # username: ${BITBUCKET_SERVER_USERNAME}
- # appPassword: ${BITBUCKET_SERVER_APP_PASSWORD}
+ ### Example for how to add a bitbucket cloud integration
+ # bitbucketCloud:
+ # - username: ${BITBUCKET_USERNAME}
+ # appPassword: ${BITBUCKET_APP_PASSWORD}
+ ### Example for how to add your bitbucket server instance using the API:
+ # - host: server.bitbucket.com
+ # apiBaseUrl: server.bitbucket.com
+ # username: ${BITBUCKET_SERVER_USERNAME}
+ # appPassword: ${BITBUCKET_SERVER_APP_PASSWORD}
azure:
- host: dev.azure.com
token: ${AZURE_TOKEN}
diff --git a/contrib/chart/backstage/Chart.lock b/contrib/chart/backstage/Chart.lock
index b06f1ea1cb..6220a481dd 100644
--- a/contrib/chart/backstage/Chart.lock
+++ b/contrib/chart/backstage/Chart.lock
@@ -1,6 +1,6 @@
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
- version: 11.2.4
-digest: sha256:782c8593a80e332b19f736d48f4635e424bbf0575ed9d587c0a301cccfcedce8
-generated: "2022-05-19T10:46:51.441725486Z"
+ version: 9.8.12
+digest: sha256:549b9a0cdf7b2e0ad949ebad853a467bf320928970a946fb0ef7e13e9bdb7a10
+generated: "2022-05-20T08:15:48.301491565Z"
diff --git a/contrib/chart/backstage/Chart.yaml b/contrib/chart/backstage/Chart.yaml
index 3776f4a41c..9770ef665c 100644
--- a/contrib/chart/backstage/Chart.yaml
+++ b/contrib/chart/backstage/Chart.yaml
@@ -18,7 +18,7 @@ sources:
dependencies:
- name: postgresql
condition: postgresql.enabled
- version: 11.2.4
+ version: 9.8.12
repository: https://charts.bitnami.com/bitnami
maintainers:
diff --git a/contrib/docker/cookiecutter-with-jinja2-extensions/Dockerfile b/contrib/docker/cookiecutter-with-jinja2-extensions/Dockerfile
index b854a00675..e41d324730 100644
--- a/contrib/docker/cookiecutter-with-jinja2-extensions/Dockerfile
+++ b/contrib/docker/cookiecutter-with-jinja2-extensions/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.15
+FROM alpine:3.16
RUN apk add --update \
git \
diff --git a/contrib/docs/tutorials/prometheus-metrics-output.png b/contrib/docs/tutorials/prometheus-metrics-output.png
new file mode 100644
index 0000000000..f7fac739ac
Binary files /dev/null and b/contrib/docs/tutorials/prometheus-metrics-output.png differ
diff --git a/contrib/docs/tutorials/prometheus-metrics.md b/contrib/docs/tutorials/prometheus-metrics.md
new file mode 100644
index 0000000000..5b7dc61df3
--- /dev/null
+++ b/contrib/docs/tutorials/prometheus-metrics.md
@@ -0,0 +1,108 @@
+# Prometheus
+
+## Overview
+
+This is a small tutorial that goes over how to setup your Backstage instance to output metrics in a format that can be pulled in by Prometheus.
+
+## How to Setup Prometheus Metrics
+
+1. First we need to add the needed dependencies to the `package.json` in the `\packages\backend`:
+
+ ```diff
+ // packages/backend/package.json
+ "dependencies": {
+ + "express-prom-bundle": "^6.3.6",
+ + "prom-client": "^14.0.1",
+ ```
+
+2. Now we want to run `yarn install` from the root of the project to get those dependencies in place
+3. Then we need to add a handler for the metrics by creating a file called `metrics.ts` in the `\packages\backend\src` folder
+4. Next we add the following content to the `metrics.ts` file:
+
+ ```ts
+ // packages/backend/src/metrics.ts
+ import { useHotCleanup } from '@backstage/backend-common';
+ import { RequestHandler } from 'express';
+ import promBundle from 'express-prom-bundle';
+ import prom from 'prom-client';
+ import * as url from 'url';
+
+ const rootRegEx = new RegExp('^/([^/]*)/.*');
+ const apiRegEx = new RegExp('^/api/([^/]*)/.*');
+
+ export function normalizePath(req: any): string {
+ const path = url.parse(req.originalUrl || req.url).pathname || '/';
+
+ // Capture /api/ and the plugin name
+ if (apiRegEx.test(path)) {
+ return path.replace(apiRegEx, '/api/$1');
+ }
+
+ // Only the first path segment at root level
+ return path.replace(rootRegEx, '/$1');
+ }
+
+ /**
+ * Adds a /metrics endpoint, register default runtime metrics and instrument the router.
+ */
+ export function metricsHandler(): RequestHandler {
+ // We can only initialize the metrics once and have to clean them up between hot reloads
+ useHotCleanup(module, () => prom.register.clear());
+
+ return promBundle({
+ includeMethod: true,
+ includePath: true,
+ // Using includePath alone is problematic, as it will include path labels with high
+ // cardinality (e.g. path params). Instead we would have to template them. However, this
+ // is difficult, as every backend plugin might use different routes. Instead we only take
+ // the first directory of the path, to have at least an idea how each plugin performs:
+ normalizePath,
+ promClient: { collectDefaultMetrics: {} },
+ });
+ }
+ ```
+
+5. Now we will extend the router configuration with the `metricsHandler`:
+
+ ```diff
+ +import { metricsHandler } from './metrics';
+
+ ...
+
+ const service = createServiceBuilder(module)
+ .loadConfig(config)
+ .addRouter('', await healthcheck(healthcheckEnv))
+ + .addRouter('', metricsHandler())
+ .addRouter('/api', apiRouter);
+ ```
+
+6. You now have everything setup, from the `\packages\backend` folder run `yarn start` this will start up the backend
+7. Now in a browser load up `http://localhost:7007/metrics`, if everything went smoothly you should see metrics in your browser something like this:
+
+ 
+
+## Metrics
+
+The following sections goes over the included and experimental metrics available once you have completed this tutorial
+
+## Included
+
+This tutorials uses the [`express-prom-bundle`](https://github.com/jochen-schweizer/express-prom-bundle) and the [`prom-client`](https://github.com/siimon/prom-client) to make this all work. They both come with some built in metrics:
+
+- `express-prom-bundle` comes with 2 metrics:
+ - `up`: this normally will be just 1
+ - `http_request_duration_seconds`: http latency histogram/summary labeled with `status_code`, `method` and `path`
+- `prom-client` comes with a collection of metrics around memory, CPU, processes, etc. You can see the supported metrics in the `prom-client's` [`lib/metrics`](https://github.com/siimon/prom-client/tree/master/lib/metrics) folder.
+
+### Experimental
+
+There are some custom metrics that have been added to Backstage will be output for you, these are currently deemed experimental and may be changed or removed in a future release. Here is a rough list, again subject to changes:
+
+- `catalog_entities_count`: Total amount of entities in the catalog
+- `catalog_registered_locations_count`: Total amount of registered locations in the catalog
+- `catalog_relations_count`: Total amount of relations between entities
+- `catalog_stitched_entities_count`: Amount of entities stitched
+- `catalog_processed_entities_count`: Amount of entities processed
+- `catalog_processing_duration_seconds`: Time spent executing the full processing flow
+- `catalog_processors_duration_seconds`: Time spent executing catalog processors
+- `catalog_processing_queue_delay_seconds`: The amount of delay between being scheduled for processing, and the start of actually being processed
diff --git a/contrib/search/confluence/ConfluenceCollator.md b/contrib/search/confluence/ConfluenceCollator.md
index f636ae88ea..7d7c8641f3 100644
--- a/contrib/search/confluence/ConfluenceCollator.md
+++ b/contrib/search/confluence/ConfluenceCollator.md
@@ -1,7 +1,7 @@
ConfluenceCollator.ts reference
```ts
-import { DocumentCollator } from '@backstage/search-common';
+import { DocumentCollator } from '@backstage/plugin-search-common';
import fetch from 'cross-fetch';
export class ConfluenceCollator implements DocumentCollator {
diff --git a/contrib/search/confluence/ConfluenceResultListItem.md b/contrib/search/confluence/ConfluenceResultListItem.md
index ba7c4f91a9..059048d731 100644
--- a/contrib/search/confluence/ConfluenceResultListItem.md
+++ b/contrib/search/confluence/ConfluenceResultListItem.md
@@ -3,7 +3,7 @@ ConfluenceResultListItem.tsx reference
```tsx
import React from 'react';
import { Link } from '@backstage/core-components';
-import { IndexableDocument } from '@backstage/search-common';
+import { IndexableDocument } from '@backstage/plugin-search-common';
import {
Divider,
ListItem,
diff --git a/cypress/package.json b/cypress/package.json
index 6a231326c4..cc66949d28 100644
--- a/cypress/package.json
+++ b/cypress/package.json
@@ -5,7 +5,7 @@
"license": "MIT",
"private": true,
"dependencies": {
- "cypress": "^7.3.0",
+ "cypress": "^10.0.0",
"typescript": "^4.1.3"
}
}
diff --git a/cypress/src/integration/plugins/catalog.spec.ts b/cypress/src/integration/plugins/catalog.spec.ts
index adf9b9a384..50ef3145e5 100644
--- a/cypress/src/integration/plugins/catalog.spec.ts
+++ b/cypress/src/integration/plugins/catalog.spec.ts
@@ -82,5 +82,118 @@ describe('Catalog', () => {
.contains('Sub-page 1')
.should('be.visible');
});
+
+ it('Should render addons on docs tab homepage', () => {
+ cy.loginAsGuest();
+
+ cy.visit('/catalog');
+
+ cy.contains('techdocs-e2e-fixture').click();
+
+ cy.location().should(loc => {
+ expect(loc.pathname).to.eq(
+ '/catalog/default/component/techdocs-e2e-fixture',
+ );
+ });
+
+ cy.getCatalogDocsTab().click();
+
+ cy.wait(300);
+
+ cy.getTechDocsShadowRoot()
+ .find('h1')
+ .contains('Home page')
+ .should('be.visible');
+
+ // highlight a snippet of text
+ cy.getTechDocsShadowRoot()
+ .find('article > p')
+ .then($el => {
+ const el = $el[0];
+ const document = el.ownerDocument;
+ const range = document.createRange();
+ range.selectNodeContents(el);
+ document?.getSelection()?.removeAllRanges();
+ document?.getSelection()?.addRange(range);
+ });
+
+ cy.document().trigger('selectionchange');
+
+ // wait for new issue default debounce time
+ cy.wait(600);
+
+ // assert that the new issue button has a right url
+ cy.getTechDocsShadowRoot()
+ .contains('Open new Github issue')
+ .should(
+ 'have.attr',
+ 'href',
+ 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%3A7007%2Fcatalog%2Fdefault%2Fcomponent%2Ftechdocs-e2e-fixture%2Fdocs%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Findex.md%3E',
+ );
+ });
+
+ it('Should render addons on docs tab sup-page', () => {
+ cy.loginAsGuest();
+
+ cy.visit('/catalog');
+
+ cy.contains('techdocs-e2e-fixture').click();
+
+ cy.location().should(loc => {
+ expect(loc.pathname).to.eq(
+ '/catalog/default/component/techdocs-e2e-fixture',
+ );
+ });
+
+ cy.getCatalogDocsTab().click();
+
+ cy.wait(300);
+
+ cy.getTechDocsShadowRoot()
+ .find('h1')
+ .contains('Home page')
+ .should('be.visible');
+
+ cy.getTechDocsShadowRoot().within(() => {
+ cy.getTechDocsNavigation().find('a').contains('Sub-page 1').click();
+ });
+
+ cy.location().should(loc => {
+ expect(loc.pathname).to.eq(
+ '/catalog/default/component/techdocs-e2e-fixture/docs/sub-page-one/',
+ );
+ });
+
+ cy.getTechDocsShadowRoot()
+ .find('h1')
+ .contains('Sub-page 1')
+ .should('be.visible');
+
+ // highlight a snippet of text
+ cy.getTechDocsShadowRoot()
+ .find('#section-11')
+ .then($el => {
+ const el = $el[0];
+ const document = el.ownerDocument;
+ const range = document.createRange();
+ range.selectNodeContents(el);
+ document?.getSelection()?.removeAllRanges();
+ document?.getSelection()?.addRange(range);
+ });
+
+ cy.document().trigger('selectionchange');
+
+ // wait for new issue default debounce time
+ cy.wait(600);
+
+ // assert that the new issue button has a right url
+ cy.getTechDocsShadowRoot()
+ .contains('Open new Github issue')
+ .should(
+ 'have.attr',
+ 'href',
+ 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20Section%201.1%C2%B6&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20Section%201.1%C2%B6%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%3A7007%2Fcatalog%2Fdefault%2Fcomponent%2Ftechdocs-e2e-fixture%2Fdocs%2Fsub-page-one%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Fsub-page-one.md%3E',
+ );
+ });
});
});
diff --git a/cypress/src/integration/plugins/techdocs.spec.ts b/cypress/src/integration/plugins/techdocs.spec.ts
index 1e69ba46ad..31094cb128 100644
--- a/cypress/src/integration/plugins/techdocs.spec.ts
+++ b/cypress/src/integration/plugins/techdocs.spec.ts
@@ -99,7 +99,7 @@ describe('TechDocs', () => {
});
describe('Rendering TechDocs Addons', () => {
- it('should render a content addon', () => {
+ it('should render a content addon in homepage', () => {
cy.visit('/docs/default/Component/techdocs-e2e-fixture');
cy.contains('e2e Fixture Documentation');
@@ -130,6 +130,43 @@ describe('TechDocs', () => {
'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%3A7007%2Fdocs%2Fdefault%2FComponent%2Ftechdocs-e2e-fixture%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Findex.md%3E',
);
});
+
+ it('should render a content addon in sub-pages', () => {
+ cy.visit('/docs/default/Component/techdocs-e2e-fixture');
+
+ cy.contains('e2e Fixture Documentation');
+
+ // open sub-page
+ cy.getTechDocsShadowRoot().within(() => {
+ cy.getTechDocsNavigation().find('a').contains('Sub-page 1').click();
+ });
+
+ // highlight a snippet of text
+ cy.getTechDocsShadowRoot()
+ .find('#section-11')
+ .then($el => {
+ const el = $el[0];
+ const document = el.ownerDocument;
+ const range = document.createRange();
+ range.selectNodeContents(el);
+ document?.getSelection()?.removeAllRanges();
+ document?.getSelection()?.addRange(range);
+ });
+
+ cy.document().trigger('selectionchange');
+
+ // wait for new issue default debounce time
+ cy.wait(600);
+
+ // assert that the new issue button has a right url
+ cy.getTechDocsShadowRoot()
+ .contains('Open new Github issue')
+ .should(
+ 'have.attr',
+ 'href',
+ 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20Section%201.1%C2%B6&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20Section%201.1%C2%B6%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%3A7007%2Fdocs%2Fdefault%2FComponent%2Ftechdocs-e2e-fixture%2Fsub-page-one%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Fsub-page-one.md%3E',
+ );
+ });
});
describe('Navigating within TechDocs', () => {
diff --git a/cypress/yarn.lock b/cypress/yarn.lock
index c667cc6c03..0fc9da99b6 100644
--- a/cypress/yarn.lock
+++ b/cypress/yarn.lock
@@ -7,7 +7,7 @@
resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
-"@cypress/request@^2.88.5":
+"@cypress/request@^2.88.10":
version "2.88.10"
resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce"
integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==
@@ -40,19 +40,19 @@
lodash.once "^4.1.1"
"@types/node@*":
- version "17.0.25"
- resolved "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448"
- integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==
+ version "18.0.0"
+ resolved "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
+ integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
"@types/node@^14.14.31":
- version "14.18.13"
- resolved "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz#6ad4d9db59e6b3faf98dcfe4ca9d2aec84443277"
- integrity sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==
+ version "14.18.21"
+ resolved "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz#0155ee46f6be28b2ff0342ca1a9b9fd4468bef41"
+ integrity sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==
-"@types/sinonjs__fake-timers@^6.0.2":
- version "6.0.4"
- resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz#0ecc1b9259b76598ef01942f547904ce61a6a77d"
- integrity sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==
+"@types/sinonjs__fake-timers@8.1.1":
+ version "8.1.1"
+ resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3"
+ integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==
"@types/sizzle@^2.3.2":
version "2.3.3"
@@ -75,9 +75,9 @@ aggregate-error@^3.0.0:
indent-string "^4.0.0"
ansi-colors@^4.1.1:
- version "4.1.1"
- resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+ version "4.1.3"
+ resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
+ integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
ansi-escapes@^4.3.0:
version "4.3.2"
@@ -113,7 +113,7 @@ asn1@~0.2.3:
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
- integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+ integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
astral-regex@^2.0.0:
version "2.0.0"
@@ -121,14 +121,14 @@ astral-regex@^2.0.0:
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async@^3.2.0:
- version "3.2.3"
- resolved "https://registry.npmjs.org/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
- integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==
+ version "3.2.4"
+ resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
+ integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
at-least-node@^1.0.0:
version "1.0.0"
@@ -138,7 +138,7 @@ at-least-node@^1.0.0:
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
- integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+ integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
aws4@^1.8.0:
version "1.11.0"
@@ -150,10 +150,15 @@ balanced-match@^1.0.0:
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
- integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==
dependencies:
tweetnacl "^0.14.3"
@@ -178,7 +183,15 @@ brace-expansion@^1.1.7:
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
- integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
cachedir@^2.3.0:
version "2.3.0"
@@ -188,7 +201,7 @@ cachedir@^2.3.0:
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
- integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+ integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
chalk@^4.1.0:
version "4.1.2"
@@ -201,12 +214,12 @@ chalk@^4.1.0:
check-more-types@^2.24.0:
version "2.24.0"
resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
- integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=
+ integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==
ci-info@^3.2.0:
- version "3.3.0"
- resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2"
- integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128"
+ integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==
clean-stack@^2.0.0:
version "2.2.0"
@@ -220,7 +233,7 @@ cli-cursor@^3.1.0:
dependencies:
restore-cursor "^3.1.0"
-cli-table3@~0.6.0:
+cli-table3@~0.6.1:
version "0.6.2"
resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a"
integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==
@@ -250,9 +263,9 @@ color-name@~1.1.4:
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
colorette@^2.0.16:
- version "2.0.16"
- resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
- integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
+ version "2.0.19"
+ resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
+ integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
@@ -274,12 +287,12 @@ common-tags@^1.8.0:
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+ integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
cross-spawn@^7.0.0:
version "7.0.3"
@@ -290,24 +303,25 @@ cross-spawn@^7.0.0:
shebang-command "^2.0.0"
which "^2.0.1"
-cypress@^7.3.0:
- version "7.7.0"
- resolved "https://registry.npmjs.org/cypress/-/cypress-7.7.0.tgz#0839ae28e5520536f9667d6c9ae81496b3836e64"
- integrity sha512-uYBYXNoI5ym0UxROwhQXWTi8JbUEjpC6l/bzoGZNxoKGsLrC1SDPgIDJMgLX/MeEdPL0UInXLDUWN/rSyZUCjQ==
+cypress@^10.0.0:
+ version "10.1.0"
+ resolved "https://registry.npmjs.org/cypress/-/cypress-10.1.0.tgz#6514a26c721822a02bc194e9a7f72c3142aea174"
+ integrity sha512-aQ4JVZVib4Xd9FZW8IRZfKelUvqF4y5A+oUbNvn8TlsBmEfIg3m5Xd6Mt6PVU/jHiVJ9Psl905B3ZPnrDcmyuQ==
dependencies:
- "@cypress/request" "^2.88.5"
+ "@cypress/request" "^2.88.10"
"@cypress/xvfb" "^1.2.4"
"@types/node" "^14.14.31"
- "@types/sinonjs__fake-timers" "^6.0.2"
+ "@types/sinonjs__fake-timers" "8.1.1"
"@types/sizzle" "^2.3.2"
arch "^2.2.0"
blob-util "^2.0.2"
bluebird "^3.7.2"
+ buffer "^5.6.0"
cachedir "^2.3.0"
chalk "^4.1.0"
check-more-types "^2.24.0"
cli-cursor "^3.1.0"
- cli-table3 "~0.6.0"
+ cli-table3 "~0.6.1"
commander "^5.1.0"
common-tags "^1.8.0"
dayjs "^1.10.4"
@@ -326,28 +340,28 @@ cypress@^7.3.0:
listr2 "^3.8.3"
lodash "^4.17.21"
log-symbols "^4.0.0"
- minimist "^1.2.5"
+ minimist "^1.2.6"
ospath "^1.2.2"
pretty-bytes "^5.6.0"
- ramda "~0.27.1"
+ proxy-from-env "1.0.0"
request-progress "^3.0.0"
+ semver "^7.3.2"
supports-color "^8.1.1"
tmp "~0.2.1"
untildify "^4.0.0"
- url "^0.11.0"
yauzl "^2.10.0"
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
- integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==
dependencies:
assert-plus "^1.0.0"
dayjs@^1.10.4:
- version "1.11.1"
- resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.1.tgz#90b33a3dda3417258d48ad2771b415def6545eb0"
- integrity sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA==
+ version "1.11.3"
+ resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz#4754eb694a624057b9ad2224b67b15d552589258"
+ integrity sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==
debug@^3.1.0:
version "3.2.7"
@@ -366,12 +380,12 @@ debug@^4.1.1, debug@^4.3.2:
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
- integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==
dependencies:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
@@ -398,7 +412,7 @@ enquirer@^2.3.6:
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
- integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
eventemitter2@^6.4.3:
version "6.4.5"
@@ -446,7 +460,7 @@ extract-zip@2.0.1:
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
- integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+ integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
extsprintf@^1.2.0:
version "1.4.1"
@@ -456,7 +470,7 @@ extsprintf@^1.2.0:
fd-slicer@~1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
- integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
+ integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
dependencies:
pend "~1.2.0"
@@ -470,7 +484,7 @@ figures@^3.2.0:
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
- integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+ integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
form-data@~2.3.2:
version "2.3.3"
@@ -494,7 +508,7 @@ fs-extra@^9.1.0:
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
get-stream@^5.0.0, get-stream@^5.1.0:
version "5.2.0"
@@ -513,19 +527,19 @@ getos@^3.2.1:
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
- integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==
dependencies:
assert-plus "^1.0.0"
glob@^7.1.3:
- version "7.2.0"
- resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
- integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ version "7.2.3"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
- minimatch "^3.0.4"
+ minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
@@ -560,6 +574,11 @@ human-signals@^1.1.1:
resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
indent-string@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
@@ -568,7 +587,7 @@ indent-string@^4.0.0:
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
@@ -616,7 +635,7 @@ is-stream@^2.0.0:
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
- integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
is-unicode-supported@^0.1.0:
version "0.1.0"
@@ -626,17 +645,17 @@ is-unicode-supported@^0.1.0:
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
- integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+ integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
- integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+ integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==
json-schema@0.4.0:
version "0.4.0"
@@ -646,7 +665,7 @@ json-schema@0.4.0:
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
- integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+ integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
jsonfile@^6.0.1:
version "6.1.0"
@@ -670,7 +689,7 @@ jsprim@^2.0.2:
lazy-ass@^1.6.0:
version "1.6.0"
resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513"
- integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM=
+ integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==
listr2@^3.8.3:
version "3.14.0"
@@ -689,7 +708,7 @@ listr2@^3.8.3:
lodash.once@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
- integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
+ integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==
lodash@^4.17.21:
version "4.17.21"
@@ -714,6 +733,13 @@ log-update@^4.0.0:
slice-ansi "^4.0.0"
wrap-ansi "^6.2.0"
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
@@ -736,14 +762,14 @@ mimic-fn@^2.1.0:
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-minimatch@^3.0.4:
+minimatch@^3.1.1:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
-minimist@^1.2.5:
+minimist@^1.2.6:
version "1.2.6"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
@@ -768,7 +794,7 @@ npm-run-path@^4.0.0:
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
@@ -782,7 +808,7 @@ onetime@^5.1.0:
ospath@^1.2.2:
version "1.2.2"
resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b"
- integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=
+ integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==
p-map@^4.0.0:
version "4.0.0"
@@ -794,7 +820,7 @@ p-map@^4.0.0:
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
@@ -804,23 +830,28 @@ path-key@^3.0.0, path-key@^3.1.0:
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
+ integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
- integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+ integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
pify@^2.2.0:
version "2.3.0"
resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
- integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+ integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
pretty-bytes@^5.6.0:
version "5.6.0"
resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
+proxy-from-env@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee"
+ integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==
+
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@@ -834,11 +865,6 @@ pump@^3.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
-punycode@1.3.2:
- version "1.3.2"
- resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
- integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
-
punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
@@ -849,20 +875,10 @@ qs@~6.5.2:
resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
-querystring@0.2.0:
- version "0.2.0"
- resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
- integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
-
-ramda@~0.27.1:
- version "0.27.2"
- resolved "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1"
- integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==
-
request-progress@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe"
- integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=
+ integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==
dependencies:
throttleit "^1.0.0"
@@ -903,6 +919,13 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+semver@^7.3.2:
+ version "7.3.7"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+ dependencies:
+ lru-cache "^6.0.0"
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -991,12 +1014,12 @@ supports-color@^8.1.1:
throttleit@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
- integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=
+ integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==
through@^2.3.8:
version "2.3.8"
resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
- integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+ integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
tmp@~0.2.1:
version "0.2.1"
@@ -1021,14 +1044,14 @@ tslib@^2.1.0:
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
- integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
dependencies:
safe-buffer "^5.0.1"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
- integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+ integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==
type-fest@^0.21.3:
version "0.21.3"
@@ -1036,9 +1059,9 @@ type-fest@^0.21.3:
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
typescript@^4.1.3:
- version "4.6.4"
- resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9"
- integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==
+ version "4.7.4"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
+ integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
universalify@^2.0.0:
version "2.0.0"
@@ -1050,14 +1073,6 @@ untildify@^4.0.0:
resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
-url@^0.11.0:
- version "0.11.0"
- resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
- integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
- dependencies:
- punycode "1.3.2"
- querystring "0.2.0"
-
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
@@ -1066,7 +1081,7 @@ uuid@^8.3.2:
verror@1.10.0:
version "1.10.0"
resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
- integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
@@ -1100,12 +1115,17 @@ wrap-ansi@^7.0.0:
wrappy@1:
version "1.0.2"
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yauzl@^2.10.0:
version "2.10.0"
resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
- integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
+ integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
dependencies:
buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0"
diff --git a/docs/assets/permission/disabled-unregister-entity.png b/docs/assets/permissions/disabled-unregister-entity.png
similarity index 100%
rename from docs/assets/permission/disabled-unregister-entity.png
rename to docs/assets/permissions/disabled-unregister-entity.png
diff --git a/docs/assets/permission/permission-framework-overview.drawio.svg b/docs/assets/permissions/permission-framework-overview.drawio.svg
similarity index 100%
rename from docs/assets/permission/permission-framework-overview.drawio.svg
rename to docs/assets/permissions/permission-framework-overview.drawio.svg
diff --git a/docs/assets/permission/permission-todo-list-page.png b/docs/assets/permissions/permission-todo-list-page.png
similarity index 100%
rename from docs/assets/permission/permission-todo-list-page.png
rename to docs/assets/permissions/permission-todo-list-page.png
diff --git a/docs/assets/search/architecture.drawio.svg b/docs/assets/search/architecture.drawio.svg
index 709a008b43..b85541b804 100644
--- a/docs/assets/search/architecture.drawio.svg
+++ b/docs/assets/search/architecture.drawio.svg
@@ -1,17 +1,36 @@
-
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
@@ -103,11 +122,11 @@
-
+
-
+
@backstage/plugin-xyz
@@ -115,7 +134,7 @@
-
+
@backstage/plugin-xyz
@@ -251,10 +270,7 @@
-
-
-
-
+
@@ -274,11 +290,14 @@
-
+
+
+
+
-
+
-
+
Search API
-
-
+
+
-
+
-
+
Components
@@ -824,11 +843,11 @@
-
+
-
+
-
+
Individual frontend...
-
+
+
+
+
-
+
-
+
Search Cont...
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @backstage/plugin-search-react
+
+
+
+
+
+ @backstage/plugin-search-react
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Components
+
+
+
+
+
+
+
+
+
+
+
+ Search Client
+
+
+
+
+
+
+ Search Client
+
+
+
diff --git a/docs/assets/software-catalog/software-model-core-entities.drawio.svg b/docs/assets/software-catalog/software-model-core-entities.drawio.svg
old mode 100644
new mode 100755
index 2260e5502e..1a8f63f9b2
--- a/docs/assets/software-catalog/software-model-core-entities.drawio.svg
+++ b/docs/assets/software-catalog/software-model-core-entities.drawio.svg
@@ -1,3 +1,4 @@
+
-dependsOn Resource (e.g. SQL Database, S3 bucket, ...)
Resource... consumesAPI API (e.g. OpenAPI, gRPC API, Avro, Dataset, ...)
API... providesAPI Component (e.g. backend service, data pipeline ...)
Component... Viewer does not support full SVG 1.1
\ No newline at end of file
+dependsOn Resource (e.g. SQL Database, S3 bucket, ...)
Resource... consumesAPI API (e.g. OpenAPI, gRPC API, Avro, Dataset, ...)
API... providesAPI Component (e.g. backend service, data pipeline ...)
Component... dependsOn Text is not SVG - cannot display
\ No newline at end of file
diff --git a/docs/assets/software-catalog/software-model-entities.drawio.svg b/docs/assets/software-catalog/software-model-entities.drawio.svg
old mode 100644
new mode 100755
index 7b8b88f224..e14cc93e62
--- a/docs/assets/software-catalog/software-model-entities.drawio.svg
+++ b/docs/assets/software-catalog/software-model-entities.drawio.svg
@@ -1,3 +1,4 @@
+
-Domain partOf System dependsOn partOf Resource (e.g. SQL Database, S3 bucket, ...)
Resource... consumesAPI API (e.g. OpenAPI, gRPC API, Avro, Dataset, ...)
API... providesAPI partOf Component (e.g. backend service, data pipeline ...)
Component... partOf Viewer does not support full SVG 1.1
\ No newline at end of file
+Domain partOf System dependsOn partOf Resource (e.g. SQL Database, S3 bucket, ...)
Resource... consumesAPI API (e.g. OpenAPI, gRPC API, Avro, Dataset, ...)
API... providesAPI partOf Component (e.g. backend service, data pipeline ...)
Component... partOf dependsOn Text is not SVG - cannot display
\ No newline at end of file
diff --git a/docs/auth/add-auth-provider.md b/docs/auth/add-auth-provider.md
index bd2bcd1694..eb8973bec1 100644
--- a/docs/auth/add-auth-provider.md
+++ b/docs/auth/add-auth-provider.md
@@ -1,9 +1,113 @@
---
id: add-auth-provider
-title: Adding authentication providers
-description: Documentation on Adding authentication providers
+title: Contributing New Providers
+description: Documentation on adding new authentication providers
---
+> NOTE: The primary audience for this documentation are contributors to the main
+> Backstage project that want to add support for new authentication providers.
+> While you can follow it to implement your own custom providers it is much
+> more advanced than using our built-in providers.
+
+## How Does Authentication Work?
+
+The Backstage application can use various external authentication providers for
+authentication. An external provider is wrapped using an
+`AuthProviderRouteHandlers` interface for handling authentication. This
+interface consists of four methods. Each of these methods is hosted at an
+endpoint (by default) `/api/auth/[provider]/method`, where `method` performs a
+certain operation as follows:
+
+```
+ /auth/[provider]/start -> Initiate a login from the web page
+ /auth/[provider]/handler/frame -> Handle a finished authentication operation
+ /auth/[provider]/refresh -> Refresh the validity of a login
+ /auth/[provider]/logout -> Log out a logged-in user
+```
+
+The flow is as follows:
+
+1. A user attempts to sign in.
+2. A popup window is opened, pointing to the `auth` endpoint. That endpoint does
+ initial preparations and then re-directs the user to an external
+ authenticator, still inside the popup.
+3. The authenticator validates the user and returns the result of the validation
+ (success OR failure), to the wrapper's endpoint (`handler/frame`).
+4. The `handler/frame` rendered webpage will issue the appropriate response to
+ the webpage that opened the popup window, and the popup is closed.
+5. The user signs out by clicking on a UI interface and the webpage makes a
+ request to logout the user.
+
+## Implementing Your Own Auth Wrapper
+
+The core interface of any auth wrapper is the `AuthProviderRouteHandlers`
+interface. This interface has four methods corresponding to the API described in
+the initial section. Any auth wrapper will have to implement this interface.
+
+When initiating a login, a pop-up window is created by the frontend, to allow
+the user to initiate a login. This login request is done to the `/start`
+endpoint which is handled by the `start` method.
+
+The `start` method re-directs to the external auth provider who authenticates
+the request and re-directs the request to the `/frame/handler` endpoint, which
+is handled by the `frameHandler` method.
+
+The `frameHandler` returns an HTML response, containing a script that does a
+`postMessage` to the frontend window, containing the result of the request.
+The `WebMessageResponse` type is the message sent by the `postMessage` to the
+frontend.
+
+A `postMessageResponse` utility function wraps the logic of generating a
+`postMessage` response that ensures that CORS is successfully handled. This
+function takes an `express.Response`, a `WebMessageResponse` and the URL of the
+frontend (`appOrigin`) as parameters and return an HTML page with the script and
+the message.
+
+There is a helper class for [OAuth2](https://oauth.net/2/) based authentication providers, [OAuthAdapter](../reference/plugin-auth-backend.oauthadapter.md). This class implements the `AuthProviderRouteHandlers` interface
+for you, and instead requires you to implement [OAuthHandlers](../reference/plugin-auth-backend.oauthhandlers.md), which
+is significantly easier.
+
+### Auth Environment Separation
+
+The concept of an `env` is core to the way the auth backend works. It uses an
+`env` query parameter to identify the environment in which the application is
+running (`development`, `staging`, `production`, etc). Each runtime can
+simultaneously support multiple environments at the same time and the right
+handler for each request is identified and dispatched to, based on the `env`
+parameter.
+
+`OAuthEnvironmentHandler` is a utility wrapper for an `OAuthHandlers` that
+implements the `AuthProviderRouteHandlers` interface while supporting multiple
+`env`s.
+
+To instantiate OAuth providers (the same but for different environments), use
+`OAuthEnvironmentHandler.mapConfig`. It's a helper to iterate over a
+configuration object that is a map of environments to configurations. See one of
+the existing OAuth providers for an example of how it is used.
+
+Given the following configuration:
+
+```yaml
+development:
+ clientId: abc
+ clientSecret: secret
+production:
+ clientId: xyz
+ clientSecret: supersecret
+```
+
+The `OAuthEnvironmentHandler.mapConfig(config, envConfig => ...)` call will
+split the config by the top level `development` and `production` keys, and pass
+on each block as `envConfig`.
+
+For convenience, the `AuthProviderFactory` is a factory function that has to be
+implemented which can then generate a `AuthProviderRouteHandlers` for a given
+provider.
+
+All of the supported providers provide an `AuthProviderFactory` that returns an
+`OAuthEnvironmentHandler`, capable of handling authentication for multiple
+environments.
+
## Passport
We chose [Passport](http://www.passportjs.org/) as our authentication platform
@@ -46,13 +150,13 @@ plugins/auth-backend/src/providers/providerA
**`plugins/auth-backend/src/providers/providerA/provider.ts`** defines the
provider class which implements a handler for the chosen framework.
-#### Adding an OAuth based provider
+### Adding an OAuth based provider
If we're adding an `OAuth` based provider we would implement the
-[OAuthProviderHandlers](#OAuthProviderHandlers) interface. By implementing this
+`OAuthHandlers` interface. By implementing this
interface we can use the `OAuthProvider` class provided by `lib/oauth`, meaning
we don't need to implement the full
-[AuthProviderRouteHandlers](#AuthProviderRouteHandlers) interface that providers
+`AuthProviderRouteHandlers` interface that providers
otherwise need to implement.
The provider class takes the provider's options as a class parameter. It also
@@ -65,7 +169,7 @@ export type ProviderAProviderOptions = OAuthProviderOptions & {
// extra options here
}
-export class ProviderAAuthProvider implements OAuthProviderHandlers {
+export class ProviderAAuthProvider implements OAuthHandlers {
private readonly _strategy: ProviderAStrategy;
constructor(options: ProviderAProviderOptions) {
@@ -87,13 +191,10 @@ export class ProviderAAuthProvider implements OAuthProviderHandlers {
}
```
-#### Adding an non-OAuth based provider
-
-_**Note**: We have prioritized OAuth-based providers and non-OAuth providers
-should be considered experimental._
+### Adding an non-OAuth based provider
An non-`OAuth` based provider could implement
-[AuthProviderRouteHandlers](#AuthProviderRouteHandlers) instead.
+`AuthProviderRouteHandlers` instead.
```ts
type ProviderAOptions = {
@@ -119,13 +220,19 @@ export class ProviderAAuthProvider implements AuthProviderRouteHandlers {
}
```
-#### Factory function
+#### Integration Wrapper
-Each provider exports a factory function that instantiates the provider. The
-factory should implement [AuthProviderFactory](#AuthProviderFactory), which
+Each provider exports an object that provides a way to create new instances
+of the provider, along with related utilities like predefined sign-in resolvers.
+
+The object is created using `createAuthProviderIntegration`, with the most
+important part being the `create` method that acts as the factory function
+for our provider.
+
+The factory should return an implementation of `AuthProviderFactory`, which
passes in a object with utilities for configuration, logging, token issuing,
etc. The factory should return an implementation of
-[AuthProviderRouteHandlers](#AuthProviderRouteHandlers).
+`AuthProviderRouteHandlers`.
The factory is what decides the mapping from
[static configuration](../conf/index.md) to the creation of auth providers. For
@@ -133,48 +240,70 @@ example, OAuth providers use `OAuthEnvironmentHandler` to allow for multiple
different configurations, one for each environment, which looks like this;
```ts
-export const createOktaProvider: AuthProviderFactory = ({
- globalConfig,
- config,
- tokenIssuer,
-}) =>
- OAuthEnvironmentHandler.mapConfig(config, envConfig => {
- // read options from config
- const clientId = envConfig.getString('clientId');
- const clientSecret = envConfig.getString('clientSecret');
+export const okta = createAuthProviderIntegration({
+ create(options?: {
+ /**
+ * The profile transformation function used to verify and convert the auth response
+ * into the profile that will be presented to the user.
+ */
+ authHandler?: AuthHandler;
- // instantiate our OAuthProviderHandlers implementation
- const provider = new OktaAuthProvider({
- audience,
- clientId,
- clientSecret,
- callbackUrl,
- });
+ /**
+ * Configure sign-in for this provider, without it the provider can not be used to sign users in.
+ */
+ signIn?: {
+ /**
+ * Maps an auth result to a Backstage identity for the user.
+ */
+ resolver: SignInResolver;
+ };
+ }) {
+ return ({ providerId, globalConfig, config, resolverContext }) =>
+ OAuthEnvironmentHandler.mapConfig(config, envConfig => {
+ // read options from config
+ const clientId = envConfig.getString('clientId');
+ const clientSecret = envConfig.getString('clientSecret');
- // Wrap the OAuthProviderHandlers with OAuthProvider, which implements AuthProviderRouteHandlers
- return OAuthProvider.fromConfig(globalConfig, provider, {
- providerId,
- tokenIssuer,
- });
- });
+ // Use provided auth handler, or create a default one
+ const authHandler: AuthHandler = options?.authHandler
+ ? options.authHandler
+ : async ({ fullProfile, params }) => ({
+ profile: makeProfileInfo(fullProfile, params.id_token),
+ });
+
+ // instantiate our OAuthHandlers implementation
+ const provider = new OktaAuthProvider({
+ audience,
+ clientId,
+ clientSecret,
+ callbackUrl,
+ authHandler,
+ signInResolver: options?.signIn?.resolver,
+ resolverContext,
+ });
+
+ // Wrap the OAuthHandlers with OAuthProvider, which implements AuthProviderRouteHandlers
+ return OAuthProvider.fromConfig(globalConfig, provider, {
+ providerId,
+ tokenIssuer,
+ });
+ });
+ },
+ resolvers: {
+ /**
+ * Looks up the user by matching their email local part to the entity name.
+ */
+ emailLocalPartMatchingUserEntityName: () => commonByEmailLocalPartResolver,
+
+ // ... additional predefined resolvers
+ },
+});
```
The purpose of the different environments is to allow for a single auth-backend
to serve as the authentication service for multiple different frontend
environments, such as local development, staging, and production.
-The factory function for other providers can be a lot simpler, as they might not
-have configuration for each environment. Looking something like this:
-
-```ts
-export const createProviderAProvider: AuthProviderFactory = ({ config }) => {
- const a = config.getString('a');
- const b = config.getString('b');
-
- return new ProviderAAuthProvider({ a, b });
-};
-```
-
#### Verify Callback
> Strategies require what is known as a verify callback. The purpose of a verify
@@ -202,7 +331,7 @@ export { createProviderAProvider } from './provider';
**`plugins/auth-backend/src/providers/factories.ts`** When the `auth-backend`
starts it sets up routing for all the available providers by calling
-`createAuthProviderRouter` on each provider. You need to import the factory
+the factory function of each provider. You need to import the factory
function from the provider and add it to the factory:
```ts
@@ -232,51 +361,3 @@ You can `curl -i localhost:7007/api/auth/providerA/start` and which should
provide a `302` redirect with a `Location` header. Paste the URL from that
header into a web browser and you should be able to trigger the authorization
flow.
-
----
-
-##### OAuthProviderHandlers
-
-```ts
-export interface OAuthProviderHandlers {
- start(
- req: express.Request,
- options: Record,
- ): Promise;
- handler(req: express.Request): Promise<{
- response: AuthResponse;
- refreshToken?: string;
- }>;
- refresh?(
- refreshToken: string,
- scope: string,
- ): Promise>;
- logout?(): Promise;
-}
-```
-
-##### AuthProviderRouteHandlers
-
-```ts
-export interface AuthProviderRouteHandlers {
- start(req: express.Request, res: express.Response): Promise;
- frameHandler(req: express.Request, res: express.Response): Promise;
- refresh?(req: express.Request, res: express.Response): Promise;
- logout(req: express.Request, res: express.Response): Promise;
-}
-```
-
-##### AuthProviderFactory
-
-```ts
-export type AuthProviderFactoryOptions = {
- globalConfig: AuthProviderConfig;
- config: Config;
- logger: Logger;
- tokenIssuer: TokenIssuer;
-};
-
-export type AuthProviderFactory = (
- options: AuthProviderFactoryOptions,
-) => AuthProviderRouteHandlers;
-```
diff --git a/docs/auth/auth-backend-classes.md b/docs/auth/auth-backend-classes.md
deleted file mode 100644
index 5b5950f6c3..0000000000
--- a/docs/auth/auth-backend-classes.md
+++ /dev/null
@@ -1,206 +0,0 @@
----
-id: auth-backend-classes
-title: Auth backend classes
-description: Documentation on Auth backend classes
----
-
-## How Does Authentication Work?
-
-The Backstage application can use various external authentication providers for
-authentication. An external provider is wrapped using an
-`AuthProviderRouteHandlers` interface for handling authentication. This
-interface consists of four methods. Each of these methods is hosted at an
-endpoint (by default) `/api/auth/[provider]/method`, where `method` performs a
-certain operation as follows:
-
-```
- /auth/[provider]/start -> Initiate a login from the web page
- /auth/[provider]/handler/frame -> Handle a finished authentication operation
- /auth/[provider]/refresh -> Refresh the validity of a login
- /auth/[provider]/logout -> Log out a logged-in user
-```
-
-The flow is as follows:
-
-1. A user attempts to sign in.
-2. A popup window is opened, pointing to the `auth` endpoint. That endpoint does
- initial preparations and then re-directs the user to an external
- authenticator, still inside the popup.
-3. The authenticator validates the user and returns the result of the validation
- (success OR failure), to the wrapper's endpoint (`handler/frame`).
-4. The `handler/frame` rendered bยดwebpage will issue the appropriate response to
- the webpage that opened the popup window, and the popup is closed.
-5. The user signs out by clicking on a UI interface and the webpage makes a
- request to logout the user.
-
-There are currently two different classes for two authentication mechanisms that
-implement this interface: an `OAuthAdapter` for [OAuth](https://oauth.net/2/)
-based mechanisms and a `SAMLAuthProvider` for
-[SAML](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html).
-
-If you do not have an `OAuth2` or `SAML` based authentication provider, look in
-the section [below](#implementing-your-own-auth-wrapper).
-
-### OAuth Mechanisms
-
-For more information on how these methods are used and for which purpose, refer
-to the [OAuth documentation](oauth.md).
-
-Currently OAuth is assumed to be the de facto authentication mechanism for
-Backstage based applications.
-
-Backstage comes with a "batteries-included" set of supported commonly used OAuth
-providers: Okta, GitHub, Google, GitLab, and a generic OAuth2 provider. For a
-list of available providers, look at the available wrappers in
-`backstage/plugins/auth-backend/src/providers/`.
-
-All of these use the **authorization flow** of OAuth2 to implement
-authentication.
-
-If your authentication provider is any of the above mentioned providers, you can
-configure them by setting the right variables in `app-config.yaml` under the
-`auth` section.
-
-### SAML
-
-The SAML Provider is currently under development. Additional validation and
-profile handling is still required before use in production.
-
-To configure the SAML Auth provider, look at the configuration parameters
-supported by
-[Passport-SAML](https://github.com/node-saml/passport-saml#config-parameter-details)
-under the `auth.providers.saml` key
-
-For security reasons, validate that the response from the IdP is indeed signed
-by also providing the `cert` configuration.
-
-### Configuration
-
-Each authentication provider (except SAML) needs six parameters: an OAuth client
-ID, a client secret, an authorization endpoint, a token endpoint, an optional
-list of scopes (as a string separated by spaces) that may be required by the
-OAuth2 Server to enable end-user sign-on, and an app origin. The app origin is
-the URL at which the frontend of the application is hosted, and it is read from
-the `app.baseUrl` config. This is required because the application opens a popup
-window to perform the authentication, and once the flow is completed, the popup
-window sends a `postMessage` to the frontend application to indicate the result
-of the operation. Also this URL is used to verify that authentication requests
-are coming from only this endpoint.
-
-These values are configured via the `app-config.yaml` present in the root of
-your app folder.
-
-```
-auth:
- providers:
- google:
- development:
- clientId: ${AUTH_GOOGLE_CLIENT_ID}
- clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET}
- github:
- development:
- clientId: ${AUTH_GITHUB_CLIENT_ID}
- clientSecret: ${AUTH_GITHUB_CLIENT_SECRET}
- enterpriseInstanceUrl: ${AUTH_GITHUB_ENTERPRISE_INSTANCE_URL}
- gitlab:
- development:
- clientId: ${AUTH_GITLAB_CLIENT_ID}
- oauth2:
- development:
- clientId: ${AUTH_OAUTH2_CLIENT_ID}
- clientSecret: ${AUTH_OAUTH2_CLIENT_SECRET}
- authorizationUrl: ${AUTH_OAUTH2_AUTH_URL}
- tokenUrl: ${AUTH_OAUTH2_TOKEN_URL}
- scope: ${AUTH_OAUTH2_SCOPE}
- saml:
- entryPoint: ${AUTH_SAML_ENTRY_POINT}
- issuer: ${AUTH_SAML_ISSUER}
- ...
-```
-
-## Implementing Your Own Auth Wrapper
-
-The core interface of any auth wrapper is the `AuthProviderRouteHandlers`
-interface. This interface has four methods corresponding to the API described in
-the initial section. Any auth wrapper will have to implement this interface.
-
-When initiating a login, a pop-up window is created by the frontend, to allow
-the user to initiate a login. This login request is done to the `/start`
-endpoint which is handled by the `start` method.
-
-The `start` method re-directs to the external auth provider who authenticates
-the request and re-directs the request to the `/frame/handler` endpoint, which
-is handled by the `frameHandler` method.
-
-The `frameHandler` returns an HTML response, containing a script that does a
-`postMessage` to the frontend's window, containing the result of the request.
-The `WebMessageResponse` type is the message sent by the `postMessage` to the
-frontend.
-
-A `postMessageResponse` utility function wraps the logic of generating a
-`postMessage` response that ensures that CORS is successfully handled. This
-function takes an `express.Response`, a `WebMessageResponse` and the URL of the
-frontend (`appOrigin`) as parameters and return an HTML page with the script and
-the message.
-
-### OAuth Wrapping Interfaces.
-
-Each OAuth external provider is supported by a corresponding
-[Passport](https://github.com/jaredhanson/passport) strategy. For a generic
-OAuth2 provider, passport has a `passport-oauth2` strategy. The strategy class
-handles the implementation details of working with each provider.
-
-Each strategy is wrapped by an `OAuthHandlers` interface.
-
-This interface cannot be directly used as an Express HTTP request handler. To do
-so, `OAuthHandlers` are wrapped in an `OAuthAdapter`, which implements the
-`AuthProviderRouterHandlers` interface.
-
-#### Env
-
-The concept of an `env` is core to the way the auth backend works. It uses an
-`env` query parameter to identify the environment in which the application is
-running (`development`, `staging`, `production`, etc). Each runtime can
-simultaneously support multiple environments at the same time and the right
-handler for each request is identified and dispatched to, based on the `env`
-parameter.
-
-`OAuthEnvironmentHandler` is a utility wrapper for an `OAuthHandlers` that
-implements the `AuthProviderRouteHandlers` interface while supporting multiple
-`env`s.
-
-To instantiate OAuth providers (the same but for different environments), use
-`OAuthEnvironmentHandler.mapConfig`. It's a helper to iterate over a
-configuration object that is a map of environments to configurations. See one of
-the existing OAuth providers for an example of how it is used.
-
-Given the following configuration:
-
-```yaml
-development:
- clientId: abc
- clientSecret: secret
-production:
- clientId: xyz
- clientSecret: supersecret
-```
-
-The `OAuthEnvironmentHandler.mapConfig(config, envConfig => ...)` call will
-split the config by the top level `development` and `production` keys, and pass
-on each block as `envConfig`.
-
-For convenience, the `AuthProviderFactory` is a factory function that has to be
-implemented which can then generate a `AuthProviderRouteHandlers` for a given
-provider.
-
-All of the supported providers provide an `AuthProviderFactory` that returns an
-`OAuthEnvironmentHandler`, capable of handling authentication for multiple
-environments.
-
-### OAuth2 Provider
-
-The `oauth2` provider abstracts a generic **OAuth2 + OIDC** based authentication
-provider. What this means is that after the application has been given
-permission by the user, the `authorization code` will be exchanged for an
-`access_token`, a `refresh_token` and an `id_token`. This `id_token` is used to
-obtain an email id of the user, which is then used for creating the session.
diff --git a/docs/auth/identity-resolver.md b/docs/auth/identity-resolver.md
index 686c9a9dab..b314954105 100644
--- a/docs/auth/identity-resolver.md
+++ b/docs/auth/identity-resolver.md
@@ -12,6 +12,37 @@ If you want to use an auth provider to sign in users, you need to explicitly con
it have sign-in enabled and also tell it how the external identities should
be mapped to user identities within Backstage.
+## Quick Start
+
+> See [providers](../reference/plugin-auth-backend.providers.md)
+> for a full list of auth providers and their built-in sign-in resolvers.
+
+Backstage projects created with `npx @backstage/create-app` come configured with a
+sign-in resolver for GitHub guest access. This resolver makes all users share
+a single "guest" identity and is only intended as a minimum requirement to quickly
+get up and running. You can replace `github` for any of the other providers if you need.
+
+This resolver should not be used in production, as it uses a single shared identity,
+and has no restrictions on who is able to sign-in. Be sure to read through the rest
+of this page to understand the Backstage identity system once you need to install
+a resolver for your production environment.
+
+The guest resolver can be useful for testing purposes too, and it looks like this:
+
+```ts
+signIn: {
+ resolver(_, ctx) {
+ const userRef = 'user:default/guest'
+ return ctx.issueToken({
+ claims: {
+ sub: userRef,
+ ent: [userRef],
+ },
+ }),
+ },
+},
+```
+
## Backstage User Identity
A user identity within Backstage is built up from two pieces of information, a
@@ -59,6 +90,11 @@ the given auth provider, as well as a context object that contains various helpe
for looking up users and issuing tokens. There are also a number of built-in sign-in
resolvers that can be used, which are covered a bit further down.
+Note that while it possible to configure multiple auth providers to be used for sign-in,
+you should take care when doing so. It is best to make sure that the different auth
+providers either do not have any user overlap, or that any users that are able to log
+in with multiple providers always end up with the same Backstage identity.
+
### Custom Resolver Example
Let's look at an example of a custom sign-in resolver for the Google auth provider.
@@ -210,6 +246,11 @@ is that it can be tricky to determine the ownership references, although it can
be achieved for example through a lookup to an external service. You typically
want to at least use the user itself as a lone ownership reference.
+Because we no longer use the catalog as an allow-list of users, it is often important
+that you limit what users are allowed to sign in. This could be a simple email domain
+check like in the example below, or you might for example look up the GitHub organizations
+that the user belongs to using the user access token in the provided result object.
+
```ts
import { DEFAULT_NAMESPACE, stringifyEntityRef, } from '@backstage/catalog-model';
@@ -220,8 +261,14 @@ async ({ profile }, ctx) => {
'Login failed, user profile does not contain an email',
);
}
- // We again use the local part of the email as the user name.
- const [localPart] = profile.email.split('@');
+ // Split the email into the local part and the domain.
+ const [localPart, domain] = profile.email.split('@');
+
+ // Next we verify the email domain. It is recommended to include this
+ // kind of check if you don't look up the user in an external service.
+ if (domain !== 'acme.org') {
+ throw new Error('Login failed, user email domain check failed');
+ }
// By using `stringifyEntityRef` we ensure that the reference is formatted correctly
const userEntityRef = stringifyEntityRef({
diff --git a/docs/auth/index.md b/docs/auth/index.md
index c34d244886..e713e722ef 100644
--- a/docs/auth/index.md
+++ b/docs/auth/index.md
@@ -185,6 +185,24 @@ const app = createApp({
When using multiple auth providers like this, it's important that you configure the different
sign-in resolvers so that they resolve to the same identity regardless of the method used.
+## Scaffolder Configuration (Software Templates)
+
+If you want to use the authentication capabilities of the [Repository Picker](../features/software-templates/writing-templates.md#the-repository-picker) inside your software templates you will need to configure the [`ScmAuthApi`](https://backstage.io/docs/reference/integration-react.scmauthapi) alongside your authentication provider. It is an API used to authenticate towards different SCM systems in a generic way, based on what resource is being accessed.
+
+To set it up, you'll need to add an API factory entry to `packages/app/src/apis.ts`. The example below sets up the `ScmAuthApi` for an already configured GitLab authentication provider:
+
+```ts
+createApiFactory({
+ api: scmAuthApiRef,
+ deps: {
+ gitlabAuthApi: gitlabAuthApiRef,
+ },
+ factory: ({ gitlabAuthApi }) => ScmAuth.forGitlab(gitlabAuthApi),
+});
+```
+
+In case you are using a custom authentication providers, you might need to add a [custom `ScmAuthApi` implementation](./index.md#custom-scmauthapi-implementation).
+
## For Plugin Developers
The Backstage frontend core APIs provide a set of Utility APIs for plugin developers
diff --git a/docs/auth/oauth2-proxy/provider.md b/docs/auth/oauth2-proxy/provider.md
index 966596e268..ca3c40f5db 100644
--- a/docs/auth/oauth2-proxy/provider.md
+++ b/docs/auth/oauth2-proxy/provider.md
@@ -6,7 +6,7 @@ description: Adding OAuth2Proxy as an authentication provider in Backstage
---
The Backstage `@backstage/plugin-auth-backend` package comes with an
-`oauth2proxy` authentication provider that can authenticate users by using a
+`oauth2Proxy` authentication provider that can authenticate users by using a
[oauth2-proxy](https://github.com/oauth2-proxy/oauth2-proxy) in front of an
actual Backstage instance. This enables to reuse existing authentications within
a cluster. In general the `oauth2-proxy` supports all OpenID Connect providers,
@@ -21,17 +21,17 @@ The provider configuration can be added to your `app-config.yaml` under the root
```yaml
auth:
providers:
- oauth2proxy: {}
+ oauth2Proxy: {}
```
Right now no configuration options are supported, but the empty object is needed
to enable the provider in the auth backend.
-To use the `oauth2proxy` provider you must also configure it with a sign-in resolver.
+To use the `oauth2Proxy` provider you must also configure it with a sign-in resolver.
For more information about the sign-in process in general, see the
[Sign-in Identities and Resolvers](../identity-resolver.md) documentation.
-For the `oauth2proxy` provider, the sign-in result is quite different than other providers.
+For the `oauth2Proxy` provider, the sign-in result is quite different than other providers.
Because it's a proxy provider that can be configured to forward information through
arbitrary headers, the auth result simply just gives you access to the HTTP headers
of the incoming request. Using these you can either extract the information directly,
@@ -40,19 +40,22 @@ or grab ID or access tokens to look up additional information and/or validate th
A simple sign-in resolver might for example look like this:
```ts
-providers.oauth2Proxy.create({
- signIn: {
- async resolver({ result }, ctx) {
- const name = result.getHeader('x-forwarded-user');
- if (!name) {
- throw new Error('Request did not contain a user')
- }
- return ctx.signInWithCatalogUser({
- entityRef: { name },
- });
+providerFactories: {
+ ...defaultAuthProviderFactories,
+ oauth2Proxy: providers.oauth2Proxy.create({
+ signIn: {
+ async resolver({ result }, ctx) {
+ const name = result.getHeader('x-forwarded-user');
+ if (!name) {
+ throw new Error('Request did not contain a user')
+ }
+ return ctx.signInWithCatalogUser({
+ entityRef: { name },
+ });
+ },
},
- },
-}),
+ }),
+},
```
## Adding the provider to the Backstage frontend
@@ -65,7 +68,7 @@ installed in `packages/app/src/App.tsx` like this:
const app = createApp({
components: {
-+ SignInPage: props => ,
++ SignInPage: props => ,
```
-See the [Sign-In with Proxy Providers](../index.md#sign-in-with-proxy-providers) section for more information.
+See [Sign-In with Proxy Providers](../index.md#sign-in-with-proxy-providers) for pointers on how to set up the sign-in page to also work smoothly for local development.
diff --git a/docs/deployment/helm.md b/docs/deployment/helm.md
deleted file mode 100644
index cbfcb1bc57..0000000000
--- a/docs/deployment/helm.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-id: helm
-title: Deploying with Helm
-description: How to deploy Backstage with Helm and Kubernetes
-sidebar_label: Helm
----
-
-An example Backstage app can be deployed in Kubernetes using the
-[Backstage Helm charts](https://github.com/backstage/backstage/tree/master/contrib/chart/backstage).
-
-First, choose a DNS name where Backstage will be hosted, and create a YAML file
-for your custom configuration.
-
-```yaml
-appConfig:
- app:
- baseUrl: https://backstage.mydomain.com
- title: Backstage
- backend:
- baseUrl: https://backstage.mydomain.com
- cors:
- origin: https://backstage.mydomain.com
- lighthouse:
- baseUrl: https://backstage.mydomain.com/lighthouse-api
- techdocs:
- storageUrl: https://backstage.mydomain.com/api/techdocs/static/docs
- requestUrl: https://backstage.mydomain.com/api/techdocs
-```
-
-Then use it to run:
-
-```bash
-git clone https://github.com/backstage/backstage.git
-cd backstage/contrib/chart/backstage
-helm dependency update
-helm install -f backstage-mydomain.yaml backstage .
-```
-
-This command will deploy the following pieces:
-
-- Backstage frontend
-- Backstage backend with scaffolder and auth plugins
-- (optional) a PostgreSQL instance
-- lighthouse plugin
-- ingress
-
-After a few minutes Backstage should be up and running in your cluster under the
-DNS specified earlier.
-
-Make sure to create the appropriate DNS entry in your infrastructure. To find
-the public IP address run:
-
-```bash
-$ kubectl get ingress
-NAME HOSTS ADDRESS PORTS AGE
-backstage-ingress * 123.1.2.3 80 17m
-```
-
-> **NOTE**: this is not a production ready deployment.
-
-For more information on how to customize the deployment check the
-[README](https://github.com/backstage/backstage/tree/master/contrib/chart/backstage/README.md).
diff --git a/docs/deployment/index.md b/docs/deployment/index.md
index 621870ea6f..da2c29ba23 100644
--- a/docs/deployment/index.md
+++ b/docs/deployment/index.md
@@ -29,9 +29,7 @@ This method is covered in [Building a Docker image](docker.md) and
There is also an example of deploying on [Heroku](heroku.md), which only
requires the first two steps.
-An example of deploying Backstage with a [Helm chart](helm.md), a common pattern
-in AWS, is also available. There is also a contrib guide to deploying Backstage
-with
+There is also a contrib guide to deploying Backstage with
[AWS Fargate and Aurora PostgreSQL](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/aws-fargate-deployment.md).
Please consider contributing other deployment guides if you get Backstage set up
diff --git a/docs/features/kubernetes/installation.md b/docs/features/kubernetes/installation.md
index ec0355c7d8..3b0895dd23 100644
--- a/docs/features/kubernetes/installation.md
+++ b/docs/features/kubernetes/installation.md
@@ -33,10 +33,14 @@ const serviceEntityPage = (
{/* other tabs... */}
-
+
```
+**Notes:**
+
+- The optional `refreshIntervalMs` property on the `EntityKubernetesContent` defines the interval in which the content automatically refreshes, if not set this will default to 10 seconds.
+
That's it! But now, we need the Kubernetes Backend plugin for the frontend to
work.
diff --git a/docs/features/search/README.md b/docs/features/search/README.md
index a151da1736..f1744d4d80 100644
--- a/docs/features/search/README.md
+++ b/docs/features/search/README.md
@@ -10,76 +10,23 @@ description: Backstage Search lets you find the right information you are lookin
## What is it?
-Backstage Search lets you find the right information you are looking for in the
-Backstage ecosystem.
+Backstage Search lets you find the right information you are looking for in the Backstage ecosystem.
## Features
-- A federated, faceted search, searching across all entities registered in your
- Backstage instance.
+- A federated, faceted search, searching across all entities registered in your Backstage instance.
- A search that lets you plug in your own search engine of choice.
-- A standardized search API where you can choose to index other plugins data.
+- A standardized search API where you can choose to index data from other plugins.
## Project roadmap
-| Version | Description |
-| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| Backstage Search Pre-Alpha โ
| Search Frontend letting you search through the entities of the software catalog. [See Pre-Alpha Use Cases.](#backstage-search-pre-alpha) |
-| Backstage Search Alpha โ
| Basic โout-of-the-boxโ in-memory indexing process of entities, and their metadata, registered to the Software Catalog. [See Alpha Use Cases](#backstage-search-alpha). |
-| Backstage Search Beta โ
| At least one production-ready search engine that supports the same use-cases as in the alpha. [See Beta Use Cases](#backstage-search-beta). |
-| [Backstage Search 1.0 โ] | A stable Search API for plugin developers to add search to their plugins, and app integrators to expose that to their users. [See 1.0 Use Cases](#backstage-search-1.0). |
+### Now
-## Use Cases
+**Backstage Search 1.0**
-#### Backstage Search Pre-Alpha
-
-The pre-alpha is intended to solve for the following user stories, but will get
-there by means of a front-end only, non-extensible MVP.
-
-- As a software engineer I should be able to navigate to a search page and
- search for entities registered in the Software Catalog.
-- As a software engineer I should be able to use the search input field in the
- sidebar to search for entities registered in the Software Catalog.
-- As a software engineer I should be able to see the number of results my search
- returned.
-- As a software engineer I should be able to filter on metadata (kind,
- lifecycle) when Iโve performed a search.
-- As a software engineer I should be able to hide the filters if I donโt need to
- use them.
-
-#### Backstage Search Alpha
-
-We will consider Backstage Search to be in alpha when the above use-cases are
-met, but built on top of a flexible, extensible platform.
-
-- As an integrator, I should be able to provide all of the pre-alpha experiences
- to my users if I choose, but also be able to customize the experience using a
- composable set of components.
-- As a plugin developer, I should have a standard way to expose my plugin's data
- to Backstage Search.
-- As an integrator, I should still be able to expose everything in the Software
- Catalog in search, but it should be possible to customize what is searchable.
-- As an integrator, although I should be able to customize all of the above, it
- should be possible to have the pre-alpha user experiences covered without
- having to set up and configure a search engine.
-
-#### Backstage Search Beta
-
-We will consider Backstage Search to be in a beta phase when the above use-cases
-are met, and can be deployed using a production-ready search engine.
-
-- As an integrator, I should be able to power my Backstage Search experience
- (including querying and indexing) using a production-ready search engine like
- ElasticSearch.
-- As an integrator, I should be able to configure the connection to my search
- engine in `app_config.yaml`.
-- As an integrator, I should be able to tune the queries sent to my chosen
- search engine according to my organization's needs, but a sensible default
- query should be in place so that I am not required to do so.
-
-#### Backstage Search 1.0
+A stable Search API for plugin developers to add search to their plugins, and app integrators to expose that to their users.
We will consider Backstage Search to be 1.0 when the above
use-cases are met, and an ecosystem of search-enabled plugins are available and
@@ -92,9 +39,23 @@ stable.
how to customize and extend search in my Backstage instance to meet my
organization's needs.
-more to come...
+### Next
-## Search Engines Supported
+_Not specified_
+
+### Someday/Maybe
+
+_Not specified_
+
+### Done
+
+See [Done](#done) below for a list of completed roadmap items.
+
+## Supported
+
+The following sections show the search engines and plugins currently supported by Backstage Search.
+
+### Search engines
See [Backstage Search Architecture](architecture.md) to get an overview of how
the search engines are used.
@@ -108,11 +69,11 @@ the search engines are used.
[Reach out to us](#get-involved) if you want to chat about support for more
search engines.
-## Plugins Integrated with Search
+### Plugins integrated with Backstage Search
| Plugin | Support Status |
| ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------- |
-| Catalog | โ
|
+| Software Catalog | โ
|
| [TechDocs](./how-to-guides.md#how-to-index-techdocs-documents) | โ
|
| [Stack Overflow](https://github.com/backstage/backstage/blob/master/plugins/stack-overflow-backend/README.md#index-stack-overflow-questions-to-search) | โ
|
@@ -131,8 +92,62 @@ plugins integrated to search.
| Backend Plugin Module | @backstage/plugin-search-backend-module-elasticsearch |
| Backend Plugin Module | @backstage/plugin-search-backend-module-pg |
-## Get Involved
+## Get involved
For any questions, feedback, or to help move search forward, reach out to us in
-the `#search` channel of our
+the **#search** channel of our
[Discord chatroom](https://github.com/backstage/backstage#community).
+
+## Done
+
+**Backstage Search Pre-Alpha**
+
+Search Frontend letting you search through the entities of the software catalog.
+
+The pre-alpha is intended to solve for the following user stories, but will get
+there by means of a front-end only, non-extensible MVP.
+
+- As a software engineer I should be able to navigate to a search page and
+ search for entities registered in the Software Catalog.
+- As a software engineer I should be able to use the search input field in the
+ sidebar to search for entities registered in the Software Catalog.
+- As a software engineer I should be able to see the number of results my search
+ returned.
+- As a software engineer I should be able to filter on metadata (kind,
+ lifecycle) when Iโve performed a search.
+- As a software engineer I should be able to hide the filters if I donโt need to
+ use them.
+
+**Backstage Search Alpha**
+
+Basic โout-of-the-boxโ in-memory indexing process of entities, and their metadata, registered to the Software Catalog.
+
+We will consider Backstage Search to be in alpha when the above use-cases are
+met, but built on top of a flexible, extensible platform.
+
+- As an integrator, I should be able to provide all of the pre-alpha experiences
+ to my users if I choose, but also be able to customize the experience using a
+ composable set of components.
+- As a plugin developer, I should have a standard way to expose my plugin's data
+ to Backstage Search.
+- As an integrator, I should still be able to expose everything in the Software
+ Catalog in search, but it should be possible to customize what is searchable.
+- As an integrator, although I should be able to customize all of the above, it
+ should be possible to have the pre-alpha user experiences covered without
+ having to set up and configure a search engine.
+
+**Backstage Search Beta**
+
+At least one production-ready search engine that supports the same use-cases as in the alpha.
+
+We will consider Backstage Search to be in a beta phase when the above use-cases
+are met, and can be deployed using a production-ready search engine.
+
+- As an integrator, I should be able to power my Backstage Search experience
+ (including querying and indexing) using a production-ready search engine like
+ ElasticSearch.
+- As an integrator, I should be able to configure the connection to my search
+ engine in **app_config.yaml**.
+- As an integrator, I should be able to tune the queries sent to my chosen
+ search engine according to my organization's needs, but a sensible default
+ query should be in place so that I am not required to do so.
diff --git a/docs/features/search/getting-started.md b/docs/features/search/getting-started.md
index 14ad523740..d0e13eda55 100644
--- a/docs/features/search/getting-started.md
+++ b/docs/features/search/getting-started.md
@@ -18,7 +18,7 @@ If you haven't setup Backstage already, start
```bash
# From your Backstage root directory
-yarn add --cwd packages/app @backstage/plugin-search
+yarn add --cwd packages/app @backstage/plugin-search @backstage/plugin-search-react
```
Create a new `packages/app/src/components/search/SearchPage.tsx` file in your
@@ -33,7 +33,7 @@ import {
SearchResult,
DefaultResultListItem,
SearchFilter,
-} from '@backstage/plugin-search';
+} from '@backstage/plugin-search-react';
import { CatalogResultListItem } from '@backstage/plugin-catalog';
export const searchPage = (
@@ -213,7 +213,7 @@ apiRouter.use('/search', await search(searchEnv));
### Frontend
-The Search Plugin exposes several default filter types as static properties,
+The Search Plugin web library (`@backstage/plugin-search-react`) exposes several default filter types as static properties,
including ` ` and ` `. These allow
you to provide values relevant to your Backstage instance that, when selected,
get passed to the backend.
@@ -237,7 +237,7 @@ If you have advanced filter needs, you can specify your own filter component
like this (although new core filter contributions are welcome):
```tsx
-import { useSearch, SearchFilter } from '@backstage/plugin-search';
+import { useSearch, SearchFilter } from '@backstage/plugin-search-react';
const MyCustomFilter = () => {
// Note: filters contain filter data from other filter components. Be sure
diff --git a/docs/features/search/search-engines.md b/docs/features/search/search-engines.md
index f1fd4bd62b..9bb8b8c343 100644
--- a/docs/features/search/search-engines.md
+++ b/docs/features/search/search-engines.md
@@ -102,6 +102,31 @@ import { Client } from '@elastic/elastic-search';
const client = searchEngine.newClient(options => new Client(options));
```
+#### Set custom index template
+
+The elasticsearch engine gives you the ability to set a custom index template if needed.
+
+> Index templates define settings, mappings, and aliases that can be applied automatically to new indices.
+
+```typescript
+// app/backend/src/plugins/search.ts
+const searchEngine = await ElasticSearchSearchEngine.initialize({
+ logger: env.logger,
+ config: env.config,
+});
+
+searchEngine.setIndexTemplate({
+ name: '',
+ body: {
+ index_patterns: [''],
+ template: {
+ mappings: {},
+ settings: {},
+ },
+ },
+});
+```
+
## Example configurations
### AWS
diff --git a/docs/features/software-catalog/descriptor-format.md b/docs/features/software-catalog/descriptor-format.md
index 86c832e3d2..81e3604ffe 100644
--- a/docs/features/software-catalog/descriptor-format.md
+++ b/docs/features/software-catalog/descriptor-format.md
@@ -55,6 +55,7 @@ metadata:
- url: https://admin.example-org.com
title: Admin Dashboard
icon: dashboard
+ type: admin-dashboard
spec:
type: website
lifecycle: production
@@ -83,7 +84,8 @@ This is the same entity as returned in JSON from the software catalog API:
{
"url": "https://admin.example-org.com",
"title": "Admin Dashboard",
- "icon": "dashboard"
+ "icon": "dashboard",
+ "type": "admin-dashboard"
}
],
"tags": ["java"],
@@ -353,6 +355,7 @@ Fields of a link are:
| `url` | String | [Required] A `url` in a standard `uri` format (e.g. `https://example.com/some/page`) |
| `title` | String | [Optional] A user friendly display name for the link. |
| `icon` | String | [Optional] A key representing a visual icon to be displayed in the UI. |
+| `type` | String | [Optional] An optional value to categorize links into specific groups. |
_NOTE_: The `icon` field value is meant to be a semantic key that will map to a
specific icon that may be provided by an icon library (e.g. `material-ui`
@@ -362,6 +365,8 @@ Backstage integrator will ultimately be left to provide the appropriate icon
component mappings. A generic fallback icon would be provided if a mapping
cannot be resolved.
+The semantics of the `type` field are undefined. The adopter is free to define their own set of types and utilize them as they wish. Some potential use cases can be to utilize the type field to validate certain links exist on entities or to create customized UI components for specific link types.
+
## Common to All Kinds: Relations
The `relations` root field is a read-only list of relations, between the current
diff --git a/docs/features/software-catalog/system-model.md b/docs/features/software-catalog/system-model.md
index eedb94d02e..8a7e0cd30a 100644
--- a/docs/features/software-catalog/system-model.md
+++ b/docs/features/software-catalog/system-model.md
@@ -33,8 +33,8 @@ tracked in source control, or use some existing open source or commercial
software.
A component can implement APIs for other components to consume. In turn it might
-depend on APIs implemented by other components, or resources that are attached
-to it at runtime.
+consume APIs implemented by other components, or directly depend on components or
+resources that are attached to it at runtime.
### API
diff --git a/docs/features/software-catalog/well-known-annotations.md b/docs/features/software-catalog/well-known-annotations.md
index 4fa71329dd..24464dd700 100644
--- a/docs/features/software-catalog/well-known-annotations.md
+++ b/docs/features/software-catalog/well-known-annotations.md
@@ -353,6 +353,19 @@ to `scm-only`, the plugin will only take into account files stored in source
control (e.g. ignoring generated code). If set to `enabled`, all files covered
by a coverage report will be taken into account.
+### vault.io/secrets-path
+
+```yaml
+# Example:
+metadata:
+ annotations:
+ vault.io/secrets-path: test/backstage
+```
+
+The value of this annotation contains the path to the secrets of the entity in
+Vault. If not present when the Vault plugin is in use, a message will be shown
+instead, letting the user know what is missing in the `catalog-info.yaml`.
+
## Deprecated Annotations
The following annotations are deprecated, and only listed here to aid in
diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md
index 0163877a8b..ff9962d8d4 100644
--- a/docs/features/software-templates/writing-templates.md
+++ b/docs/features/software-templates/writing-templates.md
@@ -397,6 +397,29 @@ There's also the ability to pass additional scopes when requesting the `oauth`
token from the user, which you can do on a per-provider basis, in case your
template can be published to multiple providers.
+Note, that you will need to configure an [authentication provider](../../auth/index.md#configuring-authentication-providers), alongside the
+[`ScmAuthApi`](../../auth/index.md#scaffolder-configuration-software-templates) for your source code management (SCM) service to make this feature work.
+
+### Accessing the signed-in users details
+
+Sometimes when authoring templates, you'll want to access the user that is running the template, and get details from the profile or the users `Entity` in the Catalog.
+
+If you have enabled a sign in provider and have a [sign in resolver](../../auth/identity-resolver.md) that points to a user in the Catalog, then you can use the `${{ user.entity }}` templating expression to access the raw entity from the Catalog.
+
+This can be particularly useful if you have processors setup in the Catalog to write `spec.profile.email` of the `User Entities` to reference them and pass them into actions like below:
+
+```yaml
+ steps:
+ action: publish:github
+ ...
+ input:
+ ...
+ gitAuthorName: ${{ user.entity.metadata.name }}
+ gitAuthorEmail: ${{ user.entity.spec.profile.email }}
+```
+
+You also have access to `user.entity.metadata.annotations` too, so if you have some other additional information stored in there, you reference those too.
+
### The Owner Picker
When the scaffolder needs to add new components to the catalog, it needs to have
diff --git a/docs/features/techdocs/README.md b/docs/features/techdocs/README.md
index 5ac275b8b4..761a247819 100644
--- a/docs/features/techdocs/README.md
+++ b/docs/features/techdocs/README.md
@@ -21,14 +21,44 @@ Today, it is one of the core products in Spotifyโs developer experience offeri
- Deploy TechDocs no matter how your software environment is set up.
- Discover your Service's technical documentation from the Service's page in Backstage Catalog.
- Create documentation-only sites for any purpose by just writing Markdown.
+- Take advantage of the [TechDocs Addon Framework](addons.md) to add features on top of the base docs-like-code experience.
- Explore and take advantage of the large ecosystem of
[MkDocs plugins](https://www.mkdocs.org/user-guide/plugins/) to create a rich reading experience.
- Search for and find docs.
-## Platforms supported
+## Project roadmap
-See [TechDocs Architecture](architecture.md) to get an overview of where these
-providers are used.
+### Now
+
+With the Backstage 1.2 release, we have introduced the [TechDocs Addon Framework](https://backstage.io/blog/2022/05/13/techdocs-addon-framework) for augmenting the TechDocs experience at read-time.
+
+In addition to the framework itself, we have open sourced a **ReportIssue** Addon, helping you to create a feedback loop that drives up documentation quality and foster a documentation culture at your organization.
+
+### Next
+
+What can we do in TechDocs to help drive up documentation quality? We have many ideas, for example, a Trust Card with associated Trust Score and automatic triggering of documentation maintenance notifications.
+
+### Someday/Maybe
+
+- Contribute to and deploy from a marketplace of TechDocs Addons
+- Addon: MDX (allows you to use JSX in your Markdown content)
+- Can we go static site generator agnostic?
+- Better integration with
+ [Scaffolder V2](https://github.com/backstage/backstage/issues/2771) (e.g. easy to choose and apply documentation template with Software Templates)
+- Possible to configure several aspects about TechDocs (e.g. URL, homepage,
+ theme)
+
+### Done
+
+See [Done](#done) below for a list of completed roadmap items.
+
+## Supported
+
+The following sections show the source code hosting providers and file storage providers that are currently supported by TechDocs.
+
+See [TechDocs Architecture](architecture.md) to get an overview of where the below providers are used.
+
+### Source code hosting providers
| Source Code Hosting Provider | Support Status |
| ---------------------------- | -------------- |
@@ -39,6 +69,8 @@ providers are used.
| GitLab | Yes โ
|
| GitLab Enterprise | Yes โ
|
+### File storage providers
+
| File Storage Provider | Support Status |
| --------------------------------- | -------------- |
| Local Filesystem of Backstage app | Yes โ
|
@@ -47,72 +79,52 @@ providers are used.
| Azure Blob Storage | Yes โ
|
| OpenStack Swift | Community โ
|
-[Reach out to us](#feedback) if you want to request more platforms.
+[Reach out to us](#get-involved) if you want to request more providers.
-## Project roadmap
+## Tech stack
-### **Published versions**
+| Stack | Location |
+| ----------------------------------------------- | ------------------------------------------------------------- |
+| Frontend Plugin | [@backstage/plugin-techdocs][techdocs/frontend] |
+| Frontend Plugin Library | [@backstage/plugin-techdocs-react][techdocs/frontend-library] |
+| Backend Plugin | [@backstage/plugin-techdocs-backend][techdocs/backend] |
+| CLI (for local development and generating docs) | [@techdocs/cli][techdocs/cli] |
+| Docker Container (for generating docs) | [techdocs-container][techdocs/container] |
+
+[techdocs/frontend]: https://github.com/backstage/backstage/blob/master/plugins/techdocs
+[techdocs/frontend-library]: https://github.com/backstage/backstage/blob/master/plugins/techdocs-react
+[techdocs/backend]: https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend
+[techdocs/container]: https://github.com/backstage/techdocs-container
+[techdocs/cli]: https://github.com/backstage/backstage/blob/master/packages/techdocs-cli
+
+## Get involved
+
+Reach out to us in the **#docs-like-code** channel of our
+[Discord chatroom](https://github.com/backstage/backstage#community).
+
+## Done
+
+**Alpha release**
-**Alpha release** โ
-
[Milestone](https://github.com/backstage/backstage/milestone/16)
- Alpha of TechDocs that you can use end to end - and contribute to.
-**Beta release** โ
-
+**Beta release**
+
[Milestone](https://github.com/backstage/backstage/milestone/29)
- TechDocs' recommended setup supports most environments (CI systems, cloud
storage solutions, source control systems).
- [Instructions for upgrading from Alpha to Beta](how-to-guides.md#how-to-migrate-from-techdocs-alpha-to-beta)
-**v1** โ
+**v1.0**
+
+TechDocs promoted to v1.0! To understand how this change affects the package, check out our [versioning policy](https://backstage.io/docs/overview/versioning-policy).
TechDocs packages:
-- '@backstage/plugin-techdocs'
-- '@backstage/plugin-techdocs-backend'
-- '@backstage/plugin-techdocs-node'
-- '@techdocs/cli'
-
-TechDocs promoted to v1.0! To understand how this change affects the package, please check out our [versioning policy](https://backstage.io/docs/overview/versioning-policy).
-
-**v1.2** ๐ง
-
-With the Backstage 1.2 release, we plan to introduce the [TechDocs Addon Framework](https://github.com/backstage/backstage/issues/9636) for augmenting the TechDocs experience at read-time.
-
-In addition to the framework itself, we'll be open sourcing a ` ` addon, helping you to create a feedback loop that drives up documentation quality and fosters a documentation culture at your organization.
-
-### **Next**
-
-- What can we do in TechDocs to drive up documentation quality?
-
-### **Someday/Maybe**
-
-- Contribute to and deploy from a marketplace of TechDocs Addons
-- Addon: MDX (allows you to use JSX in your Markdown content)
-- Can we go static site generator agnostic?
-- Better integration with
- [Scaffolder V2](https://github.com/backstage/backstage/issues/2771) (e.g. easy to choose and apply documentation template with Software Templates)
-- Possible to configure several aspects about TechDocs (e.g. URL, homepage,
- theme)
-
-## Tech stack
-
-| Stack | Location |
-| ----------------------------------------------- | --------------------------------------------------------------- |
-| Frontend Plugin | [`@backstage/plugin-techdocs`][techdocs/frontend] |
-| Frontend Plugin Library | [`@backstage/plugin-techdocs-react`][techdocs/frontend-library] |
-| Backend Plugin | [`@backstage/plugin-techdocs-backend`][techdocs/backend] |
-| CLI (for local development and generating docs) | [`@techdocs/cli`][techdocs/cli] |
-| Docker Container (for generating docs) | [`techdocs-container`][techdocs/container] |
-
-[techdocs/frontend]: https://github.com/backstage/backstage/blob/master/plugins/techdocs
-[techdocs/frontend-library]: https://github.com/backstage/backstage/blob/master/plugins/techdocs-react
-[techdocs/backend]: https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend
-[techdocs/container]: https://github.com/backstage/techdocs-container
-[techdocs/cli]: https://github.com/backstage/techdocs-cli
-
-## Contact us
-
-Reach out to us in the `#docs-like-code` channel of our
-[Discord chatroom](https://github.com/backstage/backstage#community).
+- @backstage/plugin-techdocs
+- @backstage/plugin-techdocs-backend
+- @backstage/plugin-techdocs-node
+- @techdocs/cli
diff --git a/docs/getting-started/configuration.md b/docs/getting-started/configuration.md
index fc78217fbc..59780d2a01 100644
--- a/docs/getting-started/configuration.md
+++ b/docs/getting-started/configuration.md
@@ -164,29 +164,29 @@ Open `packages/app/src/App.tsx` and below the last `import` line, add:
```typescript
import { githubAuthApiRef } from '@backstage/core-plugin-api';
import { SignInProviderConfig, SignInPage } from '@backstage/core-components';
-
-const githubProvider: SignInProviderConfig = {
- id: 'github-auth-provider',
- title: 'GitHub',
- message: 'Sign in using GitHub',
- apiRef: githubAuthApiRef,
-};
```
Search for `const app = createApp({` in this file, and below `apis,` add:
```typescript
components: {
- SignInPage: props => (
-
- ),
- },
+ SignInPage: props => (
+
+ ),
+},
```
+> Since [v1.1.0](https://github.com/backstage/backstage/releases/tag/v1.1.0-next.3), you must provide an [explicit sign-in resolver](../auth/identity-resolver.md).
+
That should be it. You can stop your Backstage App. When you start it again and
go to your Backstage portal in your browser, you should have your login prompt!
diff --git a/docs/integrations/azure/discovery.md b/docs/integrations/azure/discovery.md
index 9293b6d9d7..c607a6550e 100644
--- a/docs/integrations/azure/discovery.md
+++ b/docs/integrations/azure/discovery.md
@@ -6,25 +6,95 @@ sidebar_label: Discovery
description: Automatically discovering catalog entities from repositories in an Azure DevOps organization
---
-The Azure DevOps integration has a special discovery processor for discovering
-catalog entities within an Azure DevOps. The processor will crawl the Azure
+The Azure DevOps integration has a special entity provider for discovering
+catalog entities within an Azure DevOps. The provider will crawl your Azure
DevOps organization and register entities matching the configured path. This can
be useful as an alternative to static locations or manually adding things to the
catalog.
+This guide explains how to install and configure the Azure DevOps Entity Provider (recommended) or the Azure DevOps Processor.
+
+## Dependencies
+
+### Code Search Feature
+
+Azure discovery is driven by the Code Search feature in Azure DevOps, this may not be enabled by default. For Azure
+DevOps Services you can confirm this by looking at the installed extensions in your Organization Settings. For Azure
+DevOps Server you'll find this information in your Collection Settings.
+
+If the Code Search extension is not listed then you can install it from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search&targetId=f9352dac-ba6e-434e-9241-a848a510ce3f&utm_source=vstsproduct&utm_medium=SearchExtStatus).
+
+### Azure Integration
+
+Setup [Azure integration](locations.md) with `host` and `token`. Host must be `dev.azure.com` for Cloud users, otherwise set this to your on-premise hostname.
+
## Installation
-You will have to add the processors in the catalog initialization code of your
-backend. They are not installed by default, therefore you have to add a
-dependency to `@backstage/plugin-catalog-backend-module-azure` to your backend
-package.
+At your configuration, you add one or more provider configs:
+
+```yaml
+# app-config.yaml
+catalog:
+ providers:
+ azureDevOps:
+ yourProviderId: # identifies your dataset / provider independent of config changes
+ organization: myorg
+ project: myproject
+ repository: service-* # this will match all repos starting with service-*
+ path: /catalog-info.yaml
+ anotherProviderId: # another identifier
+ organization: myorg
+ project: myproject
+ repository: '*' # this will match all repos starting with service-*
+ path: /src/*/catalog-info.yaml # this will search for files deep inside the /src folder
+ yetAotherProviderId: # guess, what? Another one :)
+ host: selfhostedazure.yourcompany.com
+ organization: myorg
+ project: myproject
+```
+
+The parameters available are:
+
+- `host:` Leave empty for Cloud hosted, otherwise set to your self-hosted instance host.
+- `organization:` Your Organization slug (or Collection for on-premise users). Required.
+- `project:` Your project slug. Required.
+- `repository:` The repository name. Wildcards are supported as show on the examples above. If not set, all repositories will be searched.
+- `path:` Where to find catalog-info.yaml files. Defaults to /catalog-info.yaml.
+
+_Note:_ the path parameter follows the same rules as the search on Azure DevOps
+web interface. For more details visit the
+[official search documentation](https://docs.microsoft.com/en-us/azure/devops/project/search/get-started-search?view=azure-devops).
+
+As this provider is not one of the default providers, you will first need to install
+the Azure catalog plugin:
```bash
# From your Backstage root directory
yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-azure
```
-And then add the processors to your catalog builder:
+Once you've done that, you'll also need to add the segment below to `packages/backend/src/plugins/catalog.ts`:
+
+```diff
+/* packages/backend/src/plugins/catalog.ts */
++import { AzureDevOpsEntityProvider } from '@backstage/plugin-catalog-backend-module-azure';
+
+const builder = await CatalogBuilder.create(env);
+/** ... other processors and/or providers ... */
++builder.addEntityProvider(
++ AzureDevOpsEntityProvider.fromConfig(env.config, {
++ logger: env.logger,
++ schedule: env.scheduler.createScheduledTaskRunner({
++ frequency: Duration.fromObject({ minutes: 30 }),
++ timeout: Duration.fromObject({ minutes: 3 }),
++ }),
++ }),
++);
+```
+
+## Alternative Processor
+
+As an alternative to the entity provider `AzureDevOpsEntityProvider`, you can still use the `AzureDevopsDiscoveryProcessor`.
```diff
// In packages/backend/src/plugins/catalog.ts
@@ -37,12 +107,6 @@ And then add the processors to your catalog builder:
+ builder.addProcessor(AzureDevOpsDiscoveryProcessor.fromConfig(env.config, { logger: env.logger }));
```
-## Configuration
-
-To use the discovery processor, you'll need a Azure integration
-[set up](locations.md) with a `AZURE_TOKEN`. Then you can add a location target
-to the catalog configuration:
-
```yaml
catalog:
locations:
@@ -70,13 +134,3 @@ When using a custom pattern, the target is composed of five parts:
- The path within each repository to find the catalog YAML file. This will
usually be `/catalog-info.yaml`, `/src/*/catalog-info.yaml` or a similar
variation for catalog files stored in the root directory of each repository.
-
-_Note:_ the path parameter follows the same rules as the search on Azure DevOps
-web interface. For more details visit the
-[official search documentation](https://docs.microsoft.com/en-us/azure/devops/project/search/get-started-search?view=azure-devops).
-
-Azure discovery is driven by the Code Search feature in Azure DevOps, this may not be enabled by default. For Azure
-DevOps Services you can confirm this by looking at the installed extensions in your Organization Settings. For Azure
-DevOps Server you'll find this information in your Collection Settings.
-
-If the Code Search extension is not listed then you can install it from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search&targetId=f9352dac-ba6e-434e-9241-a848a510ce3f&utm_source=vstsproduct&utm_medium=SearchExtStatus).
diff --git a/docs/integrations/bitbucket/locations.md b/docs/integrations/bitbucket/locations.md
index c0c6afc7a3..878030a29c 100644
--- a/docs/integrations/bitbucket/locations.md
+++ b/docs/integrations/bitbucket/locations.md
@@ -15,25 +15,7 @@ plugin.
## Bitbucket Cloud
-```yaml
-integrations:
- bitbucketCloud:
- - username: ${BITBUCKET_CLOUD_USERNAME}
- appPassword: ${BITBUCKET_CLOUD_PASSWORD}
-```
-
-> Note: A public Bitbucket Cloud provider is added automatically at startup for
-> convenience, so you only need to list it if you want to supply credentials.
-
-Directly under the `bitbucketCloud` key is a list of provider configurations, where
-you can list the Bitbucket Cloud providers you want to fetch data from.
-In the case of Bitbucket Cloud, you will have up to one entry.
-
-This one entry will have the following elements:
-
-- `username`: The Bitbucket Cloud username to use in API requests. If
- neither a username nor token are supplied, anonymous access will be used.
-- `appPassword`: The app password for the Bitbucket Cloud user.
+Please see [the Bitbucket Cloud documentation](../bitbucketCloud/locations.md).
## Bitbucket Server
diff --git a/docs/integrations/bitbucketCloud/discovery.md b/docs/integrations/bitbucketCloud/discovery.md
new file mode 100644
index 0000000000..6609707868
--- /dev/null
+++ b/docs/integrations/bitbucketCloud/discovery.md
@@ -0,0 +1,95 @@
+---
+id: discovery
+title: Bitbucket Cloud Discovery
+sidebar_label: Discovery
+# prettier-ignore
+description: Automatically discovering catalog entities from repositories in Bitbucket Cloud
+---
+
+The Bitbucket Cloud integration has a special entity provider for discovering
+catalog files located in [Bitbucket Cloud](https://bitbucket.org).
+The provider will search your Bitbucket Cloud account and register catalog files matching the configured path
+as Location entity and via following processing steps add all contained catalog entities.
+This can be useful as an alternative to static locations or manually adding things to the catalog.
+
+## Installation
+
+You will have to add the entity provider in the catalog initialization code of your
+backend. The provider is not installed by default, therefore you have to add a
+dependency to `@backstage/plugin-catalog-backend-module-bitbucket-cloud` to your backend
+package.
+
+```bash
+# From your Backstage root directory
+yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-bitbucket-cloud
+```
+
+And then add the entity provider to your catalog builder:
+
+```diff
+ // In packages/backend/src/plugins/catalog.ts
++ import { BitbucketCloudEntityProvider } from '@backstage/plugin-catalog-backend-module-bitbucket-cloud';
+
+ export default async function createPlugin(
+ env: PluginEnvironment,
+ ): Promise {
+ const builder = await CatalogBuilder.create(env);
++ builder.addEntityProvider(
++ BitbucketCloudEntityProvider.fromConfig(env.config, {
++ logger: env.logger,
++ schedule: env.scheduler.createScheduledTaskRunner({
++ frequency: { minutes: 30 },
++ timeout: { minutes: 3 },
++ }),
++ }),
++ );
+
+ // [...]
+ }
+```
+
+## Configuration
+
+To use the entity provider, you'll need a [Bitbucket Cloud integration set up](locations.md).
+Very likely a `username` and `appPassword` will be required
+(you are restricted to public repositories and a very low rate limit otherwise).
+
+Additionally, you need to configure your entity provider instance(s):
+
+```yaml
+# app-config.yaml
+
+catalog:
+ providers:
+ bitbucketCloud:
+ yourProviderId: # identifies your ingested dataset
+ catalogPath: /catalog-info.yaml # default value
+ filters: # optional
+ projectKey: '^apis-.*$' # optional; RegExp
+ repoSlug: '^service-.*$' # optional; RegExp
+ workspace: workspace-name
+```
+
+> **Note:** It is possible but certainly not recommended to skip the provider ID level.
+> If you do so, `default` will be used as provider ID.
+
+- **catalogPath** _(optional)_:
+ Default: `/catalog-info.yaml`.
+ Path where to look for `catalog-info.yaml` files.
+ When started with `/`, it is an absolute path from the repo root.
+ It supports values as allowed by the `path` filter/modifier
+ [at Bitbucket Cloud's code search](https://confluence.atlassian.com/bitbucket/code-search-in-bitbucket-873876782.html#Search-Pathmodifier).
+- **filters** _(optional)_:
+ - **projectKey** _(optional)_:
+ Regular expression used to filter results based on the project key.
+ - **repoSlug** _(optional)_:
+ Regular expression used to filter results based on the repo slug.
+- **workspace**:
+ Name of your organization account/workspace.
+ If you want to add multiple workspaces, you need to add one provider config each.
+
+## Alternative
+
+_Deprecated!_ Please raise issues for use cases not covered by the entity provider.
+
+[You can use the `BitbucketDiscoveryProcessor`.](../bitbucket/discovery.md#bitbucket-cloud)
diff --git a/docs/integrations/bitbucketCloud/locations.md b/docs/integrations/bitbucketCloud/locations.md
new file mode 100644
index 0000000000..b886a49346
--- /dev/null
+++ b/docs/integrations/bitbucketCloud/locations.md
@@ -0,0 +1,36 @@
+---
+id: locations
+title: Bitbucket Cloud Locations
+sidebar_label: Locations
+# prettier-ignore
+description: Integrating source code stored in Bitbucket Cloud into the Backstage catalog
+---
+
+The Bitbucket Cloud integration supports loading catalog entities from [bitbucket.org](https://bitbucket.org).
+Entities can be added to
+[static catalog configuration](../../features/software-catalog/configuration.md),
+or registered with the
+[catalog-import](https://github.com/backstage/backstage/tree/master/plugins/catalog-import)
+plugin.
+
+## Configuration
+
+```yaml
+integrations:
+ bitbucketCloud:
+ - username: ${BITBUCKET_CLOUD_USERNAME}
+ appPassword: ${BITBUCKET_CLOUD_PASSWORD}
+```
+
+> Note: A public Bitbucket Cloud provider is added automatically at startup for
+> convenience, so you only need to list it if you want to supply credentials.
+
+Directly under the `bitbucketCloud` key is a list of provider configurations, where
+you can list the Bitbucket Cloud providers you want to fetch data from.
+In the case of Bitbucket Cloud, you will have up to one entry.
+
+This one entry will have the following elements:
+
+- `username`: The Bitbucket Cloud username to use in API requests. If
+ neither a username nor token are supplied, anonymous access will be used.
+- `appPassword`: The app password for the Bitbucket Cloud user.
diff --git a/docs/integrations/gitlab/discovery.md b/docs/integrations/gitlab/discovery.md
index 8d805fa362..ea151e9415 100644
--- a/docs/integrations/gitlab/discovery.md
+++ b/docs/integrations/gitlab/discovery.md
@@ -6,14 +6,55 @@ sidebar_label: Discovery
description: Automatically discovering catalog entities from repositories in GitLab
---
-The GitLab integration has a special discovery processor for discovering catalog
-entities from GitLab. The processor will crawl the GitLab instance and register
-entities matching the configured path. This can be useful as an alternative to
+The GitLab integration has a special entity provider for discovering catalog
+entities from GitLab. The entity provider will crawl the GitLab instance and register
+entities matching the configured paths. This can be useful as an alternative to
static locations or manually adding things to the catalog.
-To use the discovery processor, you'll need a GitLab integration
-[set up](locations.md) with a `token`. Then you can add a location target to the
-catalog configuration:
+To use the discovery provider, you'll need a GitLab integration
+[set up](locations.md) with a `token`. Then you can add a provider config per group
+to the catalog configuration:
+
+```yaml
+catalog:
+ providers:
+ gitlab:
+ yourProviderId:
+ host: gitlab-host # Identifies one of the hosts set up in the integrations
+ branch: main # Optional. Uses `master` as default
+ group: example-group # Group and subgroup (if needed) to look for repositories
+ entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml`
+```
+
+As this provider is not one of the default providers, you will first need to install
+the gitlab catalog plugin:
+
+```bash
+# From the Backstage root directory
+yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-gitlab
+```
+
+Once you've done that, you'll also need to add the segment below to `packages/backend/src/plugins/catalog.ts`:
+
+```ts
+/* packages/backend/src/plugins/catalog.ts */
+
+import { GitlabDiscoveryEntityProvider } from '@backstage/plugin-catalog-backend-module-gitlab';
+
+const builder = await CatalogBuilder.create(env);
+/** ... other processors and/or providers ... */
+builder.addEntityProvider(
+ ...GitlabDiscoveryEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
+ }),
+ }),
+);
+```
+
+## Alternative processor
```yaml
catalog:
@@ -22,6 +63,9 @@ catalog:
target: https://gitlab.com/group/subgroup/blob/main/catalog-info.yaml
```
+As alternative to the entity provider `GitlabDiscoveryEntityProvider`
+you can still use the `GitLabDiscoveryProcessor`.
+
Note the `gitlab-discovery` type, as this is not a regular `url` processor.
The target is composed of three parts:
@@ -50,3 +94,5 @@ of your backend.
+ GitLabDiscoveryProcessor.fromConfig(env.config, { logger: env.logger })
+ );
```
+
+If you don't want create location object if file with component definition do not exists in project, you can set the `skipReposWithoutExactFileMatch` option. That can reduce count of request to gitlab with 404 status code.
diff --git a/docs/overview/roadmap.md b/docs/overview/roadmap.md
index 106bf56f79..727000728f 100644
--- a/docs/overview/roadmap.md
+++ b/docs/overview/roadmap.md
@@ -12,12 +12,12 @@ and the broader Backstage community.
The Backstage roadmap lays out both [โwhat's nextโ](#whats-next) and ["future
work"](#future-work). With "next" we mean features planned for release within
-the ongoing quarter from January through March 2022. With "future" we mean
+the ongoing quarter from April through June 2022. With "future" we mean
features on the radar, but not yet scheduled.
-| [What's next](#whats-next) | [Future work](#future-work) |
-| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
-| [Ease of onboarding](#ease-of-onboarding) [Search 1.0](#search-1.0) [TechDocs Addon framework](#techdocs-addon-framework) [Backend Services (initial)](#backend-services-initial) [Backstage Security Audit](#backstage-security-audit) [SIGs for contributors](#sigs-for-contributors) | Security Plan (and Strategy) Composable Homepage 1.0 GraphQL Telemetry Improved UX design |
+| [What's next](#whats-next) | [Future work](#future-work) |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
+| [Ease of onboarding](#ease-of-onboarding) [Backstage Search 1.0](#search-1.0) [TechDocs Addon Framework](#techdocs-addon-framework) [Backend Services (initial)](#backend-services-initial) [Backstage Security Audit](#backstage-security-audit) [SIGs for contributors](#sigs-for-contributors) | Security Plan (and Strategy) Composable Homepage 1.0 GraphQL Telemetry Improved UX design |
The long-term roadmap (12 - 36 months) is not detailed in the public roadmap.
Third-party contributions are also not currently included in the roadmap. Let us
@@ -46,18 +46,17 @@ More iterations will be required in the following quarters, but this will be a
good improvement in the onboarding experience, especially for the benefit of new
adopters.
-### Search 1.0
+### Backstage Search 1.0
-Fix the few remaining issues to get Backstage Search platform up to 1.0
-([here](https://github.com/backstage/backstage/milestone/27) and
-[here](https://github.com/backstage/backstage/milestone/28)).
+Fix the few remaining issues to get Backstage Search platform up to 1.0. For more information, see the [Backstage Search documentation and roadmap page](https://backstage.io/docs/features/search/search-overview).
-### TechDocs Addon framework
+### TechDocs Addon Framework
-Addons are TechDocs features that are added on top of the base docs-like-code
-experience. An example would be a feature that showed comments on the page. We
-plan to add an Addon framework and open source a selection of the Addons that we
-use internally at Spotify. Further Addons can then be added by the Community.
+Addons are TechDocs features that are added on top of the base docs-like-code experience. An example would be a feature that showed comments on the page. We plan to add an Addon framework and open source a selection of the Addons that we use internally at Spotify. We encourage the Backstage community to add further Addons.
+
+For more information about the TechDocs Addon Framework, see the documentation page [here](https://backstage.io/docs/features/techdocs/addons)
+
+For general information about TechDocs including roadmap, see [here](https://backstage.io/docs/features/techdocs/techdocs-overview).
### Backend Services (initial)
diff --git a/docs/permission/concepts.md b/docs/permissions/concepts.md
similarity index 100%
rename from docs/permission/concepts.md
rename to docs/permissions/concepts.md
diff --git a/docs/permission/custom-rules.md b/docs/permissions/custom-rules.md
similarity index 100%
rename from docs/permission/custom-rules.md
rename to docs/permissions/custom-rules.md
diff --git a/docs/permission/getting-started.md b/docs/permissions/getting-started.md
similarity index 99%
rename from docs/permission/getting-started.md
rename to docs/permissions/getting-started.md
index b115b674d6..6daf448cdd 100644
--- a/docs/permission/getting-started.md
+++ b/docs/permissions/getting-started.md
@@ -152,6 +152,6 @@ permission:
3. Now that youโve made this change, you should find that the unregister entity menu option on the catalog entity page is disabled.
-
+
Now that the framework is fully configured, you can craft a permission policy that works best for your organization by utilizing a provided authorization method or by [writing your own policy](./writing-a-policy.md)!
diff --git a/docs/permission/overview.md b/docs/permissions/overview.md
similarity index 97%
rename from docs/permission/overview.md
rename to docs/permissions/overview.md
index 8e87756faa..b972814aeb 100644
--- a/docs/permission/overview.md
+++ b/docs/permissions/overview.md
@@ -22,7 +22,7 @@ The permission framework was designed with a few key properties in mind:
- **Integrators** can author or configure policies that define which users can take certain actions upon which resources.
-
+
1. The user triggers a request to perform some action. The request specifies the authorization details using the permission specified by the plugin (in this case, a resource read action).
diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permissions/plugin-authors/01-setup.md
similarity index 98%
rename from docs/permission/plugin-authors/01-setup.md
rename to docs/permissions/plugin-authors/01-setup.md
index 2f070f603b..d08d1ee79c 100644
--- a/docs/permission/plugin-authors/01-setup.md
+++ b/docs/permissions/plugin-authors/01-setup.md
@@ -105,7 +105,7 @@ The source code is available here:
Now if you start your application you should be able to reach the `/todo-list` page:
-
+
---
diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permissions/plugin-authors/02-adding-a-basic-permission-check.md
similarity index 100%
rename from docs/permission/plugin-authors/02-adding-a-basic-permission-check.md
rename to docs/permissions/plugin-authors/02-adding-a-basic-permission-check.md
diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md
similarity index 100%
rename from docs/permission/plugin-authors/03-adding-a-resource-permission-check.md
rename to docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md
diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permissions/plugin-authors/04-authorizing-access-to-paginated-data.md
similarity index 100%
rename from docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md
rename to docs/permissions/plugin-authors/04-authorizing-access-to-paginated-data.md
diff --git a/docs/permission/writing-a-policy.md b/docs/permissions/writing-a-policy.md
similarity index 100%
rename from docs/permission/writing-a-policy.md
rename to docs/permissions/writing-a-policy.md
diff --git a/docs/plugins/analytics.md b/docs/plugins/analytics.md
index d5fd02a46d..ccb4e5c5a7 100644
--- a/docs/plugins/analytics.md
+++ b/docs/plugins/analytics.md
@@ -52,11 +52,12 @@ learn how to contribute the integration yourself!
The following table summarizes events that, depending on the plugins you have
installed, may be captured.
-| Action | Provided By | Subject |
-| ---------- | -------------- | --------------------------------------------------- |
-| `navigate` | Backstage Core | The URL of the page that was navigated to |
-| `click` | Backstage Core | The text of the link that was clicked on |
-| `search` | Backstage Core | The search term entered in any search bar component |
+| Action | Subject | Other Notes |
+| ---------- | --------------------------------------------------- | ----------------------------------------------------------------- |
+| `navigate` | The URL of the page that was navigated to | |
+| `click` | The text of the link that was clicked on | The `to` attribute represents the URL clicked to |
+| `search` | The search term entered in any search bar component | The `searchTypes` attribute holds `types` constraining the search |
+| `discover` | The title of the search result that was clicked on | The `value` is the result rank. A `to` attribute is also provided |
If there is an event you'd like to see captured, please [open an
issue][add-event] describing the event you want to see and the questions it
diff --git a/docs/plugins/integrating-search-into-plugins.md b/docs/plugins/integrating-search-into-plugins.md
new file mode 100644
index 0000000000..77456dd5b4
--- /dev/null
+++ b/docs/plugins/integrating-search-into-plugins.md
@@ -0,0 +1,203 @@
+---
+id: integrating-search-into-plugins
+title: Integrating Search into a plugin
+description: How to integrate Search into a Backstage plugin
+---
+
+The Backstage Search Platform was designed to give plugin developers the APIs
+and interfaces needed to offer search experiences within their plugins, while
+abstracting away (and instead empowering application integrators to choose) the
+specific underlying search technologies.
+
+On this page, you'll find concepts and tutorials for leveraging the Backstage
+Search Platform in your plugin.
+
+## Providing data to the search platform
+
+> A guide on how to create collators is coming soon!
+
+## Building a search experience into your plugin
+
+While the core Search plugin offers components and extensions that empower app
+integrators to compose a global search experience, you may find that you want a
+narrower search experience just within your plugin. This could be as literal as
+an autocomplete-style search bar focused on documents provided by your plugin
+(for example, the [TechDocsSearch](https://github.com/backstage/backstage/blob/master/plugins/techdocs/src/search/components/TechDocsSearch.tsx)
+component), or as abstract as a widget that presents a list of links that
+are contextually related to something else on the page.
+
+### Search Experience Concepts
+
+Knowing these high-level concepts will help you as you craft your in-plugin
+search experience.
+
+- All search experiences must be wrapped in a ``, which
+ is provided by `@backstage/plugin-search-react`. This context keeps track
+ of state necessary to perform search queries and display any results. As
+ inputs to the query are updated (e.g. a `term` or `filter` values), the
+ updated query is executed and `results` are refreshed. Check out the
+ [SearchContextValue](https://backstage.io/docs/reference/plugin-search-react.searchcontextvalue)
+ for details.
+- The aforementioned state can be modified and/or consumed via the
+ `useSearch()` hook, also exported by `@backstage/plugin-search-react`.
+- For more literal search experiences, reusable components are available
+ to import and compose into a cohesive experience in your plugin (e.g.
+ ` ` or ` `). You can see all such
+ components in [Backstage's storybook](https://backstage.io/storybook/?path=/story/plugins-search-searchbar--default).
+
+### Search Experience Tutorials
+
+The following tutorials make use of packages and plugins that you may not yet
+have as dependencies for your plugin; be sure to add them before you use them!
+
+- [`@backstage/plugin-search-react`](https://www.npmjs.com/package/@backstage/plugin-search-react) - A
+ package containing components, hooks, and types that are shared across all
+ frontend plugins, including plugins like yours!
+- [`@backstage/plugin-search`](https://www.npmjs.com/package/@backstage/plugin-search) - The
+ main search plugin, used by app integrators to compose global search
+ experiences.
+- [`@backstage/core-components`](https://www.npmjs.com/package/@backstage/core-components) - A
+ package containing generic components useful for a variety of experiences
+ built in Backstage.
+
+#### Improved "404" page experience
+
+Imagine you have a plugin that allows users to manage _widgets_. Perhaps they
+can be viewed at a URL like `backstage.example.biz/widgets/{widgetName}`.
+At some point, a widget is renamed, and links to that widget's page from
+chat systems, wikis, or browser bookmarks become stale, resulting in errors or
+404s.
+
+What if instead of showing a broken page or the generic "looks like someone
+dropped the mic" 404 page, you showed a list of possibly related widgets?
+
+```javascript
+import { Link } from '@backstage/core-components';
+import { SearchResult } from '@backstage/plugin-search';
+import { SearchContextProvider } from '@backstage/plugin-search-react';
+
+export const Widget404Page = ({ widgetName }) => {
+ // Supplying this to runs a pre-filtered search with
+ // the given widgetName as the search term, focused on search result of type
+ // "widget" with no other filters.
+ const preFiltered = {
+ term: widgetName,
+ types: ['widget'],
+ filters: {},
+ };
+
+ return (
+
+ {/* The component allows us to iterate through results and
+ display them in whatever way fits best! */}
+
+ {({ results }) => (
+ {results.map(({ document }) => (
+
+ {document.title}
+
+ ))}
+ )}
+
+
+ );
+);
+```
+
+Not all search experiences require user input! As you can see, it's possible to
+leverage the Backstage Search Platform's frontend framework without necessarily
+giving users input controls.
+
+#### Simple search page
+
+Of course, it's also possible to provide a more fully featured search
+experience in your plugin. The simplest way is to leverage reusable components
+provided by the `@backstage/plugin-search` package, like this:
+
+```javascript
+import { useProfile } from '@internal/api';
+import {
+ Content,
+ ContentHeader,
+ PageWithHeader,
+} from '@backstage/core-components';
+import { SearchBar, SearchResult } from '@backstage/plugin-search';
+import { SearchContextProvider } from '@backstage/plugin-search-react';
+
+export const ManageMyWidgets = () => {
+ const { primaryTeam } = useProfile();
+ // In this example, note how we are pre-filtering results down to a specific
+ // owner field value (the currently logged-in user's team), but allowing the
+ // search term to be controlled by the user via the component.
+ const preFiltered = {
+ types: ['widget'],
+ term: '',
+ filters: {
+ owner: primaryTeam,
+ },
+ };
+
+ return (
+
+
+
+
+
+
+ {/* Render results here, just like above */}
+
+
+
+
+ );
+};
+```
+
+#### Custom search control surfaces
+
+If the reusable search components provided by `@backstage/plugin-search` aren't
+adequate, no problem! There's an API in place that you can use to author your
+own components to control the various parts of the search context.
+
+```javascript
+import { useSearch } from '@backstage/plugin-search-react';
+import ChipInput from 'material-ui-chip-input';
+
+export const CustomChipFilter = ({ name }) => {
+ const { filters, setFilters } = useSearch();
+ const chipValues = filters[name] || [];
+
+ // When a chip value is changed, update the filters value by calling the
+ // setFilters function from the search context.
+ const handleChipChange = (chip, index) => {
+ // There may be filters set for other fields. Be sure to maintain them.
+ setFilters(prevState => {
+ const { [name]: filter = [], ...others } = prevState;
+
+ if (index === undefined) {
+ filter.push(chip);
+ } else {
+ filter.splice(index, 1);
+ }
+
+ return { ...others, [name]: filter };
+ });
+ };
+
+ return (
+
+ );
+};
+```
+
+Check out the [SearchContextValue type](https://github.com/backstage/backstage/blob/master/plugins/search-react/src/context/SearchContext.tsx)
+for more details on what methods and values are available for manipulating and
+reading the search context.
+
+If you produce something generic and reusable, consider contributing your
+component upstream so that all users of the Backstage Search Platform can
+benefit. Issues and pull requests welcome.
diff --git a/docs/plugins/url-reader.md b/docs/plugins/url-reader.md
index 8a84f3e1ff..4c6938ade2 100644
--- a/docs/plugins/url-reader.md
+++ b/docs/plugins/url-reader.md
@@ -104,10 +104,10 @@ directly be used with a URL. Some example usages -
- [`read`](https://github.com/backstage/backstage/blob/d5c83bb889b8142e343ebc4e4c0b90a02d1c1a3d/plugins/catalog-backend/src/ingestion/processors/codeowners/read.ts#L24-L33) -
Catalog using the `read` method to read the CODEOWNERS file in a repository.
-- [`readTree`](https://github.com/backstage/backstage/blob/d5c83bb889b8142e343ebc4e4c0b90a02d1c1a3d/packages/techdocs-common/src/helpers.ts#L198-L220) -
+- [`readTree`](https://github.com/backstage/backstage/blob/84a8788/plugins/techdocs-node/src/helpers.ts#L146-L167) -
TechDocs using the `readTree` method to download markdown files in order to
generate the documentation site.
-- [`readTree`](https://github.com/backstage/backstage/blob/d5c83bb889b8142e343ebc4e4c0b90a02d1c1a3d/packages/techdocs-common/src/stages/prepare/url.ts#L33-L54) -
+- [`readTree`](https://github.com/backstage/backstage/blob/cb4f0e4/plugins/techdocs-node/src/stages/prepare/url.ts#L51-L73) -
TechDocs using `NotModifiedError` to maintain cache and speed up and limit the
number of requests.
- [`search`](https://github.com/backstage/backstage/blob/d5c83bb889b8142e343ebc4e4c0b90a02d1c1a3d/plugins/catalog-backend/src/ingestion/processors/UrlReaderProcessor.ts#L88-L108) -
diff --git a/docs/releases/v1.3.0-changelog.md b/docs/releases/v1.3.0-changelog.md
new file mode 100644
index 0000000000..641fd8422a
--- /dev/null
+++ b/docs/releases/v1.3.0-changelog.md
@@ -0,0 +1,2311 @@
+# Release v1.3.0
+
+## @backstage/backend-common@0.14.0
+
+### Minor Changes
+
+- 55647ec7df: **BREAKING**: Server-to-server tokens that are authenticated by the `ServerTokenManager` now must have an `exp` claim that has not expired. Tokens where the `exp` claim is in the past or missing are considered invalid and will throw an error. This is a followup to the deprecation from the `1.2` release of Backstage where perpetual tokens were deprecated. Be sure to update any usage of the `getToken()` method to have it be called every time a token is needed. Do not store tokens for later use.
+
+### Patch Changes
+
+- f72a6b8c62: Applied the `luxon` dependency fix from the `0.13.4` patch release.
+- 5b22a8c97f: Applied the AWS S3 reading patch from the `0.13.5` patch release.
+- f5283a42e2: Updated dependency `@google-cloud/storage` to `^6.0.0`.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/integration@1.2.1
+ - @backstage/config-loader@1.1.2
+
+## @backstage/plugin-bitbucket-cloud-common@0.1.0
+
+### Minor Changes
+
+- 1dffa7dd4d: Add new common library `bitbucket-cloud-common` with a client for Bitbucket Cloud.
+
+ This client can be reused across all packages and might be the future place for additional
+ features like managing the rate limits, etc.
+
+ The client itself was generated in parts using the `@openapitools/openapi-generator-cli`.
+
+### Patch Changes
+
+- 9122060776: Updated dependency `msw` to `^0.42.0`.
+- Updated dependencies
+ - @backstage/integration@1.2.1
+
+## @backstage/plugin-catalog@1.3.0
+
+### Minor Changes
+
+- fe7614ea54: Add an optional icon to the Catalog and TechDocs search results
+
+### Patch Changes
+
+- 449dcef98e: Updates the `isKind`, `รฌsComponentType`, and `isNamespace` to allow an array of possible values
+
+- 1f70704580: Accessibility updates:
+
+ - Added screen reader elements to describe default table `Action` buttons
+
+- 915700f64f: In order to simplify analytics on top of the search experience in Backstage, the provided `<*ResultListItem />` component now captures a `discover` analytics event instead of a `click` event. This event includes the result rank as its `value` and, like a click, the URL/path clicked to as its `to` attribute.
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-search-react@0.2.1
+ - @backstage/plugin-catalog-common@1.0.3
+ - @backstage/core-components@0.9.5
+ - @backstage/catalog-client@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-backend@1.2.0
+
+### Minor Changes
+
+- b594679ae3: Allow array as non-spread arguments at the `CatalogBuilder`.
+
+ ```typescript
+ builder.addEntityProvider(...getArrayOfProviders());
+ ```
+
+ can be simplified to
+
+ ```typescript
+ builder.addEntityProvider(getArrayOfProviders());
+ ```
+
+### Patch Changes
+
+- 8838b13038: Disallow anything but `'url'` locations from being registered via the location service.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-permission-node@0.6.2
+ - @backstage/plugin-catalog-common@1.0.3
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/plugin-permission-common@0.6.2
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-scaffolder-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket@0.2.0
+
+### Minor Changes
+
+- 1c01c0fd14: Integrate `@backstage/plugin-bitbucket-cloud-common` as replacement for the `BitbucketCloudClient`.
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/plugin-bitbucket-cloud-common@0.1.0
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.0
+
+### Minor Changes
+
+- dfc4efcbf0: Add new plugin `catalog-backend-module-bitbucket-cloud` with `BitbucketCloudEntityProvider`.
+
+ This entity provider is an alternative/replacement to the `BitbucketDiscoveryProcessor` **_(for Bitbucket Cloud only!)_**.
+ It replaces use cases using `search=true` and should be powerful enough as a complete replacement.
+
+ If any feature for Bitbucket Cloud is missing and preventing you from switching, please raise an issue.
+
+ **Before:**
+
+ ```typescript
+ // packages/backend/src/plugins/catalog.ts
+
+ builder.addProcessor(
+ BitbucketDiscoveryProcessor.fromConfig(env.config, { logger: env.logger }),
+ );
+ ```
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ locations:
+ - type: bitbucket-discovery
+ target: 'https://bitbucket.org/workspaces/workspace-name/projects/apis-*/repos/service-*?search=true&catalogPath=/catalog-info.yaml'
+ ```
+
+ **After:**
+
+ ```typescript
+ // packages/backend/src/plugins/catalog.ts
+ builder.addEntityProvider(
+ BitbucketCloudEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
+ }),
+ }),
+ );
+ ```
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ providers:
+ bitbucketCloud:
+ yourProviderId: # identifies your ingested dataset
+ catalogPath: /catalog-info.yaml # default value
+ filters: # optional
+ projectKey: '^apis-.*
+ ```
+
+## @backstage/plugin-catalog-backend-module-ldap@0.5.0
+
+### Minor Changes
+
+- 1f83f0bc84: Added the possibility to pass TLS configuration to ldap connection
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-dynatrace@0.1.0
+
+### Minor Changes
+
+- 70027d09aa: Adds Dynatrace plugin
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-github-pull-requests-board@0.1.0
+
+### Minor Changes
+
+- fc9927c81d: Add Github Pull Requests board plugin
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-kubernetes-backend@0.6.0
+
+### Minor Changes
+
+- 4328737af6: Add support to fetch data for Stateful Sets from Kubernetes
+
+### Patch Changes
+
+- 0c70cd8e1d: cache and refresh Azure tokens to avoid excessive calls to Azure Identity
+- 2aedf64ad3: Updated dependency `@google-cloud/container` to `^4.0.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-kubernetes-common@0.3.0
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-kubernetes-common@0.3.0
+
+### Minor Changes
+
+- 4328737af6: Add support to fetch data for Stateful Sets
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-pagerduty@0.4.0
+
+### Minor Changes
+
+- b157c2eb1c: **Breaking**: Use identityApi to provide auth token for pagerduty API calls.
+
+### Patch Changes
+
+- 76bf6400fe: Fix alert that was not showing after creating an incident.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-scaffolder@1.3.0
+
+### Minor Changes
+
+- dc39366bdb: - Added a new page under `/create/tasks` to show tasks that have been run by the Scaffolder.
+
+ - Ability to filter these tasks by the signed in user, and all tasks.
+ - Added optional method to the `ScaffolderApi` interface called `listTasks` to get tasks with an required `filterByOwnership` parameter.
+
+- 86a4a0f72d: Get data of other fields in Form from a custom field in template Scaffolder.
+ following:
+
+ ```tsx
+ const CustomFieldExtensionComponent = (props: FieldExtensionComponentProps) => {
+ const { formData } = props.formContext;
+ ...
+ };
+
+ const CustomFieldExtension = scaffolderPlugin.provide(
+ createScaffolderFieldExtension({
+ name: ...,
+ component: CustomFieldExtensionComponent,
+ validation: ...
+ })
+ );
+ ```
+
+- 72dfcbc8bf: Gerrit Integration: Implemented a `RepoUrlPicker` for Gerrit.
+
+- f93af969cd: Added the ability to support running of templates that are not in the `default` namespace
+
+### Patch Changes
+
+- ac0c7e45ee: Fixes review mask in `MultistepJsonForm` to work as documented. `show: true` no longer needed when mask is set.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- fd505f40c0: Handle binary files and files that are too large during dry-run content upload.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/plugin-catalog-common@1.0.3
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-permission-react@0.4.2
+ - @backstage/plugin-scaffolder-common@1.1.1
+
+## @backstage/plugin-scaffolder-backend@1.3.0
+
+### Minor Changes
+
+- 35a26131b3: **DEPRECATION**: The `projectid` input parameters to the `publish:gitlab:merge-request`, it's no longer required as it can be decoded from the `repoUrl` input parameter.
+ **DEPRECATION**: The `projectid` output of the action in favour of `projectPath`
+
+- 72dfcbc8bf: A new scaffolder action has been added: `gerrit:publish`
+
+- ce0d8d7eb1: Fixed a bug in `publish:github` action that didn't permit to add users as collaborators.
+ This fix required changing the way parameters are passed to the action.
+ In order to add a team as collaborator, now you must use the `team` field instead of `username`.
+ In order to add a user as collaborator, you must use the `user` field.
+
+ It's still possible to use the field `username` but is deprecated in favor of `team`.
+
+ ```yaml
+ - id: publish
+ name: Publish
+ action: publish:github
+ input:
+ repoUrl: ...
+ collaborators:
+ - access: ...
+ team: my_team
+ - access: ...
+ user: my_username
+ ```
+
+- 582003a059: - Added an optional `list` method on the `TaskBroker` and `TaskStore` interface to list tasks by an optional `userEntityRef`
+
+ - Implemented a `list` method on the `DatabaseTaskStore` class to list tasks by an optional `userEntityRef`
+ - Added a route under `/v2/tasks` to list tasks by a `userEntityRef` using the `createdBy` query parameter
+
+- c042c5eaff: Add an option to not protect the default branch.
+
+- f93af969cd: Added the ability to support running of templates that are not in the `default` namespace
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 6901f6be4a: Adds more of an explanation when the `publish:github` scaffolder action fails to create a repository.
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-scaffolder-common@1.1.1
+
+## @backstage/plugin-search@0.9.0
+
+### Minor Changes
+
+- 2dc4818541: The pre-alpha ``, ``, `etc...` components have been removed. In the unlikely event you were still using/referencing them, please update to using their non-`*Next` equivalents from either `@backstage/plugin-search-react` or `@backstage/plugin-search`.
+
+### Patch Changes
+
+- 8809159148: Components ``, `` (including ``), `` (including `.Checkbox`, `.Select`, and `.Autocomplete` static prop components), ``, and `` are now exported from `@backstage/plugin-search-react`. They are now deprecated in `@backstage/plugin-search` and will be removed in a future release.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 5388e6bdc5: Fixed a bug that could cause analytics events in other parts of Backstage to capture nonsensical values resembling search modal state under some circumstances.
+- 915700f64f: In order to simplify analytics on top of the search experience in Backstage, the provided `<*ResultListItem />` component now captures a `discover` analytics event instead of a `click` event. This event includes the result rank as its `value` and, like a click, the URL/path clicked to as its `to` attribute.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-search-react@0.2.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-techdocs@1.2.0
+
+### Minor Changes
+
+- fe7614ea54: Add an optional icon to the Catalog and TechDocs search results
+
+### Patch Changes
+
+- d047d81295: Use entity title as label in `TechDocsReaderPageHeader` if available
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+- bff65e6958: Updated sidebar-related logic to use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()` from `@backstage/core-components`.
+
+- 915700f64f: In order to simplify analytics on top of the search experience in Backstage, the provided `<*ResultListItem />` component now captures a `discover` analytics event instead of a `click` event. This event includes the result rank as its `value` and, like a click, the URL/path clicked to as its `to` attribute.
+
+- 881fbd7e8d: Fix `EntityTechdocsContent` component to use objects instead of `` elements, otherwise "outlet" will be null on sub-pages and add-ons won't render.
+
+- 17c059dfd0: Restructures reader style transformations to improve code readability:
+
+ - Extracts the style rules to separate files;
+ - Creates a hook that processes each rule;
+ - And creates another hook that returns a transformer responsible for injecting them into the head tag of a given element.
+
+- 3b45ad701f: Packages a set of tweaks to the TechDocs addons rendering process:
+
+ - Prevents displaying sidebars until page styles are loaded and the sidebar position is updated;
+ - Prevents new sidebar locations from being created every time the reader page is rendered if these locations already exist;
+ - Centers the styles loaded event to avoid having multiple locations setting the opacity style in Shadow Dom causing the screen to flash multiple times.
+
+- 9b94ade898: Use entity title in `TechDocsSearch` placeholder if available.
+
+- 816f7475ec: Convert `sanitizeDOM` transformer to hook as part of code readability improvements in dom file.
+
+- 50ff56a80f: Change the `EntityDocsPage` path to be more specific and also add integration tests for `sub-routes` on this page.
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-search-react@0.2.1
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-techdocs-react@1.0.1
+
+## @backstage/plugin-vault@0.1.0
+
+### Minor Changes
+
+- 7c310a5bc2: First implementation of the frontend vault plugin. For more information refer to its `README.md`.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-vault-backend@0.1.0
+
+### Minor Changes
+
+- 7c310a5bc2: First implementation for the backend vault plugin. For more information refer to its `README.md`.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/backend-test-utils@0.1.25
+
+## @backstage/app-defaults@1.0.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-permission-react@0.4.2
+
+## @backstage/backend-tasks@0.3.2
+
+### Patch Changes
+
+- fde10d24f6: Allow tasks that fail to retry on a loop emitting a warning log every time it fails with the amount of attempts it has
+- f7146b516f: Updated dependency `cron` to `^2.0.0`.
+ Updated dependency `@types/cron` to `^2.0.0`.
+- 7f108513b8: Add error logging when a background task throws an error rather than silently swallowing it.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## @backstage/backend-test-utils@0.1.25
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/cli@0.17.2
+ - @backstage/backend-common@0.14.0
+
+## @backstage/catalog-client@1.0.3
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 35bc0a7c27: Update README to point to catalog-react for frontend usage
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/catalog-model@1.0.3
+
+### Patch Changes
+
+- 131a99e909: Added targetRef to common.schema.json to match the Typescript type
+
+## @backstage/cli@0.17.2
+
+### Patch Changes
+
+- 026cfe525a: Fix the public path configuration of the frontend app build so that a trailing `/` is always appended when needed.
+- 4f73352608: Updated Lockfile to support new versions of yarn as well as the legacy 1 version
+- b8970b8941: Improved the `create-github-app` permissions selection prompt by converting it into a multi-select with clearer descriptions. The `members` permission is now also included in the list which is required for ingesting user data into the catalog.
+- bd58365d09: Updated dependency `run-script-webpack-plugin` to `^0.0.14`.
+- 9002ebd76b: Updated dependency `@rollup/plugin-commonjs` to `^22.0.0`.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 1a33e8b287: Updated dependency `minimatch` to `5.1.0`.
+- 6de866ea74: Added console warning to frontend start when the `app.baseUrl` and `backend.baseUrl` are identical
+- Updated dependencies
+ - @backstage/config-loader@1.1.2
+ - @backstage/release-manifests@0.0.4
+
+## @backstage/config-loader@1.1.2
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @backstage/core-app-api@1.0.3
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 19781483a2: Handle URLs as the first argument to `fetchApi`, when using the `plugin:` protocol
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/core-components@0.9.5
+
+### Patch Changes
+
+- feb4e8de07: Fix EntityPage tab scrolling overflow bug on Firefox
+
+- 65840b17be: Fix issue where right arrow icon was incorrectly added to side bar items without a sub-menu
+
+- de593ec78f: Updated dependency `react-text-truncate` to `^0.19.0`.
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+- 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
+
+- ee2cd642c5: Updated dependency `rc-progress` to `3.3.3`.
+
+- 96d1e01641: Accessibility updates:
+
+ - Added `aria-label` to the `Select` component
+ - Changed heading level used in the header of `Table` component
+
+- 7d355c4b3f: Fix the missing filter in the toolbar when passing a custom component in the core-components Table
+
+- 1cf9caecd6: fix Sidebar Contexts deprecation message
+
+- bff65e6958: The `SidebarPinStateContext` and `SidebarContext` have been deprecated and will be removed in a future release. Instead, use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()`.
+
+ This was done to ensure that sidebar state can be shared successfully across components exported by different packages, regardless of what version of this package is resolved and installed for each individual package.
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/core-plugin-api@1.0.3
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @backstage/create-app@0.4.28
+
+### Patch Changes
+
+- 881fbd7e8d: Register `TechDocs` addons on catalog entity pages, follow the steps below to add them manually:
+
+ ```diff
+ // packages/app/src/components/catalog/EntityPage.tsx
+
+ + import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
+ + import {
+ + ReportIssue,
+ + } from '@backstage/plugin-techdocs-module-addons-contrib';
+
+ + const techdocsContent = (
+ +
+ +
+ +
+ +
+ +
+ + );
+
+ const defaultEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+
+ const serviceEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+
+ const websiteEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+ ```
+
+- 0e870fe0ac: Removed peer dependencies, as they are no longer needed.
+
+- bff65e6958: Use of `SidebarContext` has been deprecated and will be removed in a future release. Instead, `useSidebarOpenState()` should be used to consume the context and `` should be used to provide it.
+
+ To prepare your app, update `packages/app/src/components/Root/Root.tsx` as follows:
+
+ ```diff
+ import {
+ Sidebar,
+ sidebarConfig,
+ - SidebarContext
+ SidebarDivider,
+ // ...
+ SidebarSpace,
+ + useSidebarOpenState,
+ } from '@backstage/core-components';
+
+ // ...
+
+ const SidebarLogo = () => {
+ const classes = useSidebarLogoStyles();
+ - const { isOpen } = useContext(SidebarContext);
+ + const { isOpen } = useSidebarOpenState();
+
+ // ...
+ };
+ ```
+
+- 935d8515da: Updated the `--version` flag to output the version of the current backstage release instead of the version of create-app.
+
+- 18d4c3e50a: Updated `app-config.production.yaml` to specify an empty list of catalog locations. This is done to prevent example locations stored in `app-config.yaml` from being loaded as these are examples.
+
+- 1f70704580: Accessibility updates:
+
+ - Added `aria-label` to the sidebar Logo link. To enable this for an existing app, please make the following changes:
+
+ `packages/app/src/components/Root/Root.tsx`
+
+ ```diff
+ const SidebarLogo = () => {
+ const classes = useSidebarLogoStyles();
+ const { isOpen } = useContext(SidebarContext);
+
+ return (
+
+
+ {isOpen ? : }
+
+
+ );
+ };
+ ```
+
+- 30f04d1497: Components ``, ``, ``, and `` are now deprecated in `@backstage/plugin-search` and should be imported from `@backstage/plugin-search-react` instead.
+
+ To upgrade your App, update the following in `packages/app/src/components/search/SearchPage.tsx`:
+
+ ```diff
+ import {
+ DefaultResultListItem
+ SearchBar
+ SearchFilter
+ SearchResult
+ - } from `@backstage/plugin-search`;
+ + } from `@backstage/plugin-search-react`;
+ ```
+
+- f7f5a6c6a3: It's now possible to pass result item components a `rank`, which is captured by the analytics API when a user clicks on a search result. To apply this change, update your `/packages/app/src/components/search/SearchPage.tsx` in the following way:
+
+ ```diff
+ // ...
+
+ {({ results }) => (
+
+ - {results.map(({ type, document, highlight }) => {
+ + {results.map(({ type, document, highlight, rank }) => {
+ switch (type) {
+ case 'software-catalog':
+ return (
+
+ );
+ case 'techdocs':
+ return (
+
+ );
+ default:
+ return (
+
+ );
+ }
+ })}
+
+ )}
+
+ // ...
+ ```
+
+ If you have implemented a custom Search Modal or other custom search experience, you will want to make similar changes in those components.
+
+- aaf7652084: Bump version of `cypress` in newly scaffolded Backstage Applications. To apply this change to your own instance, please make the following change to `packages/app/package.json` under `devDependencies`.
+
+ ```diff
+ - "cypress": "^7.3.0",
+ + "cypress": "^9.7.0",
+ ```
+
+- 141a1caebe: Updated the auth backend setup in the template to include a guest sign-in resolver in order to make it quicker to get up and running with a basic sign-in setup. There is no need to update existing apps to match this change, but in case you want to use the guest sign-in resolver you can find it at
+
+## @backstage/dev-utils@1.0.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/test-utils@1.1.1
+ - @backstage/catalog-model@1.0.3
+ - @backstage/app-defaults@1.0.3
+
+## @backstage/integration@1.2.1
+
+### Patch Changes
+
+- 72dfcbc8bf: Gerrit Integration: Handle absolute paths in `resolveUrl` properly.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- e37c71b5a4: Updated to support deployments of Azure DevOps Server under TFS or similar sub path
+
+## @backstage/integration-react@1.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/release-manifests@0.0.4
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @techdocs/cli@1.1.2
+
+### Patch Changes
+
+- f96e98f4cd: Updated dependency `cypress` to `^10.0.0`.
+- bff65e6958: Updated sidebar-related logic to use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()` from `@backstage/core-components`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-techdocs-node@1.1.2
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/test-utils@1.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-permission-common@0.6.2
+ - @backstage/plugin-permission-react@0.4.2
+
+## @backstage/plugin-adr@0.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- a6458a120b: Adding term highlighting support to `AdrSearchResultListItem`
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-search-react@0.2.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/plugin-adr-common@0.1.1
+
+## @backstage/plugin-adr-backend@0.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-adr-common@0.1.1
+
+## @backstage/plugin-adr-common@0.1.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-airbrake@0.3.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/test-utils@1.1.1
+ - @backstage/catalog-model@1.0.3
+ - @backstage/dev-utils@1.0.3
+
+## @backstage/plugin-airbrake-backend@0.2.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## @backstage/plugin-allure@0.1.22
+
+### Patch Changes
+
+- 6387b7a98a: Add export for `isAllureReportAvailable` and `ALLURE_PROJECT_ID_ANNOTATION` so it can be used outside of plugin
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-analytics-module-ga@0.1.17
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-apache-airflow@0.1.14
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-api-docs@0.8.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 811ff4bcf4: Updated `swagger-ui-react` to 4.11.1 in order to address a [XSS
+ vulnerability](https://github.com/advisories/GHSA-hqq7-2q2v-82xq) in `@braintree/sanitize-url`
+- Updated dependencies
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-app-backend@0.3.33
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/config-loader@1.1.2
+
+## @backstage/plugin-auth-backend@0.14.1
+
+### Patch Changes
+
+- 5e055079f0: Increased key field size for signing_keys table to account for larger signature keys
+- f6aae90e4e: Added configurable algorithm field for TokenFactory
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- bc6fb57094: Updated dependency `passport` to `^0.6.0`.
+- 467facc6ea: Fix improper binding of 'this' in ALB Auth provider
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-auth-node@0.2.2
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-auth-node@0.2.2
+
+### Patch Changes
+
+- 5ca0b86b88: Address corner cases where the key store was not being created at startup
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 9079a78078: Added configurable algorithms array for IdentityClient
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## @backstage/plugin-azure-devops@0.1.22
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-azure-devops-backend@0.3.12
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## @backstage/plugin-badges@0.2.30
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-badges-backend@0.1.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-bazaar@0.1.21
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/cli@0.17.2
+ - @backstage/core-components@0.9.5
+ - @backstage/catalog-client@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-bazaar-backend@0.1.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/backend-test-utils@0.1.25
+
+## @backstage/plugin-bitrise@0.1.33
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-backend-module-aws@0.1.6
+
+### Patch Changes
+
+- eb2544b21b: Inline config interfaces
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-backend-module-azure@0.1.4
+
+### Patch Changes
+
+- b8884fd579: Add a new provider `AzureDevOpsEntityProvider` as replacement for `AzureDevOpsDiscoveryProcessor`.
+
+ In order to migrate from the `AzureDevOpsDiscoveryProcessor` you need to apply
+ the following changes:
+
+ **Before:**
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ locations:
+ - type: azure-discovery
+ target: https://dev.azure.com/myorg/myproject/_git/service-*?path=/catalog-info.yaml
+ ```
+
+ ```ts
+ /* packages/backend/src/plugins/catalog.ts */
+
+ import { AzureDevOpsDiscoveryProcessor } from '@backstage/plugin-catalog-backend-module-azure';
+
+ const builder = await CatalogBuilder.create(env);
+ /** ... other processors ... */
+ builder.addProcessor(new AzureDevOpsDiscoveryProcessor(env.reader));
+ ```
+
+ **After:**
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ providers:
+ azureDevOps:
+ anyProviderId:
+ host: selfhostedazure.yourcompany.com # This is only really needed for on-premise user, defaults to dev.azure.com
+ organization: myorg # For on-premise this would be your Collection
+ project: myproject
+ repository: service-*
+ path: /catalog-info.yaml
+ ```
+
+ ```ts
+ /* packages/backend/src/plugins/catalog.ts */
+
+ import { AzureDevOpsEntityProvider } from '@backstage/plugin-catalog-backend-module-azure';
+
+ const builder = await CatalogBuilder.create(env);
+ /** ... other processors and/or providers ... */
+ builder.addEntityProvider(
+ AzureDevOpsEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
+ }),
+ }),
+ );
+ ```
+
+ Visit for more details and options on configuration.
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.1
+
+### Patch Changes
+
+- eb2544b21b: Inline config interfaces
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-backend-module-github@0.1.4
+
+### Patch Changes
+
+- 8335a6f6f3: Adds an edit URL to the GitHub Teams Group entities.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.1.4
+
+### Patch Changes
+
+- eea8126171: Add a new provider `GitlabDiscoveryEntityProvider` as replacement for `GitlabDiscoveryProcessor`
+
+ In order to migrate from the `GitlabDiscoveryProcessor` you need to apply
+ the following changes:
+
+ **Before:**
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ locations:
+ - type: gitlab-discovery
+ target: https://company.gitlab.com/prefix/*/catalog-info.yaml
+ ```
+
+ ```ts
+ /* packages/backend/src/plugins/catalog.ts */
+
+ import { GitlabDiscoveryProcessor } from '@backstage/plugin-catalog-backend-module-gitlab';
+
+ const builder = await CatalogBuilder.create(env);
+ /** ... other processors ... */
+ builder.addProcessor(
+ GitLabDiscoveryProcessor.fromConfig(env.config, { logger: env.logger }),
+ );
+ ```
+
+ **After:**
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ providers:
+ gitlab:
+ yourProviderId: # identifies your dataset / provider independent of config changes
+ host: gitlab-host # Identifies one of the hosts set up in the integrations
+ branch: main # Optional. Uses `master` as default
+ group: example-group # Group and subgroup (if needed) to look for repositories
+ entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml`
+ ```
+
+ ```ts
+ /* packages/backend/src/plugins/catalog.ts */
+
+ import { GitlabDiscoveryEntityProvider } from '@backstage/plugin-catalog-backend-module-gitlab';
+
+ const builder = await CatalogBuilder.create(env);
+ /** ... other processors and/or providers ... */
+ builder.addEntityProvider(
+ ...GitlabDiscoveryEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
+ }),
+ }),
+ );
+ ```
+
+- bad907d794: The `last_activity_after` timestamp is now being omitted when querying the GitLab API for the first time.
+
+- 3ac4522537: do not create location object if file with component definition do not exists in project, that decrease count of request to gitlab with 404 status code. Now we can create processor with new flag to enable this logic:
+
+ ```ts
+ const processor = GitLabDiscoveryProcessor.fromConfig(config, {
+ logger,
+ skipReposWithoutExactFileMatch: true,
+ });
+ ```
+
+ **WARNING:** This new functionality does not support globs in the repo file path
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.3.3
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-common@1.0.3
+
+### Patch Changes
+
+- 7d8acfc32e: Replaced all usages of `@backstage/search-common` with `@backstage/plugin-search-common`
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-permission-common@0.6.2
+
+## @backstage/plugin-catalog-graph@0.2.18
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/catalog-client@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-graphql@0.3.10
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-import@0.8.9
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 05be420971: Updated catalog import page text so they go in the correct hierarchy order
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-catalog-react@1.1.1
+
+### Patch Changes
+
+- 1f70704580: Accessibility updates:
+
+ - Wrapped the `EntityLifecyclePicker`, `EntityOwnerPicker`, `EntityTagPicker`, in `label` elements
+ - Changed group name `Typography` component to `span` (from default `h6`), added `aria-label` to the `List` component, and `role` of `menuitem` to the container of the `MenuItem` component
+
+- 568f2d1e75: Table component no longer has drag and drop columns by default
+
+- Updated dependencies
+ - @backstage/plugin-catalog-common@1.0.3
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-permission-common@0.6.2
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-permission-react@0.4.2
+
+## @backstage/plugin-cicd-statistics@0.1.8
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-cicd-statistics-module-gitlab@0.1.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-cicd-statistics@0.1.8
+
+## @backstage/plugin-circleci@0.3.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-cloudbuild@0.3.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-code-climate@0.1.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-code-coverage@0.1.33
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-code-coverage-backend@0.1.31
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-codescene@0.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- ee2cd642c5: Updated dependency `rc-progress` to `3.3.3`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-config-schema@0.1.29
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-cost-insights@0.11.28
+
+### Patch Changes
+
+- dea1f32f44: In the README, a old path of the `sidebar` was updated to the current path.
+- eb2544b21b: Add missing `export` in configuration schema.
+- 2fc98ac50c: Fix broken app-config in the example in the README
+- 2297510941: Fixed css to show large tooltips on cost overview graph
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-explore@0.3.37
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-explore-react@0.0.18
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-explore-react@0.0.18
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-firehydrant@0.1.23
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-fossa@0.2.38
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-gcalendar@0.3.2
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-gcp-projects@0.3.25
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-git-release-manager@0.3.19
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-github-actions@0.5.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-github-deployments@0.1.37
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-gitops-profiles@0.3.24
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-gocd@0.1.12
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-graphiql@0.2.38
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 464c33f932: Fix for custom headers not being included in requests.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-graphql-backend@0.1.23
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-catalog-graphql@0.3.10
+
+## @backstage/plugin-home@0.4.22
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-stack-overflow@0.1.2
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-ilert@0.1.32
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-jenkins@0.7.5
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-jenkins-common@0.1.5
+
+## @backstage/plugin-jenkins-backend@0.1.23
+
+### Patch Changes
+
+- 83f6a64d2c: bug fix: provide backstage token for rebuild api call
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-auth-node@0.2.2
+ - @backstage/catalog-client@1.0.3
+ - @backstage/plugin-permission-common@0.6.2
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-jenkins-common@0.1.5
+
+## @backstage/plugin-jenkins-common@0.1.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-common@1.0.3
+ - @backstage/plugin-permission-common@0.6.2
+
+## @backstage/plugin-kafka@0.3.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-kafka-backend@0.2.26
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-kubernetes@0.6.6
+
+### Patch Changes
+
+- 4328737af6: Add support to fetch data for Stateful Sets and display an accordion in the same way as with Deployments
+- b9b8bbc7d9: show request/limit CPU and Memory on the UI
+- 5553f09e80: ability to configure refresh interval on Kubernetes tab
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 81304e3e91: Fix for HPA matching when deploying same HPA in multiple namespaces
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/plugin-kubernetes-common@0.3.0
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-lighthouse@0.3.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-newrelic@0.3.24
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-newrelic-dashboard@0.1.14
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-org@0.5.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+- 306d0b4fdd: Added the ability to use an additional `filter` when fetching groups in `MyGroupsSidebarItem` component. Example:
+
+ ```diff
+ // app/src/components/Root/Root.tsx
+
+
+ //...
+ }>
+ {/* Global nav, not org-specific */}
+ //...
+
+
+ //...
+
+ Sidebar>
+
+ ```
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-periskop@0.1.4
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-periskop-backend@0.1.4
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## @backstage/plugin-permission-backend@0.5.8
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-permission-node@0.6.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-auth-node@0.2.2
+ - @backstage/plugin-permission-common@0.6.2
+
+## @backstage/plugin-permission-common@0.6.2
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @backstage/plugin-permission-node@0.6.2
+
+### Patch Changes
+
+- 58426f9c0f: Added a new endpoint for aggregating permission metadata from a plugin backend: `/.well-known/backstage/permissions/metadata`
+
+ By default, the metadata endpoint will return information about the permission rules supported by the plugin. Plugin authors can also provide an optional `permissions` parameter to `createPermissionIntegrationRouter`. If provided, these `Permission` objects will be included in the metadata returned by this endpoint. The `permissions` parameter will eventually be required in a future breaking change.
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-auth-node@0.2.2
+ - @backstage/plugin-permission-common@0.6.2
+
+## @backstage/plugin-permission-react@0.4.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-permission-common@0.6.2
+
+## @backstage/plugin-proxy-backend@0.2.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## @backstage/plugin-rollbar@0.4.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-rollbar-backend@0.1.30
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.8
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.4.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0
+
+## @backstage/plugin-scaffolder-common@1.1.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-search-backend@0.5.3
+
+### Patch Changes
+
+- 7d8acfc32e: `RouterOptions` and `createRouter` now marked as public exports
+- 915700f64f: The provided search engine now adds a pagination-aware `rank` value to all results.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-permission-node@0.6.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-auth-node@0.2.2
+ - @backstage/plugin-search-backend-node@0.6.2
+ - @backstage/plugin-permission-common@0.6.2
+
+## @backstage/plugin-search-backend-module-elasticsearch@0.1.5
+
+### Patch Changes
+
+- 281cec1b61: Use more precise matching for query filters
+
+- 915700f64f: The provided search engine now adds a pagination-aware `rank` value to all results.
+
+- ddce23d080: Now possible to set a custom index template on the elasticsearch search engine.
+
+- 7d8acfc32e: Additional types now exported publicly:
+
+ - ElasticSearchAgentOptions
+ - ElasticSearchConcreteQuery
+ - ElasticSearchQueryTranslator
+ - ElasticSearchConnectionConstructor,
+ - ElasticSearchTransportConstructor,
+ - ElasticSearchNodeOptions,
+ - ElasticSearchOptions,
+ - ElasticSearchAuth,
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-search-backend-node@0.6.2
+
+## @backstage/plugin-search-backend-module-pg@0.3.4
+
+### Patch Changes
+
+- 915700f64f: The provided search engine now adds a pagination-aware `rank` value to all results.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-search-backend-node@0.6.2
+
+## @backstage/plugin-search-backend-node@0.6.2
+
+### Patch Changes
+
+- e7794a0aaa: propagate indexing errors so they don't appear successful to the task scheduler
+
+- 3bb25a9acc: Introducing a `NewlineDelimitedJsonCollatorFactory`, which can be used to create search indices from newline delimited JSON files stored in external storage readable via a configured `UrlReader` instance.
+
+ This is useful if you have an independent process periodically generating `*.ndjson` files consisting of `IndexableDocument` objects and want to be able to generate a fresh index based on the latest version of such a file.
+
+- 3bb25a9acc: Fixed a bug that prevented `TestPipeline.withSubject` from identifying valid `Readable` subjects that were technically transform streams.
+
+- 915700f64f: The provided search engine now adds a pagination-aware `rank` value to all results.
+
+- 7d8acfc32e: Replaced all `@beta` exports with `@public` exports
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-permission-common@0.6.2
+
+## @backstage/plugin-search-common@0.3.5
+
+### Patch Changes
+
+- 7d8acfc32e: `@beta` exports now replaced with `@public` exports
+- 484afdf1dc: Added an optional `rank` attribute to the `Result` type. This represents the result rank (starting at 1) for a given result in a result set for a given search.
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.6.2
+
+## @backstage/plugin-search-react@0.2.1
+
+### Patch Changes
+
+- 8809159148: Components ``, `` (including ``), `` (including `.Checkbox`, `.Select`, and `.Autocomplete` static prop components), ``, and `` are now exported from `@backstage/plugin-search-react`. They are now deprecated in `@backstage/plugin-search` and will be removed in a future release.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-sentry@0.3.44
+
+### Patch Changes
+
+- c55f6cb22d: Exported `isSentryAvailable` which can be used to determine if sentry is available.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-shortcuts@0.2.7
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-sonarqube@0.3.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- ee2cd642c5: Updated dependency `rc-progress` to `3.3.3`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-splunk-on-call@0.3.30
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-stack-overflow@0.1.2
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-home@0.4.22
+
+## @backstage/plugin-stack-overflow-backend@0.1.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+
+## @backstage/plugin-tech-insights@0.2.2
+
+### Patch Changes
+
+- 09d2f4d179: Export TechInsightsClient so it may be extended by custom implementations
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-tech-insights-backend@0.4.1
+
+### Patch Changes
+
+- 4fee8f59e3: Updated tech-insights fetch/latest endpoint to return the actual latest row based on the timestamp
+
+- aa15229ec3: Introduce additional JsonValue types to be storable as facts. This enables the possibility to store more complex objects for fact checking purposes. The rules engine supports walking keyed object values directly to create rules and checks
+
+ Modify facts database table to have a more restricted timestamp precision for cases where the postgres server isn't configured to contain such value. This fixes the issue where in some cases `maxItems` lifecycle condition didn't work as expected.
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/backend-common@0.14.0
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-tech-insights-node@0.3.1
+
+## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-tech-insights-node@0.3.1
+
+## @backstage/plugin-tech-insights-node@0.3.1
+
+### Patch Changes
+
+- aa15229ec3: Introduce additional JsonValue types to be storable as facts. This enables the possibility to store more complex objects for fact checking purposes. The rules engine supports walking keyed object values directly to create rules and checks
+
+ Modify facts database table to have a more restricted timestamp precision for cases where the postgres server isn't configured to contain such value. This fixes the issue where in some cases `maxItems` lifecycle condition didn't work as expected.
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## @backstage/plugin-tech-radar@0.5.13
+
+### Patch Changes
+
+- bb31e5489c: Updated dependency `d3-force` to `^3.0.0`.
+ Updated dependency `@types/d3-force` to `^3.0.0`.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- d047d81295: Update default mock
+- Updated dependencies
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-techdocs@1.2.0
+ - @backstage/plugin-search-react@0.2.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/test-utils@1.1.1
+ - @backstage/plugin-techdocs-react@1.0.1
+
+## @backstage/plugin-techdocs-backend@1.1.2
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+- 61fba6e50b: In order to ensure a good, stable TechDocs user experience when running TechDocs with `techdocs.builder` set to `local`, the number of concurrent builds has been limited to 10. Any additional builds requested concurrently will be queued and handled as prior builds complete. In the unlikely event that you need to handle more concurrent builds, consider scaling out your TechDocs backend deployment or using the `external` option for `techdocs.builder`.
+
+- 5d66d4ff67: Output logs from a TechDocs build to a logging transport in addition to existing
+ frontend event stream, for capturing these logs to other sources.
+
+ This allows users to capture debugging information around why tech docs fail to build
+ without needing to rely on end users capturing information from their web browser.
+
+ The most common use case is to log to the same place as the rest of the backend
+ application logs.
+
+ Sample usage:
+
+ import { DockerContainerRunner } from '@backstage/backend-common';
+ import {
+ createRouter,
+ Generators,
+ Preparers,
+ Publisher,
+ } from '@backstage/plugin-techdocs-backend';
+ import Docker from 'dockerode';
+ import { Router } from 'express';
+ import { PluginEnvironment } from '../types';
+
+ export default async function createPlugin(
+ env: PluginEnvironment,
+ ): Promise {
+ const preparers = await Preparers.fromConfig(env.config, {
+ logger: env.logger,
+ reader: env.reader,
+ });
+
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
+
+ const generators = await Generators.fromConfig(env.config, {
+ logger: env.logger,
+ containerRunner,
+ });
+
+ const publisher = await Publisher.fromConfig(env.config, {
+ logger: env.logger,
+ discovery: env.discovery,
+ });
+
+ await publisher.getReadiness();
+
+ return await createRouter({
+ preparers,
+ generators,
+ publisher,
+ logger: env.logger,
+ // Passing a buildLogTransport as a parameter in createRouter will enable
+ // capturing build logs to a backend log stream
+ buildLogTransport: env.logger,
+ config: env.config,
+ discovery: env.discovery,
+ cache: env.cache,
+ });
+ }
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-catalog-common@1.0.3
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/plugin-techdocs-node@1.1.2
+ - @backstage/catalog-client@1.0.3
+ - @backstage/plugin-permission-common@0.6.2
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.0.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/plugin-techdocs-react@1.0.1
+
+## @backstage/plugin-techdocs-node@1.1.2
+
+### Patch Changes
+
+- f5283a42e2: Updated dependency `@google-cloud/storage` to `^6.0.0`.
+- 2c048f8b90: Updated deprecated use of `express`' `res.redirect()` method when handling legacy path casing.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-techdocs-react@1.0.1
+
+### Patch Changes
+
+- 3b45ad701f: Creates a `TechDocsShadowDom` component that takes a tree of elements and an `onAppend` handler:
+
+ - Calls the `onAppend` handler when appending the element tree to the shadow root;
+ - Also dispatches an event when styles are loaded to let transformers know that the computed styles are ready to be consumed.
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-todo@0.2.8
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-todo-backend@0.1.30
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## @backstage/plugin-user-settings@0.4.5
+
+### Patch Changes
+
+- 9d2d6a0cea: Added new ` ` to show the result of the `identityApi.getBackstageIdentity()` call to help debug ownership issues. The new card has been added to the user settings page.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- bff65e6958: Updated sidebar-related logic to use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()` from `@backstage/core-components`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @backstage/plugin-xcmetrics@0.2.26
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## example-app@0.2.72
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes@0.6.6
+ - @backstage/plugin-cost-insights@0.11.28
+ - @backstage/plugin-scaffolder@1.3.0
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-techdocs@1.2.0
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/cli@0.17.2
+ - @backstage/plugin-user-settings@0.4.5
+ - @backstage/plugin-pagerduty@0.4.0
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-search@0.9.0
+ - @backstage/plugin-search-react@0.2.1
+ - @backstage/plugin-sentry@0.3.44
+ - @backstage/plugin-tech-insights@0.2.2
+ - @backstage/plugin-catalog-common@1.0.3
+ - @backstage/core-components@0.9.5
+ - @backstage/plugin-dynatrace@0.1.0
+ - @backstage/plugin-tech-radar@0.5.13
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/plugin-airbrake@0.3.6
+ - @backstage/plugin-apache-airflow@0.1.14
+ - @backstage/plugin-api-docs@0.8.6
+ - @backstage/plugin-azure-devops@0.1.22
+ - @backstage/plugin-badges@0.2.30
+ - @backstage/plugin-catalog-import@0.8.9
+ - @backstage/plugin-circleci@0.3.6
+ - @backstage/plugin-cloudbuild@0.3.6
+ - @backstage/plugin-code-coverage@0.1.33
+ - @backstage/plugin-explore@0.3.37
+ - @backstage/plugin-gcalendar@0.3.2
+ - @backstage/plugin-gcp-projects@0.3.25
+ - @backstage/plugin-github-actions@0.5.6
+ - @backstage/plugin-gocd@0.1.12
+ - @backstage/plugin-graphiql@0.2.38
+ - @backstage/plugin-home@0.4.22
+ - @backstage/plugin-jenkins@0.7.5
+ - @backstage/plugin-kafka@0.3.6
+ - @backstage/plugin-lighthouse@0.3.6
+ - @backstage/plugin-newrelic@0.3.24
+ - @backstage/plugin-org@0.5.6
+ - @backstage/plugin-rollbar@0.4.6
+ - @backstage/plugin-shortcuts@0.2.7
+ - @backstage/plugin-stack-overflow@0.1.2
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.1
+ - @backstage/plugin-todo@0.2.8
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-techdocs-react@1.0.1
+ - @backstage/app-defaults@1.0.3
+ - @backstage/plugin-catalog-graph@0.2.18
+ - @backstage/plugin-newrelic-dashboard@0.1.14
+ - @backstage/plugin-permission-react@0.4.2
+
+## example-backend@0.2.72
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-tech-insights-backend@0.4.1
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/plugin-auth-backend@0.14.1
+ - @backstage/plugin-scaffolder-backend@1.3.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/plugin-permission-node@0.6.2
+ - @backstage/plugin-kubernetes-backend@0.6.0
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-search-backend@0.5.3
+ - @backstage/plugin-auth-node@0.2.2
+ - @backstage/integration@1.2.1
+ - @backstage/plugin-jenkins-backend@0.1.23
+ - @backstage/plugin-search-backend-node@0.6.2
+ - @backstage/catalog-client@1.0.3
+ - @backstage/plugin-app-backend@0.3.33
+ - @backstage/plugin-azure-devops-backend@0.3.12
+ - @backstage/plugin-code-coverage-backend@0.1.31
+ - @backstage/plugin-graphql-backend@0.1.23
+ - @backstage/plugin-permission-backend@0.5.8
+ - @backstage/plugin-permission-common@0.6.2
+ - @backstage/plugin-rollbar-backend@0.1.30
+ - @backstage/plugin-techdocs-backend@1.1.2
+ - @backstage/plugin-todo-backend@0.1.30
+ - @backstage/plugin-search-backend-module-elasticsearch@0.1.5
+ - @backstage/plugin-search-backend-module-pg@0.3.4
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-tech-insights-node@0.3.1
+ - example-app@0.2.72
+ - @backstage/plugin-badges-backend@0.1.27
+ - @backstage/plugin-kafka-backend@0.2.26
+ - @backstage/plugin-proxy-backend@0.2.27
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.1
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17
+
+## techdocs-cli-embedded-app@0.2.71
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-techdocs@1.2.0
+ - @backstage/cli@0.17.2
+ - @backstage/core-components@0.9.5
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/test-utils@1.1.1
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-techdocs-react@1.0.1
+ - @backstage/app-defaults@1.0.3
+
+## @internal/plugin-todo-list@1.0.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+
+## @internal/plugin-todo-list-backend@1.0.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-auth-node@0.2.2
+
+## @internal/plugin-todo-list-common@1.0.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.6.2
diff --git a/docs/releases/v1.3.0-next.0-changelog.md b/docs/releases/v1.3.0-next.0-changelog.md
new file mode 100644
index 0000000000..412af14841
--- /dev/null
+++ b/docs/releases/v1.3.0-next.0-changelog.md
@@ -0,0 +1,1297 @@
+# Release v1.3.0-next.0
+
+## @backstage/plugin-catalog-backend@1.2.0-next.0
+
+### Minor Changes
+
+- b594679ae3: Allow array as non-spread arguments at the `CatalogBuilder`.
+
+ ```typescript
+ builder.addEntityProvider(...getArrayOfProviders());
+ ```
+
+ can be simplified to
+
+ ```typescript
+ builder.addEntityProvider(getArrayOfProviders());
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.0
+
+## @backstage/plugin-catalog-backend-module-ldap@0.5.0-next.0
+
+### Minor Changes
+
+- 1f83f0bc84: Added the possibility to pass TLS configuration to ldap connection
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/plugin-kubernetes-backend@0.6.0-next.0
+
+### Minor Changes
+
+- 4328737af6: Add support to fetch data for Stateful Sets from Kubernetes
+
+### Patch Changes
+
+- 0c70cd8e1d: cache and refresh Azure tokens to avoid excessive calls to Azure Identity
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-kubernetes-common@0.3.0-next.0
+
+## @backstage/plugin-kubernetes-common@0.3.0-next.0
+
+### Minor Changes
+
+- 4328737af6: Add support to fetch data for Stateful Sets
+
+## @backstage/plugin-scaffolder@1.3.0-next.0
+
+### Minor Changes
+
+- 86a4a0f72d: Get data of other fields in Form from a custom field in template Scaffolder.
+ following:
+
+ ```tsx
+ const CustomFieldExtensionComponent = (props: FieldExtensionComponentProps) => {
+ const { formData } = props.formContext;
+ ...
+ };
+
+ const CustomFieldExtension = scaffolderPlugin.provide(
+ createScaffolderFieldExtension({
+ name: ...,
+ component: CustomFieldExtensionComponent,
+ validation: ...
+ })
+ );
+ ```
+
+- 72dfcbc8bf: Gerrit Integration: Implemented a `RepoUrlPicker` for Gerrit.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @backstage/plugin-scaffolder-backend@1.3.0-next.0
+
+### Minor Changes
+
+- 72dfcbc8bf: A new scaffolder action has been added: `gerrit:publish`
+
+### Patch Changes
+
+- 6901f6be4a: Adds more of an explanation when the `publish:github` scaffolder action fails to create a repository.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/app-defaults@1.0.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/backend-common@0.13.6-next.0
+
+### Patch Changes
+
+- f72a6b8c62: Applied the `luxon` dependency fix from the `0.13.4` patch release.
+- 5b22a8c97f: Applied the AWS S3 reading patch from the `0.13.5` patch release.
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/backend-tasks@0.3.2-next.0
+
+### Patch Changes
+
+- fde10d24f6: Allow tasks that fail to retry on a loop emitting a warning log every time it fails with the amount of attempts it has
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/backend-test-utils@0.1.25-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.17.2-next.0
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/cli@0.17.2-next.0
+
+### Patch Changes
+
+- 4f73352608: Updated Lockfile to support new versions of yarn as well as the legacy 1 version
+- 6de866ea74: Added console warning to frontend start when the `app.baseUrl` and `backend.baseUrl` are identical
+
+## @backstage/core-components@0.9.5-next.0
+
+### Patch Changes
+
+- 65840b17be: Fix issue where right arrow icon was incorrectly added to side bar items without a sub-menu
+- 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
+- 96d1e01641: Accessibility updates:
+
+ - Added `aria-label` to the `Select` component
+ - Changed heading level used in the header of `Table` component
+
+## @backstage/create-app@0.4.28-next.0
+
+### Patch Changes
+
+- 881fbd7e8d: Register `TechDocs` addons on catalog entity pages, follow the steps below to add them manually:
+
+ ```diff
+ // packages/app/src/components/catalog/EntityPage.tsx
+
+ + import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
+ + import {
+ + ReportIssue,
+ + } from '@backstage/plugin-techdocs-module-addons-contrib';
+
+ + const techdocsContent = (
+ +
+ +
+ +
+ +
+ +
+ + );
+
+ const defaultEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+
+ const serviceEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+
+ const websiteEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+ ```
+
+- 935d8515da: Updated the `--version` flag to output the version of the current backstage release instead of the version of create-app.
+
+- 1f70704580: Accessibility updates:
+
+ - Added `aria-label` to the sidebar Logo link. To enable this for an existing app, please make the following changes:
+
+ `packages/app/src/components/Root/Root.tsx`
+
+ ```diff
+ const SidebarLogo = () => {
+ const classes = useSidebarLogoStyles();
+ const { isOpen } = useContext(SidebarContext);
+
+ return (
+
+
+ {isOpen ? : }
+
+
+ );
+ };
+ ```
+
+## @backstage/dev-utils@1.0.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/app-defaults@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @backstage/integration@1.2.1-next.0
+
+### Patch Changes
+
+- 72dfcbc8bf: Gerrit Integration: Handle absolute paths in `resolveUrl` properly.
+
+## @backstage/integration-react@1.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @techdocs/cli@1.1.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-techdocs-node@1.1.2-next.0
+
+## @backstage/techdocs-common@0.11.16-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.1.2-next.0
+
+## @backstage/plugin-adr@0.1.1-next.0
+
+### Patch Changes
+
+- a6458a120b: Adding term highlighting support to `AdrSearchResultListItem`
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration-react@1.1.1-next.0
+ - @backstage/plugin-adr-common@0.1.1-next.0
+
+## @backstage/plugin-adr-backend@0.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-adr-common@0.1.1-next.0
+
+## @backstage/plugin-adr-common@0.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-airbrake@0.3.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/dev-utils@1.0.3-next.0
+
+## @backstage/plugin-airbrake-backend@0.2.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-allure@0.1.22-next.0
+
+### Patch Changes
+
+- 6387b7a98a: Add export for `isAllureReportAvailable` and `ALLURE_PROJECT_ID_ANNOTATION` so it can be used outside of plugin
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-analytics-module-ga@0.1.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-apache-airflow@0.1.14-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-api-docs@0.8.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-app-backend@0.3.33-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-auth-backend@0.14.1-next.0
+
+### Patch Changes
+
+- f6aae90e4e: Added configurable algorithm field for TokenFactory
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
+
+## @backstage/plugin-auth-node@0.2.2-next.0
+
+### Patch Changes
+
+- 9079a78078: Added configurable algorithms array for IdentityClient
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-azure-devops@0.1.22-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-azure-devops-backend@0.3.12-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-badges@0.2.30-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-badges-backend@0.1.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-bazaar@0.1.21-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/cli@0.17.2-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-bazaar-backend@0.1.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/backend-test-utils@0.1.25-next.0
+
+## @backstage/plugin-bitrise@0.1.33-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-catalog@1.2.1-next.0
+
+### Patch Changes
+
+- 449dcef98e: Updates the `isKind`, `รฌsComponentType`, and `isNamespace` to allow an array of possible values
+
+- 1f70704580: Accessibility updates:
+
+ - Added screen reader elements to describe default table `Action` buttons
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @backstage/plugin-catalog-backend-module-aws@0.1.6-next.0
+
+### Patch Changes
+
+- eb2544b21b: Inline config interfaces
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/plugin-catalog-backend-module-azure@0.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket@0.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.1-next.0
+
+### Patch Changes
+
+- eb2544b21b: Inline config interfaces
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/plugin-catalog-backend-module-github@0.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.1.4-next.0
+
+### Patch Changes
+
+- 3ac4522537: do not create location object if file with component definition do not exists in project, that decrease count of request to gitlab with 404 status code. Now we can create processor with new flag to enable this logic:
+
+ ```ts
+ const processor = GitLabDiscoveryProcessor.fromConfig(config, {
+ logger,
+ skipReposWithoutExactFileMatch: true,
+ });
+ ```
+
+ **WARNING:** This new functionality does not support globs in the repo file path
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.3.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+
+## @backstage/plugin-catalog-graph@0.2.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-catalog-import@0.8.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @backstage/plugin-catalog-react@1.1.1-next.0
+
+### Patch Changes
+
+- 1f70704580: Accessibility updates:
+
+ - Wrapped the `EntityLifecyclePicker`, `EntityOwnerPicker`, `EntityTagPicker`, in `label` elements
+ - Changed group name `Typography` component to `span` (from default `h6`), added `aria-label` to the `List` component, and `role` of `menuitem` to the container of the `MenuItem` component
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-cicd-statistics@0.1.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+
+## @backstage/plugin-cicd-statistics-module-gitlab@0.1.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-cicd-statistics@0.1.8-next.0
+
+## @backstage/plugin-circleci@0.3.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-cloudbuild@0.3.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-code-climate@0.1.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-code-coverage@0.1.33-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-code-coverage-backend@0.1.31-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-codescene@0.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-config-schema@0.1.29-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-cost-insights@0.11.28-next.0
+
+### Patch Changes
+
+- eb2544b21b: Add missing `export` in configuration schema.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-explore@0.3.37-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-firehydrant@0.1.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-fossa@0.2.38-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-gcalendar@0.3.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-gcp-projects@0.3.25-next.0
+
+### Patch Changes
+
+- 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-git-release-manager@0.3.19-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-github-actions@0.5.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-github-deployments@0.1.37-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @backstage/plugin-gitops-profiles@0.3.24-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-gocd@0.1.12-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-graphiql@0.2.38-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-graphql-backend@0.1.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-home@0.4.22-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/plugin-stack-overflow@0.1.2-next.0
+
+## @backstage/plugin-ilert@0.1.32-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-jenkins@0.7.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-jenkins-backend@0.1.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
+
+## @backstage/plugin-kafka@0.3.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-kafka-backend@0.2.26-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-kubernetes@0.6.6-next.0
+
+### Patch Changes
+
+- 4328737af6: Add support to fetch data for Stateful Sets and display an accordion in the same way as with Deployments
+- 81304e3e91: Fix for HPA matching when deploying same HPA in multiple namespaces
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/plugin-kubernetes-common@0.3.0-next.0
+
+## @backstage/plugin-lighthouse@0.3.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-newrelic@0.3.24-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-newrelic-dashboard@0.1.14-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-org@0.5.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-pagerduty@0.3.33-next.0
+
+### Patch Changes
+
+- 76bf6400fe: Fix alert that was not showing after creating an incident.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-periskop@0.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-periskop-backend@0.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-permission-backend@0.5.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.0
+
+## @backstage/plugin-permission-node@0.6.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
+
+## @backstage/plugin-proxy-backend@0.2.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-rollbar@0.4.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-rollbar-backend@0.1.30-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.0
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.0
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.0
+
+## @backstage/plugin-search@0.8.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-search-backend@0.5.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-search-backend-node@0.6.2-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.0
+
+## @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@0.6.2-next.0
+
+## @backstage/plugin-search-backend-module-pg@0.3.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-search-backend-node@0.6.2-next.0
+
+## @backstage/plugin-search-backend-node@0.6.2-next.0
+
+### Patch Changes
+
+- e7794a0aaa: propagate indexing errors so they don't appear successful to the task scheduler
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+
+## @backstage/plugin-sentry@0.3.44-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-shortcuts@0.2.7-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-sonarqube@0.3.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-splunk-on-call@0.3.30-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-stack-overflow@0.1.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/plugin-home@0.4.22-next.0
+
+## @backstage/plugin-tech-insights@0.2.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-tech-insights-backend@0.4.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-tech-insights-node@0.3.1-next.0
+
+## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-tech-insights-node@0.3.1-next.0
+
+## @backstage/plugin-tech-insights-node@0.3.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
+## @backstage/plugin-tech-radar@0.5.13-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-techdocs@1.1.2-next.0
+
+### Patch Changes
+
+- 881fbd7e8d: Fix `EntityTechdocsContent` component to use objects instead of `` elements, otherwise "outlet" will be null on sub-pages and add-ons won't render.
+
+- 17c059dfd0: Restructures reader style transformations to improve code readability:
+
+ - Extracts the style rules to separate files;
+ - Creates a hook that processes each rule;
+ - And creates another hook that returns a transformer responsible for injecting them into the head tag of a given element.
+
+- 3b45ad701f: Packages a set of tweaks to the TechDocs addons rendering process:
+
+ - Prevents displaying sidebars until page styles are loaded and the sidebar position is updated;
+ - Prevents new sidebar locations from being created every time the reader page is rendered if these locations already exist;
+ - Centers the styles loaded event to avoid having multiple locations setting the opacity style in Shadow Dom causing the screen to flash multiple times.
+
+- 816f7475ec: Convert `sanitizeDOM` transformer to hook as part of code readability improvements in dom file.
+
+- 50ff56a80f: Change the `EntityDocsPage` path to be more specific and also add integration tests for `sub-routes` on this page.
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/plugin-techdocs@1.1.2-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @backstage/plugin-techdocs-backend@1.1.2-next.0
+
+### Patch Changes
+
+- 5d66d4ff67: Output logs from a TechDocs build to a logging transport in addition to existing
+ frontend event stream, for capturing these logs to other sources.
+
+ This allows users to capture debugging information around why tech docs fail to build
+ without needing to rely on end users capturing information from their web browser.
+
+ The most common use case is to log to the same place as the rest of the backend
+ application logs.
+
+ Sample usage:
+
+ import { DockerContainerRunner } from '@backstage/backend-common';
+ import {
+ createRouter,
+ Generators,
+ Preparers,
+ Publisher,
+ } from '@backstage/plugin-techdocs-backend';
+ import Docker from 'dockerode';
+ import { Router } from 'express';
+ import { PluginEnvironment } from '../types';
+
+ export default async function createPlugin(
+ env: PluginEnvironment,
+ ): Promise {
+ const preparers = await Preparers.fromConfig(env.config, {
+ logger: env.logger,
+ reader: env.reader,
+ });
+
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
+
+ const generators = await Generators.fromConfig(env.config, {
+ logger: env.logger,
+ containerRunner,
+ });
+
+ const publisher = await Publisher.fromConfig(env.config, {
+ logger: env.logger,
+ discovery: env.discovery,
+ });
+
+ await publisher.getReadiness();
+
+ return await createRouter({
+ preparers,
+ generators,
+ publisher,
+ logger: env.logger,
+ // Passing a buildLogTransport as a parameter in createRouter will enable
+ // capturing build logs to a backend log stream
+ buildLogTransport: env.logger,
+ config: env.config,
+ discovery: env.discovery,
+ cache: env.cache,
+ });
+ }
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-techdocs-node@1.1.2-next.0
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.0
+
+### Patch Changes
+
+- 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @backstage/plugin-techdocs-node@1.1.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-techdocs-react@1.0.1-next.0
+
+### Patch Changes
+
+- 3b45ad701f: Creates a `TechDocsShadowDom` component that takes a tree of elements and an `onAppend` handler:
+
+ - Calls the `onAppend` handler when appending the element tree to the shadow root;
+ - Also dispatches an event when styles are loaded to let transformers know that the computed styles are ready to be consumed.
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-todo@0.2.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-todo-backend@0.1.30-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+
+## @backstage/plugin-user-settings@0.4.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @backstage/plugin-xcmetrics@0.2.26-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## example-app@0.2.72-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes@0.6.6-next.0
+ - @backstage/plugin-cost-insights@0.11.28-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/cli@0.17.2-next.0
+ - @backstage/plugin-pagerduty@0.3.33-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/plugin-gcp-projects@0.3.25-next.0
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.0
+ - @backstage/plugin-scaffolder@1.3.0-next.0
+ - @backstage/plugin-techdocs@1.1.2-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.0
+ - @backstage/plugin-airbrake@0.3.6-next.0
+ - @backstage/plugin-api-docs@0.8.6-next.0
+ - @backstage/plugin-azure-devops@0.1.22-next.0
+ - @backstage/plugin-badges@0.2.30-next.0
+ - @backstage/plugin-catalog-graph@0.2.18-next.0
+ - @backstage/plugin-catalog-import@0.8.9-next.0
+ - @backstage/plugin-circleci@0.3.6-next.0
+ - @backstage/plugin-cloudbuild@0.3.6-next.0
+ - @backstage/plugin-code-coverage@0.1.33-next.0
+ - @backstage/plugin-explore@0.3.37-next.0
+ - @backstage/plugin-github-actions@0.5.6-next.0
+ - @backstage/plugin-gocd@0.1.12-next.0
+ - @backstage/plugin-home@0.4.22-next.0
+ - @backstage/plugin-jenkins@0.7.5-next.0
+ - @backstage/plugin-kafka@0.3.6-next.0
+ - @backstage/plugin-lighthouse@0.3.6-next.0
+ - @backstage/plugin-newrelic-dashboard@0.1.14-next.0
+ - @backstage/plugin-org@0.5.6-next.0
+ - @backstage/plugin-rollbar@0.4.6-next.0
+ - @backstage/plugin-search@0.8.2-next.0
+ - @backstage/plugin-sentry@0.3.44-next.0
+ - @backstage/plugin-tech-insights@0.2.2-next.0
+ - @backstage/plugin-todo@0.2.8-next.0
+ - @backstage/app-defaults@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.0
+ - @backstage/plugin-apache-airflow@0.1.14-next.0
+ - @backstage/plugin-gcalendar@0.3.2-next.0
+ - @backstage/plugin-graphiql@0.2.38-next.0
+ - @backstage/plugin-newrelic@0.3.24-next.0
+ - @backstage/plugin-shortcuts@0.2.7-next.0
+ - @backstage/plugin-stack-overflow@0.1.2-next.0
+ - @backstage/plugin-tech-radar@0.5.13-next.0
+ - @backstage/plugin-user-settings@0.4.5-next.0
+
+## example-backend@0.2.72-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.0
+ - @backstage/plugin-kubernetes-backend@0.6.0-next.0
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-auth-backend@0.14.1-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-search-backend-node@0.6.2-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
+ - @backstage/plugin-techdocs-backend@1.1.2-next.0
+ - example-app@0.2.72-next.0
+ - @backstage/plugin-app-backend@0.3.33-next.0
+ - @backstage/plugin-azure-devops-backend@0.3.12-next.0
+ - @backstage/plugin-badges-backend@0.1.27-next.0
+ - @backstage/plugin-code-coverage-backend@0.1.31-next.0
+ - @backstage/plugin-graphql-backend@0.1.23-next.0
+ - @backstage/plugin-jenkins-backend@0.1.23-next.0
+ - @backstage/plugin-kafka-backend@0.2.26-next.0
+ - @backstage/plugin-permission-backend@0.5.8-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.0
+ - @backstage/plugin-proxy-backend@0.2.27-next.0
+ - @backstage/plugin-rollbar-backend@0.1.30-next.0
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.0
+ - @backstage/plugin-search-backend@0.5.3-next.0
+ - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.0
+ - @backstage/plugin-search-backend-module-pg@0.3.4-next.0
+ - @backstage/plugin-tech-insights-backend@0.4.1-next.0
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.0
+ - @backstage/plugin-tech-insights-node@0.3.1-next.0
+ - @backstage/plugin-todo-backend@0.1.30-next.0
+
+## techdocs-cli-embedded-app@0.2.71-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/cli@0.17.2-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/plugin-techdocs@1.1.2-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.0
+ - @backstage/app-defaults@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
+## @internal/plugin-todo-list@1.0.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
+## @internal/plugin-todo-list-backend@1.0.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
diff --git a/docs/releases/v1.3.0-next.1-changelog.md b/docs/releases/v1.3.0-next.1-changelog.md
new file mode 100644
index 0000000000..3d110614a1
--- /dev/null
+++ b/docs/releases/v1.3.0-next.1-changelog.md
@@ -0,0 +1,1597 @@
+# Release v1.3.0-next.1
+
+## @backstage/plugin-bitbucket-cloud-common@0.1.0-next.0
+
+### Minor Changes
+
+- 1dffa7dd4d: Add new common library `bitbucket-cloud-common` with a client for Bitbucket Cloud.
+
+ This client can be reused across all packages and might be the future place for additional
+ features like managing the rate limits, etc.
+
+ The client itself was generated in parts using the `@openapitools/openapi-generator-cli`.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket@0.2.0-next.1
+
+### Minor Changes
+
+- 1c01c0fd14: Integrate `@backstage/plugin-bitbucket-cloud-common` as replacement for the `BitbucketCloudClient`.
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-bitbucket-cloud-common@0.1.0-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.0-next.0
+
+### Minor Changes
+
+- dfc4efcbf0: Add new plugin `catalog-backend-module-bitbucket-cloud` with `BitbucketCloudEntityProvider`.
+
+ This entity provider is an alternative/replacement to the `BitbucketDiscoveryProcessor` **_(for Bitbucket Cloud only!)_**.
+ It replaces use cases using `search=true` and should be powerful enough as a complete replacement.
+
+ If any feature for Bitbucket Cloud is missing and preventing you from switching, please raise an issue.
+
+ **Before:**
+
+ ```typescript
+ // packages/backend/src/plugins/catalog.ts
+
+ builder.addProcessor(
+ BitbucketDiscoveryProcessor.fromConfig(env.config, { logger: env.logger }),
+ );
+ ```
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ locations:
+ - type: bitbucket-discovery
+ target: 'https://bitbucket.org/workspaces/workspace-name/projects/apis-*/repos/service-*?search=true&catalogPath=/catalog-info.yaml'
+ ```
+
+ **After:**
+
+ ```typescript
+ // packages/backend/src/plugins/catalog.ts
+ builder.addEntityProvider(
+ BitbucketCloudEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
+ }),
+ }),
+ );
+ ```
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ providers:
+ bitbucketCloud:
+ yourProviderId: # identifies your ingested dataset
+ catalogPath: /catalog-info.yaml # default value
+ filters: # optional
+ projectKey: '^apis-.* # optional; RegExp
+ repoSlug: '^service-.* # optional; RegExp
+ workspace: workspace-name
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/plugin-bitbucket-cloud-common@0.1.0-next.0
+
+## @backstage/plugin-github-pull-requests-board@0.1.0-next.0
+
+### Minor Changes
+
+- fc9927c81d: Add Github Pull Requests board plugin
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-scaffolder-backend@1.3.0-next.1
+
+### Minor Changes
+
+- c042c5eaff: Add an option to not protect the default branch.
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-scaffolder-common@1.1.1-next.0
+
+## @backstage/app-defaults@1.0.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-permission-react@0.4.2-next.0
+
+## @backstage/backend-common@0.13.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/config-loader@1.1.2-next.0
+ - @backstage/integration@1.2.1-next.1
+
+## @backstage/backend-tasks@0.3.2-next.1
+
+### Patch Changes
+
+- f7146b516f: Updated dependency `cron` to `^2.0.0`.
+ Updated dependency `@types/cron` to `^2.0.0`.
+- 7f108513b8: Add error logging when a background task throws an error rather than silently swallowing it.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## @backstage/backend-test-utils@0.1.25-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/cli@0.17.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+
+## @backstage/catalog-client@1.0.3-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/catalog-model@1.0.3-next.0
+
+### Patch Changes
+
+- 131a99e909: Added targetRef to common.schema.json to match the Typescript type
+
+## @backstage/cli@0.17.2-next.1
+
+### Patch Changes
+
+- bd58365d09: Updated dependency `run-script-webpack-plugin` to `^0.0.14`.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/config-loader@1.1.2-next.0
+ - @backstage/release-manifests@0.0.4-next.0
+
+## @backstage/config-loader@1.1.2-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @backstage/core-app-api@1.0.3-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/core-components@0.9.5-next.1
+
+### Patch Changes
+
+- feb4e8de07: Fix EntityPage tab scrolling overflow bug on Firefox
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+- bff65e6958: The `SidebarPinStateContext` and `SidebarContext` have been deprecated and will be removed in a future release. Instead, use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()`.
+
+ This was done to ensure that sidebar state can be shared successfully across components exported by different packages, regardless of what version of this package is resolved and installed for each individual package.
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/core-plugin-api@1.0.3-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @backstage/create-app@0.4.28-next.1
+
+### Patch Changes
+
+- bff65e6958: Use of `SidebarContext` has been deprecated and will be removed in a future release. Instead, `useSidebarOpenState()` should be used to consume the context and `` should be used to provide it.
+
+ To prepare your app, update `packages/app/src/components/Root/Root.tsx` as follows:
+
+ ```diff
+ import {
+ Sidebar,
+ sidebarConfig,
+ - SidebarContext
+ SidebarDivider,
+ // ...
+ SidebarSpace,
+ + useSidebarOpenState,
+ } from '@backstage/core-components';
+
+ // ...
+
+ const SidebarLogo = () => {
+ const classes = useSidebarLogoStyles();
+ - const { isOpen } = useContext(SidebarContext);
+ + const { isOpen } = useSidebarOpenState();
+
+ // ...
+ };
+ ```
+
+## @backstage/dev-utils@1.0.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/test-utils@1.1.1-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/app-defaults@1.0.3-next.1
+
+## @backstage/integration@1.2.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @backstage/integration-react@1.1.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+
+## @backstage/release-manifests@0.0.4-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @backstage/search-common@0.3.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @techdocs/cli@1.1.2-next.1
+
+### Patch Changes
+
+- bff65e6958: Updated sidebar-related logic to use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()` from `@backstage/core-components`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-techdocs-node@1.1.2-next.1
+
+## @backstage/techdocs-common@0.11.16-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.1.2-next.1
+
+## @backstage/test-utils@1.1.1-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-permission-react@0.4.2-next.0
+
+## @backstage/plugin-adr@0.1.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/plugin-search-react@0.2.1-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+ - @backstage/plugin-adr-common@0.1.1-next.1
+
+## @backstage/plugin-adr-backend@0.1.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+ - @backstage/plugin-adr-common@0.1.1-next.1
+
+## @backstage/plugin-adr-common@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-airbrake@0.3.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/test-utils@1.1.1-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/dev-utils@1.0.3-next.1
+
+## @backstage/plugin-airbrake-backend@0.2.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## @backstage/plugin-allure@0.1.22-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-analytics-module-ga@0.1.17-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-apache-airflow@0.1.14-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-api-docs@0.8.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-app-backend@0.3.33-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/config-loader@1.1.2-next.0
+
+## @backstage/plugin-auth-backend@0.14.1-next.1
+
+### Patch Changes
+
+- 5e055079f0: Increased key field size for signing_keys table to account for larger signature keys
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 467facc6ea: Fix improper binding of 'this' in ALB Auth provider
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-auth-node@0.2.2-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## @backstage/plugin-azure-devops@0.1.22-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-azure-devops-backend@0.3.12-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## @backstage/plugin-badges@0.2.30-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-badges-backend@0.1.27-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-bazaar@0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/cli@0.17.2-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-bitrise@0.1.33-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-catalog@1.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/plugin-search-react@0.2.1-next.0
+ - @backstage/plugin-catalog-common@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-catalog-backend@1.2.0-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-common@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+ - @backstage/plugin-scaffolder-common@1.1.1-next.0
+
+## @backstage/plugin-catalog-backend-module-aws@0.1.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-catalog-backend-module-azure@0.1.4-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-catalog-backend-module-github@0.1.4-next.1
+
+### Patch Changes
+
+- 8335a6f6f3: Adds an edit URL to the GitHub Teams Group entities.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.1.4-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-catalog-backend-module-ldap@0.5.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.3.3-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-catalog-common@1.0.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/search-common@0.3.5-next.0
+
+## @backstage/plugin-catalog-graph@0.2.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-catalog-graphql@0.3.10-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-catalog-import@0.8.9-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 05be420971: Updated catalog import page text so they go in the correct hierarchy order
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-catalog-react@1.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-permission-react@0.4.2-next.0
+ - @backstage/plugin-catalog-common@1.0.3-next.0
+
+## @backstage/plugin-cicd-statistics@0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-cicd-statistics-module-gitlab@0.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-cicd-statistics@0.1.8-next.1
+
+## @backstage/plugin-circleci@0.3.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-cloudbuild@0.3.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-code-climate@0.1.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-code-coverage@0.1.33-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-code-coverage-backend@0.1.31-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-codescene@0.1.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-config-schema@0.1.29-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-cost-insights@0.11.28-next.1
+
+### Patch Changes
+
+- 2297510941: Fixed css to show large tooltips on cost overview graph
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-explore@0.3.37-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-explore-react@0.0.18-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-explore-react@0.0.18-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-firehydrant@0.1.23-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-fossa@0.2.38-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-gcalendar@0.3.2-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-gcp-projects@0.3.25-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-git-release-manager@0.3.19-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+
+## @backstage/plugin-github-actions@0.5.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-github-deployments@0.1.37-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-gitops-profiles@0.3.24-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-gocd@0.1.12-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-graphiql@0.2.38-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 464c33f932: Fix for custom headers not being included in requests.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-graphql-backend@0.1.23-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/plugin-catalog-graphql@0.3.10-next.0
+
+## @backstage/plugin-home@0.4.22-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-stack-overflow@0.1.2-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-ilert@0.1.32-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-jenkins@0.7.5-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/plugin-jenkins-common@0.1.5-next.0
+
+## @backstage/plugin-jenkins-backend@0.1.23-next.1
+
+### Patch Changes
+
+- 83f6a64d2c: bug fix: provide backstage token for rebuild api call
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-jenkins-common@0.1.5-next.0
+
+## @backstage/plugin-jenkins-common@0.1.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-catalog-common@1.0.3-next.0
+
+## @backstage/plugin-kafka@0.3.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-kafka-backend@0.2.26-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-kubernetes@0.6.6-next.1
+
+### Patch Changes
+
+- b9b8bbc7d9: show request/limit CPU and Memory on the UI
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/plugin-kubernetes-common@0.3.0-next.1
+
+## @backstage/plugin-kubernetes-backend@0.6.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-kubernetes-common@0.3.0-next.1
+
+## @backstage/plugin-kubernetes-common@0.3.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-lighthouse@0.3.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-newrelic@0.3.24-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-newrelic-dashboard@0.1.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-org@0.5.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-pagerduty@0.3.33-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-periskop@0.1.4-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-periskop-backend@0.1.4-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## @backstage/plugin-permission-backend@0.5.8-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/plugin-auth-node@0.2.2-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.1
+
+## @backstage/plugin-permission-common@0.6.2-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## @backstage/plugin-permission-node@0.6.2-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/plugin-auth-node@0.2.2-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+
+## @backstage/plugin-permission-react@0.4.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-permission-common@0.6.2-next.0
+
+## @backstage/plugin-rollbar@0.4.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-rollbar-backend@0.1.30-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## @backstage/plugin-scaffolder@1.3.0-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/plugin-permission-react@0.4.2-next.0
+ - @backstage/plugin-catalog-common@1.0.3-next.0
+ - @backstage/plugin-scaffolder-common@1.1.1-next.0
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.8-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.1
+
+## @backstage/plugin-scaffolder-common@1.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-search@0.8.2-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/plugin-search-react@0.2.1-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-search-backend@0.5.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/plugin-auth-node@0.2.2-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.1
+ - @backstage/plugin-search-backend-node@0.6.2-next.1
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.1
+
+### Patch Changes
+
+- 281cec1b61: Use more precise matching for query filters
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@0.6.2-next.1
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-search-backend-module-pg@0.3.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/plugin-search-backend-node@0.6.2-next.1
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-search-backend-node@0.6.2-next.1
+
+### Patch Changes
+
+- 3bb25a9acc: Introducing a `NewlineDelimitedJsonCollatorFactory`, which can be used to create search indices from newline delimited JSON files stored in external storage readable via a configured `UrlReader` instance.
+
+ This is useful if you have an independent process periodically generating `*.ndjson` files consisting of `IndexableDocument` objects and want to be able to generate a fresh index based on the latest version of such a file.
+
+- 3bb25a9acc: Fixed a bug that prevented `TestPipeline.withSubject` from identifying valid `Readable` subjects that were technically transform streams.
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-search-common@0.3.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.6.2-next.0
+
+## @backstage/plugin-search-react@0.2.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-sentry@0.3.44-next.1
+
+### Patch Changes
+
+- c55f6cb22d: Exported `isSentryAvailable` which can be used to determine if sentry is available.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-shortcuts@0.2.7-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-sonarqube@0.3.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-splunk-on-call@0.3.30-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-stack-overflow@0.1.2-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-home@0.4.22-next.1
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-stack-overflow-backend@0.1.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-tech-insights@0.2.2-next.1
+
+### Patch Changes
+
+- 09d2f4d179: Export TechInsightsClient so it may be extended by custom implementations
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-tech-insights-backend@0.4.1-next.1
+
+### Patch Changes
+
+- 4fee8f59e3: Updated tech-insights fetch/latest endpoint to return the actual latest row based on the timestamp
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-tech-radar@0.5.13-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-techdocs@1.1.2-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- bff65e6958: Updated sidebar-related logic to use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()` from `@backstage/core-components`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/plugin-search-react@0.2.1-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.1
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/test-utils@1.1.1-next.0
+ - @backstage/plugin-techdocs@1.1.2-next.1
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/plugin-search-react@0.2.1-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.1
+
+## @backstage/plugin-techdocs-backend@1.1.2-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-common@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+ - @backstage/plugin-techdocs-node@1.1.2-next.1
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-techdocs-react@1.0.1-next.1
+
+## @backstage/plugin-techdocs-node@1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## @backstage/plugin-techdocs-react@1.0.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-todo@0.2.8-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## @backstage/plugin-todo-backend@0.1.30-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## @backstage/plugin-user-settings@0.4.5-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- bff65e6958: Updated sidebar-related logic to use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()` from `@backstage/core-components`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @backstage/plugin-xcmetrics@0.2.26-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## example-app@0.2.72-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-sentry@0.3.44-next.1
+ - @backstage/plugin-kubernetes@0.6.6-next.1
+ - @backstage/plugin-tech-insights@0.2.2-next.1
+ - @backstage/plugin-cost-insights@0.11.28-next.1
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/cli@0.17.2-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/plugin-airbrake@0.3.6-next.1
+ - @backstage/plugin-apache-airflow@0.1.14-next.1
+ - @backstage/plugin-api-docs@0.8.6-next.1
+ - @backstage/plugin-azure-devops@0.1.22-next.1
+ - @backstage/plugin-badges@0.2.30-next.1
+ - @backstage/plugin-catalog-import@0.8.9-next.1
+ - @backstage/plugin-circleci@0.3.6-next.1
+ - @backstage/plugin-cloudbuild@0.3.6-next.1
+ - @backstage/plugin-code-coverage@0.1.33-next.1
+ - @backstage/plugin-explore@0.3.37-next.1
+ - @backstage/plugin-gcalendar@0.3.2-next.1
+ - @backstage/plugin-gcp-projects@0.3.25-next.1
+ - @backstage/plugin-github-actions@0.5.6-next.1
+ - @backstage/plugin-gocd@0.1.12-next.1
+ - @backstage/plugin-graphiql@0.2.38-next.1
+ - @backstage/plugin-home@0.4.22-next.1
+ - @backstage/plugin-jenkins@0.7.5-next.1
+ - @backstage/plugin-kafka@0.3.6-next.1
+ - @backstage/plugin-lighthouse@0.3.6-next.1
+ - @backstage/plugin-newrelic@0.3.24-next.1
+ - @backstage/plugin-org@0.5.6-next.1
+ - @backstage/plugin-pagerduty@0.3.33-next.1
+ - @backstage/plugin-rollbar@0.4.6-next.1
+ - @backstage/plugin-scaffolder@1.3.0-next.1
+ - @backstage/plugin-search@0.8.2-next.1
+ - @backstage/plugin-shortcuts@0.2.7-next.1
+ - @backstage/plugin-stack-overflow@0.1.2-next.1
+ - @backstage/plugin-tech-radar@0.5.13-next.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.1
+ - @backstage/plugin-techdocs@1.1.2-next.1
+ - @backstage/plugin-todo@0.2.8-next.1
+ - @backstage/plugin-user-settings@0.4.5-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/plugin-catalog-graph@0.2.18-next.1
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/app-defaults@1.0.3-next.1
+ - @backstage/plugin-search-react@0.2.1-next.0
+ - @backstage/plugin-newrelic-dashboard@0.1.14-next.1
+ - @backstage/plugin-permission-react@0.4.2-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.1
+ - @backstage/plugin-catalog-common@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## example-backend@0.2.72-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-tech-insights-backend@0.4.1-next.1
+ - @backstage/plugin-auth-backend@0.14.1-next.1
+ - @backstage/plugin-jenkins-backend@0.1.23-next.1
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-app-backend@0.3.33-next.1
+ - @backstage/plugin-auth-node@0.2.2-next.1
+ - @backstage/plugin-azure-devops-backend@0.3.12-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/plugin-code-coverage-backend@0.1.31-next.1
+ - @backstage/plugin-graphql-backend@0.1.23-next.1
+ - @backstage/plugin-permission-backend@0.5.8-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.1
+ - @backstage/plugin-rollbar-backend@0.1.30-next.1
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.1
+ - @backstage/plugin-techdocs-backend@1.1.2-next.1
+ - @backstage/plugin-todo-backend@0.1.30-next.1
+ - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.1
+ - @backstage/plugin-search-backend-node@0.6.2-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-badges-backend@0.1.27-next.1
+ - example-app@0.2.72-next.1
+ - @backstage/plugin-search-backend@0.5.3-next.1
+ - @backstage/plugin-kafka-backend@0.2.26-next.1
+ - @backstage/plugin-kubernetes-backend@0.6.0-next.1
+ - @backstage/plugin-search-backend-module-pg@0.3.4-next.1
+
+## techdocs-cli-embedded-app@0.2.71-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/cli@0.17.2-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/test-utils@1.1.1-next.0
+ - @backstage/plugin-techdocs@1.1.2-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/app-defaults@1.0.3-next.1
+ - @backstage/plugin-techdocs-react@1.0.1-next.1
+
+## @internal/plugin-todo-list@1.0.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## @internal/plugin-todo-list-common@1.0.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.6.2-next.0
diff --git a/docs/releases/v1.3.0-next.2-changelog.md b/docs/releases/v1.3.0-next.2-changelog.md
new file mode 100644
index 0000000000..fc4bb19080
--- /dev/null
+++ b/docs/releases/v1.3.0-next.2-changelog.md
@@ -0,0 +1,678 @@
+# Release v1.3.0-next.2
+
+## @backstage/backend-common@0.14.0-next.2
+
+### Minor Changes
+
+- 55647ec7df: **BREAKING**: Server-to-server tokens that are authenticated by the `ServerTokenManager` now must have an `exp` claim that has not expired. Tokens where the `exp` claim is in the past or missing are considered invalid and will throw an error. This is a followup to the deprecation from the `1.2` release of Backstage where perpetual tokens were deprecated. Be sure to update any usage of the `getToken()` method to have it be called every time a token is needed. Do not store tokens for later use.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.2
+
+## @backstage/plugin-pagerduty@0.4.0-next.2
+
+### Minor Changes
+
+- b157c2eb1c: **Breaking**: Use identityApi to provide auth token for pagerduty API calls.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.2
+
+## @backstage/plugin-scaffolder@1.3.0-next.2
+
+### Minor Changes
+
+- dc39366bdb: - Added a new page under `/create/tasks` to show tasks that have been run by the Scaffolder.
+ - Ability to filter these tasks by the signed in user, and all tasks.
+ - Added optional method to the `ScaffolderApi` interface called `listTasks` to get tasks with an required `filterByOwnership` parameter.
+
+### Patch Changes
+
+- ac0c7e45ee: Fixes review mask in `MultistepJsonForm` to work as documented. `show: true` no longer needed when mask is set.
+- fd505f40c0: Handle binary files and files that are too large during dry-run content upload.
+- Updated dependencies
+ - @backstage/plugin-catalog-common@1.0.3-next.1
+ - @backstage/core-components@0.9.5-next.2
+ - @backstage/integration@1.2.1-next.2
+
+## @backstage/plugin-scaffolder-backend@1.3.0-next.2
+
+### Minor Changes
+
+- ce0d8d7eb1: Fixed a bug in `publish:github` action that didn't permit to add users as collaborators.
+ This fix required changing the way parameters are passed to the action.
+ In order to add a team as collaborator, now you must use the `team` field instead of `username`.
+ In order to add a user as collaborator, you must use the `user` field.
+
+ It's still possible to use the field `username` but is deprecated in favor of `team`.
+
+ ```yaml
+ - id: publish
+ name: Publish
+ action: publish:github
+ input:
+ repoUrl: ...
+ collaborators:
+ - access: ...
+ team: my_team
+ - access: ...
+ user: my_username
+ ```
+
+- 582003a059: - Added an optional `list` method on the `TaskBroker` and `TaskStore` interface to list tasks by an optional `userEntityRef`
+ - Implemented a `list` method on the `DatabaseTaskStore` class to list tasks by an optional `userEntityRef`
+ - Added a route under `/v2/tasks` to list tasks by a `userEntityRef` using the `createdBy` query parameter
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+
+## @backstage/backend-tasks@0.3.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/backend-test-utils@0.1.25-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.17.2-next.2
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/cli@0.17.2-next.2
+
+### Patch Changes
+
+- 026cfe525a: Fix the public path configuration of the frontend app build so that a trailing `/` is always appended when needed.
+- 9002ebd76b: Updated dependency `@rollup/plugin-commonjs` to `^22.0.0`.
+- 1a33e8b287: Updated dependency `minimatch` to `5.1.0`.
+
+## @backstage/core-components@0.9.5-next.2
+
+### Patch Changes
+
+- ee2cd642c5: Updated dependency `rc-progress` to `3.3.3`.
+- 1cf9caecd6: fix Sidebar Contexts deprecation message
+
+## @backstage/create-app@0.4.28-next.2
+
+### Patch Changes
+
+- aaf7652084: Bump version of `cypress` in newly scaffolded Backstage Applications. To apply this change to your own instance, please make the following change to `packages/app/package.json` under `devDependencies`.
+
+ ```diff
+ - "cypress": "^7.3.0",
+ + "cypress": "^9.7.0",
+ ```
+
+## @backstage/integration@1.2.1-next.2
+
+### Patch Changes
+
+- e37c71b5a4: Updated to support deployments of Azure DevOps Server under TFS or similar sub path
+
+## @backstage/search-common@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+
+## @techdocs/cli@1.1.2-next.2
+
+### Patch Changes
+
+- f96e98f4cd: Updated dependency `cypress` to `^10.0.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-techdocs-node@1.1.2-next.2
+
+## @backstage/techdocs-common@0.11.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.1.2-next.2
+
+## @backstage/plugin-adr-backend@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+
+## @backstage/plugin-airbrake-backend@0.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-app-backend@0.3.33-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-auth-backend@0.14.1-next.2
+
+### Patch Changes
+
+- bc6fb57094: Updated dependency `passport` to `^0.6.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
+
+## @backstage/plugin-auth-node@0.2.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-azure-devops-backend@0.3.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-badges-backend@0.1.27-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-bazaar-backend@0.1.17-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/backend-test-utils@0.1.25-next.2
+
+## @backstage/plugin-catalog-backend@1.2.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/plugin-catalog-common@1.0.3-next.1
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/plugin-permission-node@0.6.2-next.2
+
+## @backstage/plugin-catalog-backend-module-aws@0.1.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/backend-tasks@0.3.2-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+
+## @backstage/plugin-catalog-backend-module-azure@0.1.4-next.2
+
+### Patch Changes
+
+- b8884fd579: Add a new provider `AzureDevOpsEntityProvider` as replacement for `AzureDevOpsDiscoveryProcessor`.
+
+ In order to migrate from the `AzureDevOpsDiscoveryProcessor` you need to apply
+ the following changes:
+
+ **Before:**
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ locations:
+ - type: azure-discovery
+ target: https://dev.azure.com/myorg/myproject/_git/service-*?path=/catalog-info.yaml
+ ```
+
+ ```ts
+ /* packages/backend/src/plugins/catalog.ts */
+
+ import { AzureDevOpsDiscoveryProcessor } from '@backstage/plugin-catalog-backend-module-azure';
+
+ const builder = await CatalogBuilder.create(env);
+ /** ... other processors ... */
+ builder.addProcessor(new AzureDevOpsDiscoveryProcessor(env.reader));
+ ```
+
+ **After:**
+
+ ```yaml
+ # app-config.yaml
+
+ catalog:
+ providers:
+ azureDevOps:
+ anyProviderId:
+ host: selfhostedazure.yourcompany.com # This is only really needed for on-premise user, defaults to dev.azure.com
+ organization: myorg # For on-premise this would be your Collection
+ project: myproject
+ repository: service-*
+ path: /catalog-info.yaml
+ ```
+
+ ```ts
+ /* packages/backend/src/plugins/catalog.ts */
+
+ import { AzureDevOpsEntityProvider } from '@backstage/plugin-catalog-backend-module-azure';
+
+ const builder = await CatalogBuilder.create(env);
+ /** ... other processors and/or providers ... */
+ builder.addEntityProvider(
+ AzureDevOpsEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
+ }),
+ }),
+ );
+ ```
+
+ Visit for more details and options on configuration.
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/backend-tasks@0.3.2-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+
+## @backstage/plugin-catalog-backend-module-bitbucket@0.2.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/backend-tasks@0.3.2-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+
+## @backstage/plugin-catalog-backend-module-github@0.1.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/backend-tasks@0.3.2-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.1.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+
+## @backstage/plugin-catalog-common@1.0.3-next.1
+
+### Patch Changes
+
+- 7d8acfc32e: Replaced all usages of `@backstage/search-common` with `@backstage/plugin-search-common`
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+
+## @backstage/plugin-code-coverage-backend@0.1.31-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+
+## @backstage/plugin-codescene@0.1.1-next.2
+
+### Patch Changes
+
+- ee2cd642c5: Updated dependency `rc-progress` to `3.3.3`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.2
+
+## @backstage/plugin-cost-insights@0.11.28-next.2
+
+### Patch Changes
+
+- 2fc98ac50c: Fix broken app-config in the example in the README
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.2
+
+## @backstage/plugin-graphql-backend@0.1.23-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-jenkins-backend@0.1.23-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
+
+## @backstage/plugin-kafka-backend@0.2.26-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-kubernetes@0.6.6-next.2
+
+### Patch Changes
+
+- 5553f09e80: ability to configure refresh interval on Kubernetes tab
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.2
+
+## @backstage/plugin-kubernetes-backend@0.6.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-org@0.5.6-next.2
+
+### Patch Changes
+
+- 306d0b4fdd: Added the ability to use an additional `filter` when fetching groups in `MyGroupsSidebarItem` component. Example:
+
+ ```diff
+ // app/src/components/Root/Root.tsx
+
+
+ //...
+ }>
+ {/* Global nav, not org-specific */}
+ //...
+
+
+ //...
+
+ Sidebar>
+
+ ```
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.2
+
+## @backstage/plugin-periskop-backend@0.1.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-permission-backend@0.5.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
+ - @backstage/plugin-permission-node@0.6.2-next.2
+
+## @backstage/plugin-permission-node@0.6.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
+
+## @backstage/plugin-proxy-backend@0.2.27-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-rollbar-backend@0.1.30-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.2
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.2
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+
+## @backstage/plugin-search@0.8.2-next.2
+
+### Patch Changes
+
+- 5388e6bdc5: Fixed a bug that could cause analytics events in other parts of Backstage to capture nonsensical values resembling search modal state under some circumstances.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/core-components@0.9.5-next.2
+
+## @backstage/plugin-search-backend@0.5.3-next.2
+
+### Patch Changes
+
+- 7d8acfc32e: `RouterOptions` and `createRouter` now marked as public exports
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-search-backend-node@0.6.2-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
+ - @backstage/plugin-permission-node@0.6.2-next.2
+
+## @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.2
+
+### Patch Changes
+
+- 7d8acfc32e: Additional types now exported publicly:
+
+ - ElasticSearchAgentOptions
+ - ElasticSearchConcreteQuery
+ - ElasticSearchQueryTranslator
+ - ElasticSearchConnectionConstructor,
+ - ElasticSearchTransportConstructor,
+ - ElasticSearchNodeOptions,
+ - ElasticSearchOptions,
+ - ElasticSearchAuth,
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/plugin-search-backend-node@0.6.2-next.2
+
+## @backstage/plugin-search-backend-module-pg@0.3.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-search-backend-node@0.6.2-next.2
+
+## @backstage/plugin-search-backend-node@0.6.2-next.2
+
+### Patch Changes
+
+- 7d8acfc32e: Replaced all `@beta` exports with `@public` exports
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/backend-tasks@0.3.2-next.2
+
+## @backstage/plugin-search-common@0.3.5-next.1
+
+### Patch Changes
+
+- 7d8acfc32e: `@beta` exports now replaced with `@public` exports
+
+## @backstage/plugin-sonarqube@0.3.6-next.2
+
+### Patch Changes
+
+- ee2cd642c5: Updated dependency `rc-progress` to `3.3.3`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.2
+
+## @backstage/plugin-tech-insights-backend@0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/backend-tasks@0.3.2-next.2
+ - @backstage/plugin-tech-insights-node@0.3.1-next.1
+
+## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-tech-insights-node@0.3.1-next.1
+
+## @backstage/plugin-tech-insights-node@0.3.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## @backstage/plugin-techdocs-backend@1.1.2-next.2
+
+### Patch Changes
+
+- 61fba6e50b: In order to ensure a good, stable TechDocs user experience when running TechDocs with `techdocs.builder` set to `local`, the number of concurrent builds has been limited to 10. Any additional builds requested concurrently will be queued and handled as prior builds complete. In the unlikely event that you need to handle more concurrent builds, consider scaling out your TechDocs backend deployment or using the `external` option for `techdocs.builder`.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/plugin-catalog-common@1.0.3-next.1
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/plugin-techdocs-node@1.1.2-next.2
+
+## @backstage/plugin-techdocs-node@1.1.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+
+## @backstage/plugin-todo-backend@0.1.30-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+
+## example-app@0.2.72-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder@1.3.0-next.2
+ - @backstage/cli@0.17.2-next.2
+ - @backstage/plugin-pagerduty@0.4.0-next.2
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/plugin-cost-insights@0.11.28-next.2
+ - @backstage/plugin-catalog-common@1.0.3-next.1
+ - @backstage/plugin-kubernetes@0.6.6-next.2
+ - @backstage/core-components@0.9.5-next.2
+ - @backstage/plugin-search@0.8.2-next.2
+ - @backstage/plugin-org@0.5.6-next.2
+
+## example-backend@0.2.72-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.2
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-search-backend@0.5.3-next.2
+ - @backstage/plugin-auth-backend@0.14.1-next.2
+ - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/plugin-techdocs-backend@1.1.2-next.2
+ - @backstage/plugin-search-backend-node@0.6.2-next.2
+ - example-app@0.2.72-next.2
+ - @backstage/backend-tasks@0.3.2-next.2
+ - @backstage/plugin-app-backend@0.3.33-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
+ - @backstage/plugin-azure-devops-backend@0.3.12-next.2
+ - @backstage/plugin-badges-backend@0.1.27-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+ - @backstage/plugin-code-coverage-backend@0.1.31-next.2
+ - @backstage/plugin-graphql-backend@0.1.23-next.2
+ - @backstage/plugin-jenkins-backend@0.1.23-next.2
+ - @backstage/plugin-kafka-backend@0.2.26-next.2
+ - @backstage/plugin-kubernetes-backend@0.6.0-next.2
+ - @backstage/plugin-permission-backend@0.5.8-next.2
+ - @backstage/plugin-permission-node@0.6.2-next.2
+ - @backstage/plugin-proxy-backend@0.2.27-next.1
+ - @backstage/plugin-rollbar-backend@0.1.30-next.2
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.1
+ - @backstage/plugin-search-backend-module-pg@0.3.4-next.2
+ - @backstage/plugin-tech-insights-backend@0.4.1-next.2
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.1
+ - @backstage/plugin-tech-insights-node@0.3.1-next.1
+ - @backstage/plugin-todo-backend@0.1.30-next.2
+
+## @internal/plugin-todo-list-backend@1.0.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
diff --git a/docs/releases/v1.3.0.md b/docs/releases/v1.3.0.md
new file mode 100644
index 0000000000..8014e0a121
--- /dev/null
+++ b/docs/releases/v1.3.0.md
@@ -0,0 +1,65 @@
+---
+id: v1.3.0
+title: v1.3.0
+description: Backstage Release v1.3.0
+---
+
+These are the release notes for the v1.3.0 release of [Backstage](https://backstage.io/).
+
+A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done.
+
+## Highlights
+
+### Scaffolder Dry Run and Template Editor
+
+The scaffolder plugin now has a new template editor in addition to the form editor, which is accessible via the context menu on the top right hand corner of the Create page. It allows you to load a template from a local directory, edit it with a preview, execute it in dry-run mode, and view the results. Note that the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API) must be supported by your browser for this to be available.
+
+### TypeScript 4.7
+
+The recommended TypeScript version has been bumped to `~4.7.0`, and thatโs what the main Backstage repository uses right now for its builds. Each Backstage project manages their version separately however, so there is no rush or immediate effect on users - you can update the `typescript` dependency in your root `package.json` once you feel ready to do so.
+
+### Expiring Backend Tokens
+
+In 1.2 we introduced expiry times for server-to-server authentication tokens issued from the standard `TokenManager`. At that point in time, the expiry was only added to tokens and not yet enforced. In this release however, it is now also enforced, meaning that expired tokens are considered invalid and will be rejected.
+
+### Discovery providers
+
+Several new [entity providers](https://backstage.io/docs/features/software-catalog/life-of-an-entity) have been contributed as replacements for their corresponding discovery processors. Entity providers allow for more control and are [recommended](https://backstage.io/docs/features/software-catalog/external-integrations) over their processing counterparts.
+
+- `AzureDevOpsEntityProvider` as replacement for `AzureDevOpsDiscoveryProcessor`. PR [#11604](https://github.com/backstage/backstage/pull/11604) contributed by [@goenning](https://github.com/goenning)
+- `GitlabDiscoveryEntityProvider` as replacement for `GitLabDiscoveryProcessor`. PR [#11886](https://github.com/backstage/backstage/pull/11886) contributed by [@ivangonzalezacuna](https://github.com/ivangonzalezacuna)
+- `BitbucketCloudEntityProvider` as a replacement for `BitbucketDiscoveryProcessor` (for Bitbucket Cloud only). PR [#11345](https://github.com/backstage/backstage/pull/11345) contributed by [@pjungermann](โโhttps://github.com/pjungermann)
+
+### New plugin: Vault
+
+View secrets from [HashiCorp Vault](https://www.vaultproject.io/) alongside your components. PR [#11423](https://github.com/backstage/backstage/pull/11423) contributed by [@ivangonzalezacuna](https://github.com/ivangonzalezacuna)
+
+### New plugin: GitHub Pull Requests Board
+
+GitHub Pull Requests Board Plugin is a board that helps you visualize all open pull requests from all repositories owned by a team, with the main goal of reducing the time from opening a PR to merging it. PR [#11043](https://github.com/backstage/backstage/pull/11043) contributed by [@gregorytalita](https://github.com/gregorytalita)
+
+### New plugin: Dynatrace
+
+Displays tracing data from [Dynatrace](https://www.dynatrace.com/) alongside your components. PR [#11754](https://github.com/backstage/backstage/pull/11754) contributed by [@isand3r](https://github.com/isand3r)
+
+## Security Fixes
+
+`@backstage/plugin-scaffolder-backend`, please upgrade to the latest version if you are using this module.
+`@backstage/plugin-techdocs-node`, please upgrade to the latest version if you are using this module.
+
+## Upgrade path
+
+We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated).
+
+## Links and References
+
+Below you can find a list of links and references to help you learn about and start using this new release.
+
+- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/)
+- [GitHub repository](https://github.com/backstage/backstage)
+- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy)
+- [Community Discord](https://discord.gg/bFESRKVt) for discussions and support
+- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.3.0-changelog.md)
+- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap), and [Plugins](https://backstage.io/plugins)
+
+Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage.
diff --git a/microsite/data/on-demand/20220518-01.yaml b/microsite/data/on-demand/20220518-01.yaml
index e98c79005a..e8d70df2d9 100644
--- a/microsite/data/on-demand/20220518-01.yaml
+++ b/microsite/data/on-demand/20220518-01.yaml
@@ -1,9 +1,9 @@
---
title: Adopters Community Sessions
date: May 18, 2022
-category: Upcoming
+category: Meetup
description: Adopters Community Session โจ. It's the monthly meetup where we all come together to listen to the latest maintainer updates, learn from each other about adopting, share exciting new demos or discuss any relevant topic like developer effectiveness, developer experience, developer portals, etc.
-youtubeUrl: https://youtu.be/dEd1fl3wRv
+youtubeUrl: https://youtu.be/dEd1fl3wRvo
youtubeImgUrl: https://backstage.io/img/b-sessions.png
rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
eventUrl: https://github.com/backstage/community/issues/46
diff --git a/microsite/data/on-demand/20220525.yaml b/microsite/data/on-demand/20220525.yaml
new file mode 100644
index 0000000000..f9a3f87a8a
--- /dev/null
+++ b/microsite/data/on-demand/20220525.yaml
@@ -0,0 +1,9 @@
+---
+title: Contributor Community Sessions
+date: May 25, 2022
+category: Meetup
+description: Join the maintainers and contributors for the Contributor Community Sessions
+youtubeUrl: https://youtu.be/neNipVE5ffY
+youtubeImgUrl: https://backstage.io/img/b-sessions.png
+rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
+eventUrl: https://github.com/backstage/community/issues/46
diff --git a/microsite/data/on-demand/20220615-01.yaml b/microsite/data/on-demand/20220615-01.yaml
new file mode 100644
index 0000000000..8ac660a71c
--- /dev/null
+++ b/microsite/data/on-demand/20220615-01.yaml
@@ -0,0 +1,9 @@
+---
+title: Adopters Community Sessions
+date: June 15, 2022
+category: Upcoming
+description: Adopters Community Session โจ. It's the monthly meetup where we all come together to listen to the latest maintainer updates, learn from each other about adopting, share exciting new demos or discuss any relevant topic like developer effectiveness, developer experience, developer portals, etc.
+youtubeUrl: https://youtu.be/aKZnjnE5Wy8
+youtubeImgUrl: https://backstage.io/img/b-sessions.png
+rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
+eventUrl: https://github.com/backstage/community/issues/49
diff --git a/microsite/data/on-demand/20220622-1.yaml b/microsite/data/on-demand/20220622-1.yaml
new file mode 100644
index 0000000000..0bbd53525a
--- /dev/null
+++ b/microsite/data/on-demand/20220622-1.yaml
@@ -0,0 +1,9 @@
+---
+title: Contributor Community Sessions
+date: June 22, 2022
+category: Upcoming
+description: Join the maintainers and contributors for the Contributor Community Sessions
+youtubeUrl: https://youtu.be/aKZnjnE5Wy8
+youtubeImgUrl: https://backstage.io/img/b-sessions.png
+rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
+eventUrl: https://github.com/backstage/community/issues/49
diff --git a/microsite/data/plugins/cloudify.yaml b/microsite/data/plugins/cloudify.yaml
new file mode 100644
index 0000000000..e5bcbe1545
--- /dev/null
+++ b/microsite/data/plugins/cloudify.yaml
@@ -0,0 +1,9 @@
+---
+title: Cloudify
+author: Cloudify
+authorUrl: https://cloudify.co/
+category: Orchestration
+description: Cloudify provides a remote execution and environment management backend for Kubernetes, Terraform, Ansible, etc.
+documentation: https://github.com/cloudify-cosmo/backstage-cloudify-plugin#readme
+iconUrl: https://avatars.githubusercontent.com/u/6260555?s=200&v=4
+npmPackageName: 'plugin-cloudify'
diff --git a/microsite/data/plugins/dynatrace.yaml b/microsite/data/plugins/dynatrace.yaml
new file mode 100644
index 0000000000..3ab85ae1eb
--- /dev/null
+++ b/microsite/data/plugins/dynatrace.yaml
@@ -0,0 +1,12 @@
+---
+title: Dynatrace
+author: TELUS
+authorUrl: https://github.com/telus
+category: Monitoring
+description: View monitoring info from dynatrace for services in your software catalog.
+documentation: https://github.com/backstage/backstage/tree/master/plugins/dynatrace
+iconUrl: img/dynatrace.svg
+npmPackageName: '@backstage/plugin-dynatrace'
+tags:
+ - dynatrace
+ - monitoring
diff --git a/microsite/data/plugins/github-pull-requests-board.yaml b/microsite/data/plugins/github-pull-requests-board.yaml
new file mode 100644
index 0000000000..fa710f5fc8
--- /dev/null
+++ b/microsite/data/plugins/github-pull-requests-board.yaml
@@ -0,0 +1,9 @@
+---
+title: Github Pull Requests Board
+author: DAZN
+authorUrl: https://engineering.dazn.com
+category: Source Control Mgmt
+description: View all open GitHub pull requests owned by your team in Backstage.
+documentation: https://github.com/backstage/backstage/tree/master/plugins/github-pull-requests-board
+iconUrl: img/github-pull-requests-board-logo.svg
+npmPackageName: '@backstage/plugin-github-pull-requests-board'
diff --git a/microsite/data/plugins/grpc-playground.yaml b/microsite/data/plugins/grpc-playground.yaml
new file mode 100644
index 0000000000..097759be11
--- /dev/null
+++ b/microsite/data/plugins/grpc-playground.yaml
@@ -0,0 +1,9 @@
+---
+title: GRPC Playground
+author: Zalopay-OSS
+authorUrl: https://github.com/zalopay-oss/
+category: Discovery
+description: Easily view and test your gRPC API with a GUI Client, inspired from BloomRPC application.
+documentation: https://github.com/zalopay-oss/backstage-grpc-playground
+iconUrl: https://raw.githubusercontent.com/zalopay-oss/backstage-grpc-playground/main/images/gprc-logo.png
+npmPackageName: 'backstage-grpc-playground'
diff --git a/microsite/data/plugins/rootly.yaml b/microsite/data/plugins/rootly.yaml
new file mode 100644
index 0000000000..c1769f637a
--- /dev/null
+++ b/microsite/data/plugins/rootly.yaml
@@ -0,0 +1,9 @@
+---
+title: Rootly
+author: Rootly
+authorUrl: https://rootly.com/
+category: Incident Management
+description: Import your Backstage entities into Rootly services and view incidents & analytics.
+documentation: https://github.com/rootlyhq/backstage-plugin/blob/master/README.md
+iconUrl: https://raw.githubusercontent.com/rootlyhq/backstage-plugin/master/docs/logo.png
+npmPackageName: '@rootly/backstage-plugin'
diff --git a/microsite/data/plugins/stack-overflow.yaml b/microsite/data/plugins/stack-overflow.yaml
new file mode 100644
index 0000000000..0d734446d7
--- /dev/null
+++ b/microsite/data/plugins/stack-overflow.yaml
@@ -0,0 +1,9 @@
+---
+title: Stack Overflow
+author: Spotify
+authorUrl: https://github.com/spotify
+category: Discovery
+description: Provides Stack Overflow specific functionality that can be used in different ways (e.g. for homepage and search) to compose your Backstage App.
+documentation: https://github.com/backstage/backstage/blob/master/plugins/stack-overflow
+iconUrl: img/stack-overflow-logo.svg
+npmPackageName: '@backstage/plugin-stack-overflow'
diff --git a/microsite/data/plugins/vault.yaml b/microsite/data/plugins/vault.yaml
new file mode 100644
index 0000000000..3214cf669a
--- /dev/null
+++ b/microsite/data/plugins/vault.yaml
@@ -0,0 +1,11 @@
+---
+title: Vault
+author: Spread Group
+authorUrl: https://github.com/ivangonzalezacuna
+category: Vault
+description: Visualize a list secrets stored in your vault instance.
+documentation: https://github.com/backstage/backstage/tree/master/plugins/vault
+iconUrl: img/vault.png
+npmPackageName: '@backstage/plugin-vault'
+tags:
+ - vault
diff --git a/microsite/pages/en/link.js b/microsite/pages/en/link.js
index 727b15bfd8..6f56aa768c 100644
--- a/microsite/pages/en/link.js
+++ b/microsite/pages/en/link.js
@@ -5,7 +5,7 @@ const React = require('react');
const redirects = {
'bind-routes':
'/docs/plugins/composability#binding-external-routes-in-the-app',
- 'scm-auth': '/docs/auth/#custom-scmauthapi-implementation',
+ 'scm-auth': '/docs/auth/#scaffolder-configuration-software-templates',
};
const fallback = '/docs';
diff --git a/microsite/pages/en/live.js b/microsite/pages/en/live.js
index 9f8a0e24b0..062af419fc 100644
--- a/microsite/pages/en/live.js
+++ b/microsite/pages/en/live.js
@@ -34,7 +34,7 @@ const Background = props => {
VIDEOVIDEO
diff --git a/microsite/sidebars.json b/microsite/sidebars.json
index a8dc4e53ee..29fb3a0534 100644
--- a/microsite/sidebars.json
+++ b/microsite/sidebars.json
@@ -1,6 +1,11 @@
{
"releases": {
- "Release Notes": ["releases/v1.2.0", "releases/v1.1.0", "releases/v1.0.0"]
+ "Release Notes": [
+ "releases/v1.3.0",
+ "releases/v1.2.0",
+ "releases/v1.1.0",
+ "releases/v1.0.0"
+ ]
},
"docs": {
"Overview": [
@@ -149,6 +154,14 @@
"integrations/bitbucket/discovery"
]
},
+ {
+ "type": "subcategory",
+ "label": "Bitbucket Cloud",
+ "ids": [
+ "integrations/bitbucketCloud/locations",
+ "integrations/bitbucketCloud/discovery"
+ ]
+ },
{
"type": "subcategory",
"label": "Datadog",
@@ -198,6 +211,7 @@
"plugins/plugin-development",
"plugins/structure-of-a-plugin",
"plugins/integrating-plugin-into-software-catalog",
+ "plugins/integrating-search-into-plugins",
"plugins/composability",
"plugins/analytics",
{
@@ -250,28 +264,27 @@
"auth/oauth2-proxy/provider"
]
},
- "auth/add-auth-provider",
"auth/identity-resolver",
"auth/auth-backend",
"auth/oauth",
- "auth/auth-backend-classes",
+ "auth/add-auth-provider",
"auth/troubleshooting",
"auth/glossary"
],
"Permissions": [
- "permission/overview",
- "permission/concepts",
- "permission/getting-started",
- "permission/writing-a-policy",
- "permission/custom-rules",
+ "permissions/overview",
+ "permissions/concepts",
+ "permissions/getting-started",
+ "permissions/writing-a-policy",
+ "permissions/custom-rules",
{
"type": "subcategory",
"label": "Tutorial: using Permissions in your plugin",
"ids": [
- "permission/plugin-authors/01-setup",
- "permission/plugin-authors/02-adding-a-basic-permission-check",
- "permission/plugin-authors/03-adding-a-resource-permission-check",
- "permission/plugin-authors/04-authorizing-access-to-paginated-data"
+ "permissions/plugin-authors/01-setup",
+ "permissions/plugin-authors/02-adding-a-basic-permission-check",
+ "permissions/plugin-authors/03-adding-a-resource-permission-check",
+ "permissions/plugin-authors/04-authorizing-access-to-paginated-data"
]
}
],
@@ -279,7 +292,6 @@
"deployment/index",
"deployment/docker",
"deployment/k8s",
- "deployment/helm",
"deployment/heroku"
],
"Designing for Backstage": [
diff --git a/microsite/static/img/dynatrace.svg b/microsite/static/img/dynatrace.svg
new file mode 100644
index 0000000000..de114c0005
--- /dev/null
+++ b/microsite/static/img/dynatrace.svg
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/microsite/static/img/github-pull-requests-board-logo.svg b/microsite/static/img/github-pull-requests-board-logo.svg
new file mode 100644
index 0000000000..0114b50d08
--- /dev/null
+++ b/microsite/static/img/github-pull-requests-board-logo.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/microsite/static/img/stack-overflow-logo.svg b/microsite/static/img/stack-overflow-logo.svg
new file mode 100644
index 0000000000..d2fba99094
--- /dev/null
+++ b/microsite/static/img/stack-overflow-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/microsite/static/img/vault.png b/microsite/static/img/vault.png
new file mode 100644
index 0000000000..9b5d59622d
Binary files /dev/null and b/microsite/static/img/vault.png differ
diff --git a/microsite/yarn.lock b/microsite/yarn.lock
index 448647da15..f4831e2b42 100644
--- a/microsite/yarn.lock
+++ b/microsite/yarn.lock
@@ -2477,9 +2477,9 @@ etag@~1.8.1:
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
eventsource@^1.0.7:
- version "1.0.7"
- resolved "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
- integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz#4544a35a57d7120fba4fa4c86cb4023b2c09df2f"
+ integrity sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==
dependencies:
original "^1.0.0"
@@ -5210,9 +5210,9 @@ prepend-http@^2.0.0:
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
prettier@^2.6.2:
- version "2.6.2"
- resolved "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032"
- integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==
+ version "2.7.1"
+ resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
+ integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
prismjs@^1.22.0:
version "1.27.0"
diff --git a/mkdocs.yml b/mkdocs.yml
index caaee37f29..04d62d32d4 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -97,6 +97,9 @@ nav:
- Bitbucket:
- Locations: 'integrations/bitbucket/locations.md'
- Discovery: 'integrations/bitbucket/discovery.md'
+ - Bitbucket Cloud:
+ - Locations: 'integrations/bitbucketCloud/locations.md'
+ - Discovery: 'integrations/bitbucketCloud/discovery.md'
- Datadog:
- Installation: 'integrations/datadog-rum/installation.md'
- Gerrit:
@@ -153,18 +156,16 @@ nav:
- OneLogin: 'auth/onelogin/provider.md'
- OAuth2Proxy: 'auth/oauth2-proxy/provider.md'
- Bitbucket: 'auth/bitbucket/provider.md'
- - Adding authentication providers: 'auth/add-auth-provider.md'
- Sign in resolvers: 'auth/identity-resolver.md'
- Auth backend: 'auth/auth-backend.md'
- OAuth and OpenID Connect: 'auth/oauth.md'
- - Auth backend classes: 'auth/auth-backend-classes.md'
+ - Contributing New Providers: 'auth/add-auth-provider.md'
- Troubleshooting Auth: 'auth/troubleshooting.md'
- Glossary: 'auth/glossary.md'
- Deployment:
- Deploying Backstage: 'deployment/index.md'
- Docker: 'deployment/docker.md'
- Kubernetes: 'deployment/k8s.md'
- - Helm: 'deployment/helm.md'
- Heroku: 'deployment/heroku.md'
- Designing for Backstage:
- Design: 'dls/design.md'
diff --git a/package.json b/package.json
index 7752322535..dd2a85e757 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
"@types/react": "^17",
"@types/react-dom": "^17"
},
- "version": "1.2.0",
+ "version": "1.3.0",
"dependencies": {
"@manypkg/get-packages": "^1.1.3",
"@microsoft/api-documenter": "^7.17.11",
@@ -69,14 +69,14 @@
"eslint-plugin-notice": "^0.9.10",
"fs-extra": "10.1.0",
"husky": "^8.0.0",
- "lerna": "^4.0.0",
- "lint-staged": "^12.2.0",
+ "lerna": "^5.0.0",
+ "lint-staged": "^13.0.0",
"minimist": "^1.2.5",
"prettier": "^2.2.1",
"semver": "^7.3.2",
"shx": "^0.3.2",
"ts-node": "^10.4.0",
- "typescript": "~4.6.4",
+ "typescript": "~4.7.0",
"yarn-lock-check": "^1.0.5"
},
"prettier": "@spotify/prettier-config",
diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md
index b0534e7d84..fb1756eba2 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,32 @@
# @backstage/app-defaults
+## 1.0.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-permission-react@0.4.2
+
+## 1.0.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-permission-react@0.4.2-next.0
+
+## 1.0.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+
## 1.0.2
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index 4d931d9560..0a35b16c3a 100644
--- a/packages/app-defaults/package.json
+++ b/packages/app-defaults/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
- "version": "1.0.2",
+ "version": "1.0.3",
"private": false,
"publishConfig": {
"access": "public",
@@ -33,10 +33,10 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/plugin-permission-react": "^0.4.1",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/plugin-permission-react": "^0.4.2",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -46,8 +46,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@types/jest": "^26.0.7",
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 9d30db9dbc..74601b6417 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,189 @@
# example-app
+## 0.2.72
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes@0.6.6
+ - @backstage/plugin-cost-insights@0.11.28
+ - @backstage/plugin-scaffolder@1.3.0
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-techdocs@1.2.0
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/cli@0.17.2
+ - @backstage/plugin-user-settings@0.4.5
+ - @backstage/plugin-pagerduty@0.4.0
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-search@0.9.0
+ - @backstage/plugin-search-react@0.2.1
+ - @backstage/plugin-sentry@0.3.44
+ - @backstage/plugin-tech-insights@0.2.2
+ - @backstage/plugin-catalog-common@1.0.3
+ - @backstage/core-components@0.9.5
+ - @backstage/plugin-dynatrace@0.1.0
+ - @backstage/plugin-tech-radar@0.5.13
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/plugin-airbrake@0.3.6
+ - @backstage/plugin-apache-airflow@0.1.14
+ - @backstage/plugin-api-docs@0.8.6
+ - @backstage/plugin-azure-devops@0.1.22
+ - @backstage/plugin-badges@0.2.30
+ - @backstage/plugin-catalog-import@0.8.9
+ - @backstage/plugin-circleci@0.3.6
+ - @backstage/plugin-cloudbuild@0.3.6
+ - @backstage/plugin-code-coverage@0.1.33
+ - @backstage/plugin-explore@0.3.37
+ - @backstage/plugin-gcalendar@0.3.2
+ - @backstage/plugin-gcp-projects@0.3.25
+ - @backstage/plugin-github-actions@0.5.6
+ - @backstage/plugin-gocd@0.1.12
+ - @backstage/plugin-graphiql@0.2.38
+ - @backstage/plugin-home@0.4.22
+ - @backstage/plugin-jenkins@0.7.5
+ - @backstage/plugin-kafka@0.3.6
+ - @backstage/plugin-lighthouse@0.3.6
+ - @backstage/plugin-newrelic@0.3.24
+ - @backstage/plugin-org@0.5.6
+ - @backstage/plugin-rollbar@0.4.6
+ - @backstage/plugin-shortcuts@0.2.7
+ - @backstage/plugin-stack-overflow@0.1.2
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.1
+ - @backstage/plugin-todo@0.2.8
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-techdocs-react@1.0.1
+ - @backstage/app-defaults@1.0.3
+ - @backstage/plugin-catalog-graph@0.2.18
+ - @backstage/plugin-newrelic-dashboard@0.1.14
+ - @backstage/plugin-permission-react@0.4.2
+
+## 0.2.72-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder@1.3.0-next.2
+ - @backstage/cli@0.17.2-next.2
+ - @backstage/plugin-pagerduty@0.4.0-next.2
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/plugin-cost-insights@0.11.28-next.2
+ - @backstage/plugin-catalog-common@1.0.3-next.1
+ - @backstage/plugin-kubernetes@0.6.6-next.2
+ - @backstage/core-components@0.9.5-next.2
+ - @backstage/plugin-search@0.8.2-next.2
+ - @backstage/plugin-org@0.5.6-next.2
+
+## 0.2.72-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-sentry@0.3.44-next.1
+ - @backstage/plugin-kubernetes@0.6.6-next.1
+ - @backstage/plugin-tech-insights@0.2.2-next.1
+ - @backstage/plugin-cost-insights@0.11.28-next.1
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/cli@0.17.2-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/plugin-airbrake@0.3.6-next.1
+ - @backstage/plugin-apache-airflow@0.1.14-next.1
+ - @backstage/plugin-api-docs@0.8.6-next.1
+ - @backstage/plugin-azure-devops@0.1.22-next.1
+ - @backstage/plugin-badges@0.2.30-next.1
+ - @backstage/plugin-catalog-import@0.8.9-next.1
+ - @backstage/plugin-circleci@0.3.6-next.1
+ - @backstage/plugin-cloudbuild@0.3.6-next.1
+ - @backstage/plugin-code-coverage@0.1.33-next.1
+ - @backstage/plugin-explore@0.3.37-next.1
+ - @backstage/plugin-gcalendar@0.3.2-next.1
+ - @backstage/plugin-gcp-projects@0.3.25-next.1
+ - @backstage/plugin-github-actions@0.5.6-next.1
+ - @backstage/plugin-gocd@0.1.12-next.1
+ - @backstage/plugin-graphiql@0.2.38-next.1
+ - @backstage/plugin-home@0.4.22-next.1
+ - @backstage/plugin-jenkins@0.7.5-next.1
+ - @backstage/plugin-kafka@0.3.6-next.1
+ - @backstage/plugin-lighthouse@0.3.6-next.1
+ - @backstage/plugin-newrelic@0.3.24-next.1
+ - @backstage/plugin-org@0.5.6-next.1
+ - @backstage/plugin-pagerduty@0.3.33-next.1
+ - @backstage/plugin-rollbar@0.4.6-next.1
+ - @backstage/plugin-scaffolder@1.3.0-next.1
+ - @backstage/plugin-search@0.8.2-next.1
+ - @backstage/plugin-shortcuts@0.2.7-next.1
+ - @backstage/plugin-stack-overflow@0.1.2-next.1
+ - @backstage/plugin-tech-radar@0.5.13-next.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.1
+ - @backstage/plugin-techdocs@1.1.2-next.1
+ - @backstage/plugin-todo@0.2.8-next.1
+ - @backstage/plugin-user-settings@0.4.5-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/plugin-catalog-graph@0.2.18-next.1
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/app-defaults@1.0.3-next.1
+ - @backstage/plugin-search-react@0.2.1-next.0
+ - @backstage/plugin-newrelic-dashboard@0.1.14-next.1
+ - @backstage/plugin-permission-react@0.4.2-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.1
+ - @backstage/plugin-catalog-common@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## 0.2.72-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes@0.6.6-next.0
+ - @backstage/plugin-cost-insights@0.11.28-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/cli@0.17.2-next.0
+ - @backstage/plugin-pagerduty@0.3.33-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/plugin-gcp-projects@0.3.25-next.0
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.0
+ - @backstage/plugin-scaffolder@1.3.0-next.0
+ - @backstage/plugin-techdocs@1.1.2-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.0
+ - @backstage/plugin-airbrake@0.3.6-next.0
+ - @backstage/plugin-api-docs@0.8.6-next.0
+ - @backstage/plugin-azure-devops@0.1.22-next.0
+ - @backstage/plugin-badges@0.2.30-next.0
+ - @backstage/plugin-catalog-graph@0.2.18-next.0
+ - @backstage/plugin-catalog-import@0.8.9-next.0
+ - @backstage/plugin-circleci@0.3.6-next.0
+ - @backstage/plugin-cloudbuild@0.3.6-next.0
+ - @backstage/plugin-code-coverage@0.1.33-next.0
+ - @backstage/plugin-explore@0.3.37-next.0
+ - @backstage/plugin-github-actions@0.5.6-next.0
+ - @backstage/plugin-gocd@0.1.12-next.0
+ - @backstage/plugin-home@0.4.22-next.0
+ - @backstage/plugin-jenkins@0.7.5-next.0
+ - @backstage/plugin-kafka@0.3.6-next.0
+ - @backstage/plugin-lighthouse@0.3.6-next.0
+ - @backstage/plugin-newrelic-dashboard@0.1.14-next.0
+ - @backstage/plugin-org@0.5.6-next.0
+ - @backstage/plugin-rollbar@0.4.6-next.0
+ - @backstage/plugin-search@0.8.2-next.0
+ - @backstage/plugin-sentry@0.3.44-next.0
+ - @backstage/plugin-tech-insights@0.2.2-next.0
+ - @backstage/plugin-todo@0.2.8-next.0
+ - @backstage/app-defaults@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.0
+ - @backstage/plugin-apache-airflow@0.1.14-next.0
+ - @backstage/plugin-gcalendar@0.3.2-next.0
+ - @backstage/plugin-graphiql@0.2.38-next.0
+ - @backstage/plugin-newrelic@0.3.24-next.0
+ - @backstage/plugin-shortcuts@0.2.7-next.0
+ - @backstage/plugin-stack-overflow@0.1.2-next.0
+ - @backstage/plugin-tech-radar@0.5.13-next.0
+ - @backstage/plugin-user-settings@0.4.5-next.0
+
## 0.2.71
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index b94b4eb6d4..df9119d602 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,65 +1,66 @@
{
"name": "example-app",
- "version": "0.2.71",
+ "version": "0.2.72",
"private": true,
"backstage": {
"role": "frontend"
},
"bundled": true,
"dependencies": {
- "@backstage/app-defaults": "^1.0.2",
- "@backstage/catalog-model": "^1.0.2",
- "@backstage/cli": "^0.17.1",
+ "@backstage/app-defaults": "^1.0.3",
+ "@backstage/catalog-model": "^1.0.3",
+ "@backstage/cli": "^0.17.2",
"@backstage/config": "^1.0.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/integration-react": "^1.1.0",
- "@backstage/plugin-airbrake": "^0.3.5",
- "@backstage/plugin-api-docs": "^0.8.5",
- "@backstage/plugin-azure-devops": "^0.1.21",
- "@backstage/plugin-apache-airflow": "^0.1.13",
- "@backstage/plugin-badges": "^0.2.29",
- "@backstage/plugin-catalog": "^1.2.0",
- "@backstage/plugin-catalog-common": "^1.0.2",
- "@backstage/plugin-catalog-graph": "^0.2.17",
- "@backstage/plugin-catalog-import": "^0.8.8",
- "@backstage/plugin-catalog-react": "^1.1.0",
- "@backstage/plugin-circleci": "^0.3.5",
- "@backstage/plugin-cloudbuild": "^0.3.5",
- "@backstage/plugin-code-coverage": "^0.1.32",
- "@backstage/plugin-cost-insights": "^0.11.27",
- "@backstage/plugin-explore": "^0.3.36",
- "@backstage/plugin-gcalendar": "^0.3.1",
- "@backstage/plugin-gcp-projects": "^0.3.24",
- "@backstage/plugin-github-actions": "^0.5.5",
- "@backstage/plugin-gocd": "^0.1.11",
- "@backstage/plugin-graphiql": "^0.2.37",
- "@backstage/plugin-home": "^0.4.21",
- "@backstage/plugin-jenkins": "^0.7.4",
- "@backstage/plugin-kafka": "^0.3.5",
- "@backstage/plugin-kubernetes": "^0.6.5",
- "@backstage/plugin-lighthouse": "^0.3.5",
- "@backstage/plugin-newrelic": "^0.3.23",
- "@backstage/plugin-newrelic-dashboard": "^0.1.13",
- "@backstage/plugin-org": "^0.5.5",
- "@backstage/plugin-pagerduty": "0.3.32",
- "@backstage/plugin-permission-react": "^0.4.1",
- "@backstage/plugin-rollbar": "^0.4.5",
- "@backstage/plugin-scaffolder": "^1.2.0",
- "@backstage/plugin-search": "^0.8.1",
- "@backstage/plugin-search-react": "^0.2.0",
- "@backstage/plugin-search-common": "^0.3.4",
- "@backstage/plugin-sentry": "^0.3.43",
- "@backstage/plugin-shortcuts": "^0.2.6",
- "@backstage/plugin-stack-overflow": "^0.1.1",
- "@backstage/plugin-tech-radar": "^0.5.12",
- "@backstage/plugin-techdocs": "^1.1.1",
- "@backstage/plugin-techdocs-react": "^1.0.0",
- "@backstage/plugin-techdocs-module-addons-contrib": "^1.0.0",
- "@backstage/plugin-todo": "^0.2.7",
- "@backstage/plugin-user-settings": "^0.4.4",
- "@backstage/plugin-tech-insights": "^0.2.1",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/integration-react": "^1.1.1",
+ "@backstage/plugin-airbrake": "^0.3.6",
+ "@backstage/plugin-api-docs": "^0.8.6",
+ "@backstage/plugin-azure-devops": "^0.1.22",
+ "@backstage/plugin-apache-airflow": "^0.1.14",
+ "@backstage/plugin-badges": "^0.2.30",
+ "@backstage/plugin-catalog": "^1.3.0",
+ "@backstage/plugin-catalog-common": "^1.0.3",
+ "@backstage/plugin-catalog-graph": "^0.2.18",
+ "@backstage/plugin-catalog-import": "^0.8.9",
+ "@backstage/plugin-catalog-react": "^1.1.1",
+ "@backstage/plugin-circleci": "^0.3.6",
+ "@backstage/plugin-cloudbuild": "^0.3.6",
+ "@backstage/plugin-code-coverage": "^0.1.33",
+ "@backstage/plugin-cost-insights": "^0.11.28",
+ "@backstage/plugin-dynatrace": "^0.1.0",
+ "@backstage/plugin-explore": "^0.3.37",
+ "@backstage/plugin-gcalendar": "^0.3.2",
+ "@backstage/plugin-gcp-projects": "^0.3.25",
+ "@backstage/plugin-github-actions": "^0.5.6",
+ "@backstage/plugin-gocd": "^0.1.12",
+ "@backstage/plugin-graphiql": "^0.2.38",
+ "@backstage/plugin-home": "^0.4.22",
+ "@backstage/plugin-jenkins": "^0.7.5",
+ "@backstage/plugin-kafka": "^0.3.6",
+ "@backstage/plugin-kubernetes": "^0.6.6",
+ "@backstage/plugin-lighthouse": "^0.3.6",
+ "@backstage/plugin-newrelic": "^0.3.24",
+ "@backstage/plugin-newrelic-dashboard": "^0.1.14",
+ "@backstage/plugin-org": "^0.5.6",
+ "@backstage/plugin-pagerduty": "0.4.0",
+ "@backstage/plugin-permission-react": "^0.4.2",
+ "@backstage/plugin-rollbar": "^0.4.6",
+ "@backstage/plugin-scaffolder": "^1.3.0",
+ "@backstage/plugin-search": "^0.9.0",
+ "@backstage/plugin-search-react": "^0.2.1",
+ "@backstage/plugin-search-common": "^0.3.5",
+ "@backstage/plugin-sentry": "^0.3.44",
+ "@backstage/plugin-shortcuts": "^0.2.7",
+ "@backstage/plugin-stack-overflow": "^0.1.2",
+ "@backstage/plugin-tech-radar": "^0.5.13",
+ "@backstage/plugin-techdocs": "^1.2.0",
+ "@backstage/plugin-techdocs-react": "^1.0.1",
+ "@backstage/plugin-techdocs-module-addons-contrib": "^1.0.1",
+ "@backstage/plugin-todo": "^0.2.8",
+ "@backstage/plugin-user-settings": "^0.4.5",
+ "@backstage/plugin-tech-insights": "^0.2.2",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -80,7 +81,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/test-utils": "^1.1.1",
"@rjsf/core": "^3.2.1",
"@testing-library/cypress": "^8.0.2",
"@testing-library/jest-dom": "^5.10.1",
@@ -92,7 +93,7 @@
"@types/react-dom": "*",
"@types/zen-observable": "^0.8.0",
"cross-env": "^7.0.0",
- "cypress": "^9.5.0",
+ "cypress": "^10.0.0",
"eslint-plugin-cypress": "^2.10.3",
"start-server-and-test": "^1.10.11"
},
diff --git a/packages/app/src/components/Root/Root.tsx b/packages/app/src/components/Root/Root.tsx
index ac62c81899..30da01841c 100644
--- a/packages/app/src/components/Root/Root.tsx
+++ b/packages/app/src/components/Root/Root.tsx
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import React, { useContext, PropsWithChildren } from 'react';
+import React, { PropsWithChildren } from 'react';
import { Link, makeStyles } from '@material-ui/core';
import HomeIcon from '@material-ui/icons/Home';
import ExtensionIcon from '@material-ui/icons/Extension';
@@ -39,13 +39,13 @@ import { Shortcuts } from '@backstage/plugin-shortcuts';
import {
Sidebar,
sidebarConfig,
- SidebarContext,
SidebarDivider,
SidebarGroup,
SidebarItem,
SidebarPage,
SidebarScrollWrapper,
SidebarSpace,
+ useSidebarOpenState,
} from '@backstage/core-components';
import { MyGroupsSidebarItem } from '@backstage/plugin-org';
import GroupIcon from '@material-ui/icons/People';
@@ -68,7 +68,7 @@ const useSidebarLogoStyles = makeStyles({
const SidebarLogo = () => {
const classes = useSidebarLogoStyles();
- const { isOpen } = useContext(SidebarContext);
+ const { isOpen } = useSidebarOpenState();
return (
diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx
index 22d6cc3ab1..1958aabd2e 100644
--- a/packages/app/src/components/catalog/EntityPage.tsx
+++ b/packages/app/src/components/catalog/EntityPage.tsx
@@ -73,6 +73,10 @@ import {
isCloudbuildAvailable,
} from '@backstage/plugin-cloudbuild';
import { EntityCodeCoverageContent } from '@backstage/plugin-code-coverage';
+import {
+ DynatraceTab,
+ isDynatraceAvailable,
+} from '@backstage/plugin-dynatrace';
import {
EntityGithubActionsContent,
EntityRecentGithubActionsRunsCard,
@@ -140,6 +144,12 @@ import { EntityGoCdContent, isGoCdAvailable } from '@backstage/plugin-gocd';
import React, { ReactNode, useMemo, useState } from 'react';
+import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
+import {
+ TextSize,
+ ReportIssue,
+} from '@backstage/plugin-techdocs-module-addons-contrib';
+
const customEntityFilterKind = ['Component', 'API', 'System'];
const EntityLayoutWrapper = (props: { children?: ReactNode }) => {
@@ -168,6 +178,15 @@ const EntityLayoutWrapper = (props: { children?: ReactNode }) => {
);
};
+const techdocsContent = (
+
+
+
+
+
+
+);
+
/**
* NOTE: This page is designed to work on small screens such as mobile devices.
* This is based on Material UI Grid. If breakpoints are used, each grid item must set the `xs` prop to a column size or to `true`,
@@ -398,7 +417,7 @@ const serviceEntityPage = (
-
+ {techdocsContent}
+
+
+
+
);
@@ -465,8 +492,9 @@ const websiteEntityPage = (
-
+ {techdocsContent}
+
+
+
+
+
-
+ {techdocsContent}
diff --git a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx
index 8b9c5100b1..638fe8bc29 100644
--- a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx
+++ b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx
@@ -27,6 +27,7 @@ import {
starredEntitiesApiRef,
MockStarredEntitiesApi,
entityRouteRef,
+ catalogApiRef,
} from '@backstage/plugin-catalog-react';
import { configApiRef } from '@backstage/core-plugin-api';
import { ConfigReader } from '@backstage/config';
@@ -39,6 +40,45 @@ import { HomePageStackOverflowQuestions } from '@backstage/plugin-stack-overflow
import { Grid, makeStyles } from '@material-ui/core';
import React, { ComponentType } from 'react';
+const entities = [
+ {
+ apiVersion: '1',
+ kind: 'Component',
+ metadata: {
+ name: 'mock-starred-entity',
+ title: 'Mock Starred Entity!',
+ },
+ },
+ {
+ apiVersion: '1',
+ kind: 'Component',
+ metadata: {
+ name: 'mock-starred-entity-2',
+ title: 'Mock Starred Entity 2!',
+ },
+ },
+ {
+ apiVersion: '1',
+ kind: 'Component',
+ metadata: {
+ name: 'mock-starred-entity-3',
+ title: 'Mock Starred Entity 3!',
+ },
+ },
+ {
+ apiVersion: '1',
+ kind: 'Component',
+ metadata: {
+ name: 'mock-starred-entity-4',
+ title: 'Mock Starred Entity 4!',
+ },
+ },
+];
+
+const mockCatalogApi = {
+ getEntities: async () => ({ items: entities }),
+};
+
const starredEntitiesApi = new MockStarredEntitiesApi();
starredEntitiesApi.toggleStarred('component:default/example-starred-entity');
starredEntitiesApi.toggleStarred('component:default/example-starred-entity-2');
@@ -53,6 +93,7 @@ export default {
<>
Promise.resolve({ results: [] }) }],
[
diff --git a/packages/app/src/components/search/SearchModal.tsx b/packages/app/src/components/search/SearchModal.tsx
index 3fdacf08b6..99fc964cb2 100644
--- a/packages/app/src/components/search/SearchModal.tsx
+++ b/packages/app/src/components/search/SearchModal.tsx
@@ -26,23 +26,27 @@ import {
useTheme,
} from '@material-ui/core';
import LaunchIcon from '@material-ui/icons/Launch';
-import { Link, useContent } from '@backstage/core-components';
+import {
+ CatalogIcon,
+ DocsIcon,
+ Link,
+ useContent,
+} from '@backstage/core-components';
import { useApi, useRouteRef } from '@backstage/core-plugin-api';
import { CatalogSearchResultListItem } from '@backstage/plugin-catalog';
import {
catalogApiRef,
CATALOG_FILTER_EXISTS,
} from '@backstage/plugin-catalog-react';
+import { searchPlugin, SearchType } from '@backstage/plugin-search';
import {
DefaultResultListItem,
- SearchBar,
SearchFilter,
- searchPlugin,
+ SearchBar,
SearchResult,
SearchResultPager,
- SearchType,
-} from '@backstage/plugin-search';
-import { useSearch } from '@backstage/plugin-search-react';
+ useSearch,
+} from '@backstage/plugin-search-react';
import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs';
const useStyles = makeStyles(theme => ({
@@ -180,24 +184,28 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => {
{({ results }) => (
- {results.map(({ type, document, highlight }) => {
+ {results.map(({ type, document, highlight, rank }) => {
let resultItem;
switch (type) {
case 'software-catalog':
resultItem = (
}
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
break;
case 'techdocs':
resultItem = (
}
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
break;
@@ -207,6 +215,7 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => {
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
}
diff --git a/packages/app/src/components/search/SearchPage.tsx b/packages/app/src/components/search/SearchPage.tsx
index d1b56bbaf0..053fa81da8 100644
--- a/packages/app/src/components/search/SearchPage.tsx
+++ b/packages/app/src/components/search/SearchPage.tsx
@@ -21,7 +21,7 @@ import {
Header,
Lifecycle,
Page,
- SidebarPinStateContext,
+ useSidebarPinState,
} from '@backstage/core-components';
import { useApi } from '@backstage/core-plugin-api';
import { CatalogSearchResultListItem } from '@backstage/plugin-catalog';
@@ -29,18 +29,18 @@ import {
catalogApiRef,
CATALOG_FILTER_EXISTS,
} from '@backstage/plugin-catalog-react';
+import { SearchType } from '@backstage/plugin-search';
import {
DefaultResultListItem,
SearchBar,
SearchFilter,
SearchResult,
SearchResultPager,
- SearchType,
-} from '@backstage/plugin-search';
-import { useSearch } from '@backstage/plugin-search-react';
+ useSearch,
+} from '@backstage/plugin-search-react';
import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs';
import { Grid, List, makeStyles, Paper, Theme } from '@material-ui/core';
-import React, { useContext } from 'react';
+import React from 'react';
const useStyles = makeStyles((theme: Theme) => ({
bar: {
@@ -59,7 +59,7 @@ const useStyles = makeStyles((theme: Theme) => ({
const SearchPage = () => {
const classes = useStyles();
- const { isMobile } = useContext(SidebarPinStateContext);
+ const { isMobile } = useSidebarPinState();
const { types } = useSearch();
const catalogApi = useApi(catalogApiRef);
@@ -132,22 +132,26 @@ const SearchPage = () => {
{({ results }) => (
- {results.map(({ type, document, highlight }) => {
+ {results.map(({ type, document, highlight, rank }) => {
switch (type) {
case 'software-catalog':
return (
}
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
case 'techdocs':
return (
}
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
default:
@@ -156,6 +160,7 @@ const SearchPage = () => {
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
}
diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md
index 6787a3e12f..9e5a28f76b 100644
--- a/packages/backend-common/CHANGELOG.md
+++ b/packages/backend-common/CHANGELOG.md
@@ -1,5 +1,62 @@
# @backstage/backend-common
+## 0.14.0
+
+### Minor Changes
+
+- 55647ec7df: **BREAKING**: Server-to-server tokens that are authenticated by the `ServerTokenManager` now must have an `exp` claim that has not expired. Tokens where the `exp` claim is in the past or missing are considered invalid and will throw an error. This is a followup to the deprecation from the `1.2` release of Backstage where perpetual tokens were deprecated. Be sure to update any usage of the `getToken()` method to have it be called every time a token is needed. Do not store tokens for later use.
+
+### Patch Changes
+
+- f72a6b8c62: Applied the `luxon` dependency fix from the `0.13.4` patch release.
+- 5b22a8c97f: Applied the AWS S3 reading patch from the `0.13.5` patch release.
+- f5283a42e2: Updated dependency `@google-cloud/storage` to `^6.0.0`.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/integration@1.2.1
+ - @backstage/config-loader@1.1.2
+
+## 0.14.0-next.2
+
+### Minor Changes
+
+- 55647ec7df: **BREAKING**: Server-to-server tokens that are authenticated by the `ServerTokenManager` now must have an `exp` claim that has not expired. Tokens where the `exp` claim is in the past or missing are considered invalid and will throw an error. This is a followup to the deprecation from the `1.2` release of Backstage where perpetual tokens were deprecated. Be sure to update any usage of the `getToken()` method to have it be called every time a token is needed. Do not store tokens for later use.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.2
+
+## 0.13.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/config-loader@1.1.2-next.0
+ - @backstage/integration@1.2.1-next.1
+
+## 0.13.6-next.0
+
+### Patch Changes
+
+- f72a6b8c62: Applied the `luxon` dependency fix from the `0.13.4` patch release.
+- 5b22a8c97f: Applied the AWS S3 reading patch from the `0.13.5` patch release.
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.0
+
+## 0.13.5
+
+### Patch Changes
+
+- 667d2ed6f8: Fix a bug in the URL Reading towards AWS S3 where it would hang indefinitely.
+
+## 0.13.4
+
+### Patch Changes
+
+- 739be2b079: Fixed potential crash by bumping the `luxon` dependency to `^2.3.1`.
+
## 0.13.3
### Patch Changes
diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json
index f4c404fb11..d4da05eaa6 100644
--- a/packages/backend-common/package.json
+++ b/packages/backend-common/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
- "version": "0.13.3",
+ "version": "0.14.0",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -36,11 +36,11 @@
"dependencies": {
"@backstage/cli-common": "^0.1.9",
"@backstage/config": "^1.0.1",
- "@backstage/config-loader": "^1.1.1",
+ "@backstage/config-loader": "^1.1.2",
"@backstage/errors": "^1.0.0",
- "@backstage/integration": "^1.2.0",
+ "@backstage/integration": "^1.2.1",
"@backstage/types": "^1.0.0",
- "@google-cloud/storage": "^5.8.0",
+ "@google-cloud/storage": "^6.0.0",
"@manypkg/get-packages": "^1.1.3",
"@octokit/rest": "^18.5.3",
"@types/cors": "^2.8.6",
@@ -68,7 +68,7 @@
"knex": "^1.0.2",
"lodash": "^4.17.21",
"logform": "^2.3.2",
- "luxon": "^2.0.2",
+ "luxon": "^2.3.1",
"minimatch": "^5.0.0",
"minimist": "^1.2.5",
"morgan": "^1.10.0",
@@ -91,8 +91,8 @@
}
},
"devDependencies": {
- "@backstage/backend-test-utils": "^0.1.24",
- "@backstage/cli": "^0.17.1",
+ "@backstage/backend-test-utils": "^0.1.25",
+ "@backstage/cli": "^0.17.2",
"@types/archiver": "^5.1.0",
"@types/base64-stream": "^1.0.2",
"@types/compression": "^1.7.0",
@@ -112,7 +112,7 @@
"better-sqlite3": "^7.5.0",
"http-errors": "^2.0.0",
"mock-fs": "^5.1.0",
- "msw": "^0.35.0",
+ "msw": "^0.42.0",
"mysql2": "^2.2.5",
"recursive-readdir": "^2.2.2",
"supertest": "^6.1.3"
diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
index ea969b43a9..454b8a2c5a 100644
--- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
+++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
@@ -18,6 +18,9 @@ import { ConfigReader } from '@backstage/config';
import { JsonObject } from '@backstage/types';
import { getVoidLogger } from '../logging';
import { DefaultReadTreeResponseFactory } from './tree';
+import { rest } from 'msw';
+import { setupServer } from 'msw/node';
+import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { AwsS3UrlReader, parseUrl } from './AwsS3UrlReader';
import {
AwsS3Integration,
@@ -36,6 +39,15 @@ const treeResponseFactory = DefaultReadTreeResponseFactory.create({
describe('parseUrl', () => {
it('supports all aws formats', () => {
+ expect(
+ parseUrl('https://s3.amazonaws.com/my.bucket-3/a/puppy.jpg', {
+ host: 'amazonaws.com',
+ }),
+ ).toEqual({
+ path: 'a/puppy.jpg',
+ bucket: 'my.bucket-3',
+ region: 'us-east-1',
+ });
expect(
parseUrl('https://s3.us-west-2.amazonaws.com/my.bucket-3/a/puppy.jpg', {
host: 'amazonaws.com',
@@ -111,6 +123,9 @@ describe('parseUrl', () => {
});
describe('AwsS3UrlReader', () => {
+ const worker = setupServer();
+ setupRequestMockHandlers(worker);
+
const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => {
return AwsS3UrlReader.factory({
config: new ConfigReader(config),
@@ -119,10 +134,6 @@ describe('AwsS3UrlReader', () => {
});
};
- afterEach(() => {
- AWSMock.restore();
- });
-
it('creates a dummy reader without the awsS3 field', () => {
const entries = createReader({
integrations: {},
@@ -209,40 +220,34 @@ describe('AwsS3UrlReader', () => {
});
describe('read', () => {
- let awsS3UrlReader: AwsS3UrlReader;
+ const [{ reader }] = createReader({
+ integrations: {
+ awsS3: [
+ {
+ host: 'amazonaws.com',
+ accessKeyId: 'fake-access-key',
+ secretAccessKey: 'fake-secret-key',
+ },
+ ],
+ },
+ });
- beforeAll(() => {
- AWSMock.setSDKInstance(aws);
- AWSMock.mock(
- 'S3',
- 'getObject',
- Buffer.from(
- require('fs').readFileSync(
- path.resolve(
- __dirname,
- '__fixtures__/awsS3/awsS3-mock-object.yaml',
+ beforeEach(() => {
+ worker.use(
+ rest.get(
+ 'https://test-bucket.s3.amazonaws.com/awsS3-mock-object.yaml',
+ (_, res, ctx) =>
+ res(
+ ctx.status(200),
+ ctx.set('ETag', '123abc'),
+ ctx.body('site_name: Test'),
),
- ),
),
);
-
- const s3 = new aws.S3();
- awsS3UrlReader = new AwsS3UrlReader(
- new AwsS3Integration(
- readAwsS3IntegrationConfig(
- new ConfigReader({
- host: 'amazonaws.com',
- accessKeyId: 'fake-access-key',
- secretAccessKey: 'fake-secret-key',
- }),
- ),
- ),
- { s3, treeResponseFactory },
- );
});
it('returns contents of an object in a bucket', async () => {
- const response = await awsS3UrlReader.read(
+ const response = await reader.read(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
);
expect(response.toString().trim()).toBe('site_name: Test');
@@ -250,7 +255,7 @@ describe('AwsS3UrlReader', () => {
it('rejects unknown targets', async () => {
await expect(
- awsS3UrlReader.read(
+ reader.read(
'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml',
),
).rejects.toThrow(
@@ -262,59 +267,53 @@ describe('AwsS3UrlReader', () => {
});
describe('readUrl', () => {
- let awsS3UrlReader: AwsS3UrlReader;
+ const [{ reader }] = createReader({
+ integrations: {
+ awsS3: [
+ {
+ host: 'amazonaws.com',
+ accessKeyId: 'fake-access-key',
+ secretAccessKey: 'fake-secret-key',
+ },
+ ],
+ },
+ });
beforeEach(() => {
- AWSMock.setSDKInstance(aws);
-
- AWSMock.mock(
- 'S3',
- 'getObject',
- Buffer.from(
- require('fs').readFileSync(
- path.resolve(
- __dirname,
- '__fixtures__/awsS3/awsS3-mock-object.yaml',
+ worker.use(
+ rest.get(
+ 'https://test-bucket.s3.amazonaws.com/awsS3-mock-object.yaml',
+ (_, res, ctx) =>
+ res(
+ ctx.status(200),
+ ctx.set('ETag', '123abc'),
+ ctx.body('site_name: Test'),
),
- ),
),
);
-
- const s3 = new aws.S3();
-
- awsS3UrlReader = new AwsS3UrlReader(
- new AwsS3Integration(
- readAwsS3IntegrationConfig(
- new ConfigReader({
- host: 'amazonaws.com',
- accessKeyId: 'fake-access-key',
- secretAccessKey: 'fake-secret-key',
- }),
- ),
- ),
- { s3, treeResponseFactory },
- );
});
it('returns contents of an object in a bucket via buffer', async () => {
- const response = await awsS3UrlReader.readUrl(
+ const response = await reader.readUrl!(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
);
+ expect(response.etag).toBe('123abc');
const buffer = await response.buffer();
expect(buffer.toString().trim()).toBe('site_name: Test');
});
it('returns contents of an object in a bucket via stream', async () => {
- const response = await awsS3UrlReader.readUrl(
+ const response = await reader.readUrl!(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
);
+ expect(response.etag).toBe('123abc');
const fromStream = await getRawBody(response.stream!());
expect(fromStream.toString().trim()).toBe('site_name: Test');
});
it('rejects unknown targets', async () => {
await expect(
- awsS3UrlReader.readUrl(
+ reader.readUrl!(
'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml',
),
).rejects.toThrow(
@@ -325,45 +324,73 @@ describe('AwsS3UrlReader', () => {
});
});
- describe('readUrl with etag', () => {
- let awsS3UrlReader: AwsS3UrlReader;
+ describe('readUrl towards custom host', () => {
+ const [{ reader }] = createReader({
+ integrations: {
+ awsS3: [
+ {
+ host: 'localhost:4566',
+ accessKeyId: 'fake-access-key',
+ secretAccessKey: 'fake-secret-key',
+ endpoint: 'http://localhost:4566',
+ s3ForcePathStyle: true,
+ },
+ ],
+ },
+ });
- beforeAll(() => {
- AWSMock.setSDKInstance(aws);
-
- AWSMock.mock('S3', 'getObject', (_, callback) => {
- const error: aws.AWSError = {
- code: 'NotModified',
- message: 'Not Modified',
- statusCode: 304,
- name: 'oops',
- time: new Date('2019-01-01T00:00:00.000Z'),
- };
- callback(error, undefined);
- });
-
- const s3 = new aws.S3();
-
- awsS3UrlReader = new AwsS3UrlReader(
- new AwsS3Integration(
- readAwsS3IntegrationConfig(
- new ConfigReader({
- host: 'amazonaws.com',
- accessKeyId: 'fake-access-key',
- secretAccessKey: 'fake-secret-key',
- }),
- ),
+ beforeEach(() => {
+ worker.use(
+ rest.get(
+ 'http://localhost:4566/test-bucket/awsS3-mock-object.yaml',
+ (_, res, ctx) =>
+ res(
+ ctx.status(200),
+ ctx.set('ETag', '123abc'),
+ ctx.body('site_name: Test'),
+ ),
+ ),
+ );
+ });
+
+ it('returns contents of an object in a bucket via buffer', async () => {
+ const response = await reader.readUrl!(
+ 'http://localhost:4566/test-bucket/awsS3-mock-object.yaml',
+ );
+ expect(response.etag).toBe('123abc');
+ const buffer = await response.buffer();
+ expect(buffer.toString().trim()).toBe('site_name: Test');
+ });
+ });
+
+ describe('readUrl with etag', () => {
+ const [{ reader }] = createReader({
+ integrations: {
+ awsS3: [
+ {
+ host: 'amazonaws.com',
+ accessKeyId: 'fake-access-key',
+ secretAccessKey: 'fake-secret-key',
+ },
+ ],
+ },
+ });
+
+ beforeEach(() => {
+ worker.use(
+ rest.get(
+ 'https://test-bucket.s3.amazonaws.com/awsS3-mock-object.yaml',
+ (_, res, ctx) => res(ctx.status(304)),
),
- { s3, treeResponseFactory },
);
});
it('returns contents of an object in a bucket', async () => {
await expect(
- awsS3UrlReader.readUrl(
+ reader.readUrl!(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
{
- etag: 'abc123',
+ etag: '123abc',
},
),
).rejects.toThrow(NotModifiedError);
@@ -424,47 +451,4 @@ describe('AwsS3UrlReader', () => {
expect(body.toString().trim()).toBe('site_name: Test');
});
});
-
- describe('readNonAwsHost', () => {
- let awsS3UrlReader: AwsS3UrlReader;
-
- beforeAll(() => {
- AWSMock.setSDKInstance(aws);
- AWSMock.mock(
- 'S3',
- 'getObject',
- Buffer.from(
- require('fs').readFileSync(
- path.resolve(
- __dirname,
- '__fixtures__/awsS3/awsS3-mock-object.yaml',
- ),
- ),
- ),
- );
-
- const s3 = new aws.S3();
- awsS3UrlReader = new AwsS3UrlReader(
- new AwsS3Integration(
- readAwsS3IntegrationConfig(
- new ConfigReader({
- host: 'localhost:4566',
- accessKeyId: 'fake-access-key',
- secretAccessKey: 'fake-secret-key',
- endpoint: 'http://localhost:4566',
- s3ForcePathStyle: true,
- }),
- ),
- ),
- { s3, treeResponseFactory },
- );
- });
-
- it('returns contents of an object in a bucket', async () => {
- const response = await awsS3UrlReader.read(
- 'http://localhost:4566/test-bucket/awsS3-mock-object.yaml',
- );
- expect(response.toString().trim()).toBe('site_name: Test');
- });
- });
});
diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.ts b/packages/backend-common/src/reading/AwsS3UrlReader.ts
index dbd2c66a62..7c314cf036 100644
--- a/packages/backend-common/src/reading/AwsS3UrlReader.ts
+++ b/packages/backend-common/src/reading/AwsS3UrlReader.ts
@@ -35,6 +35,8 @@ import { ForwardedError, NotModifiedError } from '@backstage/errors';
import { ListObjectsV2Output, ObjectList } from 'aws-sdk/clients/s3';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
+const DEFAULT_REGION = 'us-east-1';
+
/**
* Path style URLs: https://s3.(region).amazonaws.com/(bucket)/(key)
* The region can also be on the old form: https://s3-(region).amazonaws.com/(bucket)/(key)
@@ -57,7 +59,7 @@ export function parseUrl(
// Treat Amazon hosted separately because it has special region logic
if (config.host === 'amazonaws.com') {
const match = host.match(
- /^(?:([a-z0-9.-]+)\.)?s3[.-]([a-z0-9-]+)\.amazonaws\.com$/,
+ /^(?:([a-z0-9.-]+)\.)?s3(?:[.-]([a-z0-9-]+))?\.amazonaws\.com$/,
);
if (!match) {
throw new Error(`Invalid AWS S3 URL ${url}`);
@@ -76,14 +78,14 @@ export function parseUrl(
return {
path: pathname.substring(slashIndex + 1),
bucket: pathname.substring(0, slashIndex),
- region: hostRegion,
+ region: hostRegion ?? DEFAULT_REGION,
};
}
return {
path: pathname,
bucket: hostBucket,
- region: hostRegion,
+ region: hostRegion ?? DEFAULT_REGION,
};
}
@@ -214,10 +216,38 @@ export class AwsS3UrlReader implements UrlReader {
const request = this.deps.s3.getObject(params);
options?.signal?.addEventListener('abort', () => request.abort());
- const etag = (await request.promise()).ETag;
- return ReadUrlResponseFactory.fromReadable(request.createReadStream(), {
- etag,
+ // Since we're consuming the read stream we need to consume headers and errors via events.
+ const etagPromise = new Promise((resolve, reject) => {
+ request.on('httpHeaders', (status, headers) => {
+ if (status < 400) {
+ if (status === 200) {
+ resolve(headers.etag);
+ } else if (status !== 304 /* not modified */) {
+ reject(
+ new Error(
+ `S3 readUrl request received unexpected status '${status}' in response`,
+ ),
+ );
+ }
+ }
+ });
+ request.on('error', error => reject(error));
+ request.on('complete', () =>
+ reject(
+ new Error('S3 readUrl request completed without receiving headers'),
+ ),
+ );
+ });
+
+ const stream = request.createReadStream();
+ stream.on('error', () => {
+ // The AWS SDK forwards request errors to the stream, so we need to
+ // ignore those errors here or the process will crash.
+ });
+
+ return ReadUrlResponseFactory.fromReadable(stream, {
+ etag: await etagPromise,
});
} catch (e) {
if (e.statusCode === 304) {
diff --git a/packages/backend-common/src/reading/FetchUrlReader.ts b/packages/backend-common/src/reading/FetchUrlReader.ts
index b83f08c22f..5734beddcf 100644
--- a/packages/backend-common/src/reading/FetchUrlReader.ts
+++ b/packages/backend-common/src/reading/FetchUrlReader.ts
@@ -39,8 +39,8 @@ export class FetchUrlReader implements UrlReader {
* targets to allow, containing the following fields:
*
* `host`:
- * Either full hostnames to match, or subdomain wildcard matchers with a leading `*`.
- * For example `example.com` and `*.example.com` are valid values, `prod.*.example.com` is not.
+ * Either full hostnames to match, or subdomain wildcard matchers with a leading '*'.
+ * For example 'example.com' and '*.example.com' are valid values, 'prod.*.example.com' is not.
*
* `paths`:
* An optional list of paths which are allowed. If the list is omitted all paths are allowed.
diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts
index c8a659e792..ff975de9bb 100644
--- a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts
+++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts
@@ -78,8 +78,7 @@ describe('ReadUrlResponseFactory', () => {
let readable: NodeJS.ReadableStream;
beforeEach(() => {
- // @ts-ignore
- readable = new Stream({ encoding: 'utf-8' });
+ readable = new Stream({ encoding: 'utf-8' }) as NodeJS.ReadableStream;
readable.readable = true;
// Write data asynchronously, as soon as possible.
diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts
index 6a72b99908..cc7854b2ee 100644
--- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts
+++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts
@@ -171,7 +171,6 @@ describe('ServerTokenManager', () => {
it('should throw for expired tokens, and re-issue new ones', async () => {
jest.useFakeTimers();
- const warn = jest.spyOn(logger, 'warn');
const tokenManager = ServerTokenManager.fromConfig(configWithSecret, {
logger,
@@ -179,14 +178,12 @@ describe('ServerTokenManager', () => {
const { token: token1 } = await tokenManager.getToken();
await expect(tokenManager.authenticate(token1)).resolves.not.toThrow();
- expect(warn.mock.calls.length).toBe(0);
// Right before the reissue timeout, it still returns the same token
jest.advanceTimersByTime(9 * 60 * 1000);
const { token: token1Again } = await tokenManager.getToken();
expect(token1).toEqual(token1Again);
await expect(tokenManager.authenticate(token1)).resolves.not.toThrow();
- expect(warn.mock.calls.length).toBe(0);
// Right after the reissue timeout, the old ones are still valid but returning a new token
jest.advanceTimersByTime(2 * 60 * 1000);
@@ -194,14 +191,47 @@ describe('ServerTokenManager', () => {
expect(token1).not.toEqual(token2);
await expect(tokenManager.authenticate(token1)).resolves.not.toThrow();
await expect(tokenManager.authenticate(token2)).resolves.not.toThrow();
- expect(warn.mock.calls.length).toBe(0);
// After expiry of the first one, it gets warnings but the newest one is still valid
jest.advanceTimersByTime(52 * 60 * 1000);
- await expect(tokenManager.authenticate(token1)).resolves.not.toThrow();
+ await expect(tokenManager.authenticate(token1)).rejects.toThrow(
+ 'Invalid server token; caused by JWTExpired: "exp" claim timestamp check failed',
+ );
await expect(tokenManager.authenticate(token2)).resolves.not.toThrow();
- expect(warn.mock.calls[0][0]).toMatchInlineSnapshot(
- '"#### DEPRECATION WARNING: #### Server-to-server token had an expired exp claim, support for this has been deprecated and will result in errors in a future release"',
+ });
+
+ it('should work with a manually crafted JWT', async () => {
+ const secret = 'a1b2c3';
+ const token = await new jose.SignJWT({})
+ .setProtectedHeader({ alg: 'HS256' })
+ .setSubject('backstage-server')
+ .setExpirationTime(Date.now() + 1000 * 60 * 60)
+ .sign(jose.base64url.decode(secret));
+
+ const tokenManager = ServerTokenManager.fromConfig(
+ new ConfigReader({
+ backend: { auth: { keys: [{ secret }] } },
+ }),
+ { logger },
+ );
+ await expect(tokenManager.authenticate(token)).resolves.toBeUndefined();
+ });
+
+ it('should reject tokens without exp claim', async () => {
+ const secret = 'a1b2c3';
+ const token = await new jose.SignJWT({})
+ .setProtectedHeader({ alg: 'HS256' })
+ .setSubject('backstage-server')
+ .sign(jose.base64url.decode(secret));
+
+ const tokenManager = ServerTokenManager.fromConfig(
+ new ConfigReader({
+ backend: { auth: { keys: [{ secret }] } },
+ }),
+ { logger },
+ );
+ await expect(tokenManager.authenticate(token)).rejects.toThrow(
+ 'Invalid server token; caused by AuthenticationError: Server-to-server token had no exp claim',
);
});
});
diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts
index 329c2f164c..970dcfb83d 100644
--- a/packages/backend-common/src/tokens/ServerTokenManager.ts
+++ b/packages/backend-common/src/tokens/ServerTokenManager.ts
@@ -15,7 +15,7 @@
*/
import { Config } from '@backstage/config';
-import { AuthenticationError, NotAllowedError } from '@backstage/errors';
+import { AuthenticationError } from '@backstage/errors';
import { base64url, exportJWK, generateSecret, jwtVerify, SignJWT } from 'jose';
import { DateTime, Duration } from 'luxon';
import { Logger } from 'winston';
@@ -64,8 +64,6 @@ export class ServerTokenManager implements TokenManager {
private signingKey: Uint8Array;
private privateKeyPromise: Promise | undefined;
private currentTokenPromise: Promise<{ token: string }> | undefined;
- private warnedForMissingExpClaim = false;
- private warnedForExpiredExpClaim = false;
/**
* Creates a token manager that issues static dummy tokens and never fails
@@ -184,36 +182,20 @@ export class ServerTokenManager implements TokenManager {
const {
protectedHeader: { alg },
payload: { sub, exp },
- } = await jwtVerify(token, key, {
- // TODO(freben): Holding on to tokens and reusing them is deprecated; remove this tolerance in a future release
- clockTolerance: 3e9,
- });
+ } = await jwtVerify(token, key);
if (alg !== TOKEN_ALG) {
- throw new NotAllowedError(`Illegal alg "${alg}"`);
+ throw new AuthenticationError(`Illegal alg "${alg}"`);
}
if (sub !== TOKEN_SUB) {
- throw new NotAllowedError(`Illegal sub "${sub}"`);
+ throw new AuthenticationError(`Illegal sub "${sub}"`);
}
- // TODO(freben): Passing in tokens without an exp is deprecated; change this warning to an error in a future release
if (typeof exp !== 'number') {
- if (!this.warnedForMissingExpClaim) {
- this.warnedForMissingExpClaim = true;
- this.options.logger.warn(
- `#### DEPRECATION WARNING: #### Server-to-server token had no exp claim, support for this has been deprecated and will result in errors in a future release`,
- );
- }
- }
- // TODO(freben): Holding on to tokens and reusing them is deprecated; remove this tolerance in a future release
- else if (exp * 1000 < Date.now()) {
- if (!this.warnedForExpiredExpClaim) {
- this.warnedForExpiredExpClaim = true;
- this.options.logger.warn(
- `#### DEPRECATION WARNING: #### Server-to-server token had an expired exp claim, support for this has been deprecated and will result in errors in a future release`,
- );
- }
+ throw new AuthenticationError(
+ 'Server-to-server token had no exp claim',
+ );
}
return;
} catch (e) {
@@ -222,6 +204,6 @@ export class ServerTokenManager implements TokenManager {
}
}
- throw new AuthenticationError(`Invalid server token: ${verifyError}`);
+ throw new AuthenticationError('Invalid server token', verifyError);
}
}
diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md
index 0a74dc0a1d..34be280bbc 100644
--- a/packages/backend-tasks/CHANGELOG.md
+++ b/packages/backend-tasks/CHANGELOG.md
@@ -1,5 +1,41 @@
# @backstage/backend-tasks
+## 0.3.2
+
+### Patch Changes
+
+- fde10d24f6: Allow tasks that fail to retry on a loop emitting a warning log every time it fails with the amount of attempts it has
+- f7146b516f: Updated dependency `cron` to `^2.0.0`.
+ Updated dependency `@types/cron` to `^2.0.0`.
+- 7f108513b8: Add error logging when a background task throws an error rather than silently swallowing it.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## 0.3.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## 0.3.2-next.1
+
+### Patch Changes
+
+- f7146b516f: Updated dependency `cron` to `^2.0.0`.
+ Updated dependency `@types/cron` to `^2.0.0`.
+- 7f108513b8: Add error logging when a background task throws an error rather than silently swallowing it.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## 0.3.2-next.0
+
+### Patch Changes
+
+- fde10d24f6: Allow tasks that fail to retry on a loop emitting a warning log every time it fails with the amount of attempts it has
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
## 0.3.1
### Patch Changes
diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json
index 6a4ea9d70d..e96a71c597 100644
--- a/packages/backend-tasks/package.json
+++ b/packages/backend-tasks/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
- "version": "0.3.1",
+ "version": "0.3.2",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -33,12 +33,12 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
+ "@backstage/backend-common": "^0.14.0",
"@backstage/config": "^1.0.1",
"@backstage/errors": "^1.0.0",
"@backstage/types": "^1.0.0",
"@types/luxon": "^2.0.4",
- "cron": "^1.8.2",
+ "cron": "^2.0.0",
"knex": "^1.0.2",
"lodash": "^4.17.21",
"luxon": "^2.0.2",
@@ -48,9 +48,9 @@
"zod": "^3.9.5"
},
"devDependencies": {
- "@backstage/backend-test-utils": "^0.1.24",
- "@backstage/cli": "^0.17.1",
- "@types/cron": "^1.7.3",
+ "@backstage/backend-test-utils": "^0.1.25",
+ "@backstage/cli": "^0.17.2",
+ "@types/cron": "^2.0.0",
"wait-for-expect": "^3.0.2"
},
"files": [
diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
index b7dd7c96c1..be30988aa8 100644
--- a/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
+++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
@@ -123,7 +123,7 @@ export class LocalTaskWorker {
let dt: number;
if (isCron) {
- const nextRun = +new CronTime(settings.cadence).sendAt().toDate();
+ const nextRun = +new CronTime(settings.cadence).sendAt().toJSDate();
dt = nextRun - Date.now();
} else {
dt =
diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.ts
index e43d0c1be6..e57ec93c1c 100644
--- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.ts
+++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.ts
@@ -57,7 +57,12 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
if (scope === 'global') {
const knex = await this.databaseFactory();
- const worker = new TaskWorker(task.id, task.fn, knex, this.logger);
+ const worker = new TaskWorker(
+ task.id,
+ task.fn,
+ knex,
+ this.logger.child({ task: task.id }),
+ );
await worker.start(
{
diff --git a/packages/backend-tasks/src/tasks/TaskWorker.test.ts b/packages/backend-tasks/src/tasks/TaskWorker.test.ts
index 14688d0f98..8a1be3e8a9 100644
--- a/packages/backend-tasks/src/tasks/TaskWorker.test.ts
+++ b/packages/backend-tasks/src/tasks/TaskWorker.test.ts
@@ -119,6 +119,31 @@ describe('TaskWorker', () => {
60_000,
);
+ it.each(databases.eachSupportedId())(
+ 'logs error when the task throws, %p',
+ async databaseId => {
+ const knex = await databases.init(databaseId);
+ await migrateBackendTasks(knex);
+
+ jest.spyOn(logger, 'error');
+ const fn = jest.fn().mockRejectedValue(new Error('failed'));
+ const settings: TaskSettingsV2 = {
+ version: 2,
+ initialDelayDuration: undefined,
+ cadence: '* * * * * *',
+ timeoutAfterDuration: Duration.fromMillis(60000).toISO(),
+ };
+ const checkFrequency = Duration.fromObject({ milliseconds: 100 });
+ const worker = new TaskWorker('task1', fn, knex, logger, checkFrequency);
+ worker.start(settings);
+
+ await waitForExpect(() => {
+ expect(logger.error).toBeCalled();
+ });
+ },
+ 60_000,
+ );
+
it.each(databases.eachSupportedId())(
'runs tasks more than once even when the task throws, %p',
async databaseId => {
diff --git a/packages/backend-tasks/src/tasks/TaskWorker.ts b/packages/backend-tasks/src/tasks/TaskWorker.ts
index 07e1cd90ec..c99c08e4fb 100644
--- a/packages/backend-tasks/src/tasks/TaskWorker.ts
+++ b/packages/backend-tasks/src/tasks/TaskWorker.ts
@@ -145,6 +145,7 @@ export class TaskWorker {
await this.fn(taskAbortController.signal);
taskAbortController.abort(); // releases resources
} catch (e) {
+ this.logger.error(e);
await this.tryReleaseTask(ticket, taskSettings);
return { result: 'failed' };
} finally {
@@ -174,8 +175,9 @@ export class TaskWorker {
} else if (isCron) {
const time = new CronTime(settings.cadence)
.sendAt()
- .add({ seconds: -1 }) // immediately, if "* * * * * *"
- .toISOString();
+ .minus({ seconds: 1 }) // immediately, if "* * * * * *"
+ .toUTC()
+ .toISO();
startAt = this.knex.client.config.client.includes('sqlite3')
? this.knex.raw('datetime(?)', [time])
: this.knex.raw(`?`, [time]);
@@ -278,7 +280,7 @@ export class TaskWorker {
let nextRun: Knex.Raw;
if (isCron) {
- const time = new CronTime(settings.cadence).sendAt().toISOString();
+ const time = new CronTime(settings.cadence).sendAt().toUTC().toISO();
this.logger.debug(`task: ${this.taskId} will next occur around ${time}`);
nextRun = this.knex.client.config.client.includes('sqlite3')
? this.knex.raw('datetime(?)', [time])
diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md
index b84b877774..104f17a2e8 100644
--- a/packages/backend-test-utils/CHANGELOG.md
+++ b/packages/backend-test-utils/CHANGELOG.md
@@ -1,5 +1,39 @@
# @backstage/backend-test-utils
+## 0.1.25
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/cli@0.17.2
+ - @backstage/backend-common@0.14.0
+
+## 0.1.25-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.17.2-next.2
+ - @backstage/backend-common@0.14.0-next.2
+
+## 0.1.25-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/cli@0.17.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+
+## 0.1.25-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.17.2-next.0
+ - @backstage/backend-common@0.13.6-next.0
+
## 0.1.24
### Patch Changes
diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json
index c60b860b6b..abc55944ea 100644
--- a/packages/backend-test-utils/package.json
+++ b/packages/backend-test-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
- "version": "0.1.24",
+ "version": "0.1.25",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -34,19 +34,19 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
- "@backstage/cli": "^0.17.1",
+ "@backstage/backend-common": "^0.14.0",
+ "@backstage/cli": "^0.17.2",
"@backstage/config": "^1.0.1",
"better-sqlite3": "^7.5.0",
"knex": "^1.0.2",
- "msw": "^0.35.0",
+ "msw": "^0.42.0",
"mysql2": "^2.2.5",
"pg": "^8.3.0",
"testcontainers": "^8.1.2",
"uuid": "^8.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1"
+ "@backstage/cli": "^0.17.2"
},
"files": [
"dist"
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index ae6beff70a..1602a34c37 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,151 @@
# example-backend
+## 0.2.72
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-tech-insights-backend@0.4.1
+ - @backstage/plugin-catalog-backend@1.2.0
+ - @backstage/plugin-auth-backend@0.14.1
+ - @backstage/plugin-scaffolder-backend@1.3.0
+ - @backstage/backend-tasks@0.3.2
+ - @backstage/plugin-permission-node@0.6.2
+ - @backstage/plugin-kubernetes-backend@0.6.0
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-search-backend@0.5.3
+ - @backstage/plugin-auth-node@0.2.2
+ - @backstage/integration@1.2.1
+ - @backstage/plugin-jenkins-backend@0.1.23
+ - @backstage/plugin-search-backend-node@0.6.2
+ - @backstage/catalog-client@1.0.3
+ - @backstage/plugin-app-backend@0.3.33
+ - @backstage/plugin-azure-devops-backend@0.3.12
+ - @backstage/plugin-code-coverage-backend@0.1.31
+ - @backstage/plugin-graphql-backend@0.1.23
+ - @backstage/plugin-permission-backend@0.5.8
+ - @backstage/plugin-permission-common@0.6.2
+ - @backstage/plugin-rollbar-backend@0.1.30
+ - @backstage/plugin-techdocs-backend@1.1.2
+ - @backstage/plugin-todo-backend@0.1.30
+ - @backstage/plugin-search-backend-module-elasticsearch@0.1.5
+ - @backstage/plugin-search-backend-module-pg@0.3.4
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-tech-insights-node@0.3.1
+ - example-app@0.2.72
+ - @backstage/plugin-badges-backend@0.1.27
+ - @backstage/plugin-kafka-backend@0.2.26
+ - @backstage/plugin-proxy-backend@0.2.27
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.1
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17
+
+## 0.2.72-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.2
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-search-backend@0.5.3-next.2
+ - @backstage/plugin-auth-backend@0.14.1-next.2
+ - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.2
+ - @backstage/integration@1.2.1-next.2
+ - @backstage/plugin-techdocs-backend@1.1.2-next.2
+ - @backstage/plugin-search-backend-node@0.6.2-next.2
+ - example-app@0.2.72-next.2
+ - @backstage/backend-tasks@0.3.2-next.2
+ - @backstage/plugin-app-backend@0.3.33-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
+ - @backstage/plugin-azure-devops-backend@0.3.12-next.2
+ - @backstage/plugin-badges-backend@0.1.27-next.2
+ - @backstage/plugin-catalog-backend@1.2.0-next.2
+ - @backstage/plugin-code-coverage-backend@0.1.31-next.2
+ - @backstage/plugin-graphql-backend@0.1.23-next.2
+ - @backstage/plugin-jenkins-backend@0.1.23-next.2
+ - @backstage/plugin-kafka-backend@0.2.26-next.2
+ - @backstage/plugin-kubernetes-backend@0.6.0-next.2
+ - @backstage/plugin-permission-backend@0.5.8-next.2
+ - @backstage/plugin-permission-node@0.6.2-next.2
+ - @backstage/plugin-proxy-backend@0.2.27-next.1
+ - @backstage/plugin-rollbar-backend@0.1.30-next.2
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.1
+ - @backstage/plugin-search-backend-module-pg@0.3.4-next.2
+ - @backstage/plugin-tech-insights-backend@0.4.1-next.2
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.1
+ - @backstage/plugin-tech-insights-node@0.3.1-next.1
+ - @backstage/plugin-todo-backend@0.1.30-next.2
+
+## 0.2.72-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-tech-insights-backend@0.4.1-next.1
+ - @backstage/plugin-auth-backend@0.14.1-next.1
+ - @backstage/plugin-jenkins-backend@0.1.23-next.1
+ - @backstage/backend-tasks@0.3.2-next.1
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/plugin-app-backend@0.3.33-next.1
+ - @backstage/plugin-auth-node@0.2.2-next.1
+ - @backstage/plugin-azure-devops-backend@0.3.12-next.1
+ - @backstage/plugin-catalog-backend@1.2.0-next.1
+ - @backstage/plugin-code-coverage-backend@0.1.31-next.1
+ - @backstage/plugin-graphql-backend@0.1.23-next.1
+ - @backstage/plugin-permission-backend@0.5.8-next.1
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.1
+ - @backstage/plugin-rollbar-backend@0.1.30-next.1
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.1
+ - @backstage/plugin-techdocs-backend@1.1.2-next.1
+ - @backstage/plugin-todo-backend@0.1.30-next.1
+ - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.1
+ - @backstage/plugin-search-backend-node@0.6.2-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-badges-backend@0.1.27-next.1
+ - example-app@0.2.72-next.1
+ - @backstage/plugin-search-backend@0.5.3-next.1
+ - @backstage/plugin-kafka-backend@0.2.26-next.1
+ - @backstage/plugin-kubernetes-backend@0.6.0-next.1
+ - @backstage/plugin-search-backend-module-pg@0.3.4-next.1
+
+## 0.2.72-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.2-next.0
+ - @backstage/plugin-scaffolder-backend@1.3.0-next.0
+ - @backstage/plugin-kubernetes-backend@0.6.0-next.0
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-auth-backend@0.14.1-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-search-backend-node@0.6.2-next.0
+ - @backstage/plugin-catalog-backend@1.2.0-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
+ - @backstage/plugin-techdocs-backend@1.1.2-next.0
+ - example-app@0.2.72-next.0
+ - @backstage/plugin-app-backend@0.3.33-next.0
+ - @backstage/plugin-azure-devops-backend@0.3.12-next.0
+ - @backstage/plugin-badges-backend@0.1.27-next.0
+ - @backstage/plugin-code-coverage-backend@0.1.31-next.0
+ - @backstage/plugin-graphql-backend@0.1.23-next.0
+ - @backstage/plugin-jenkins-backend@0.1.23-next.0
+ - @backstage/plugin-kafka-backend@0.2.26-next.0
+ - @backstage/plugin-permission-backend@0.5.8-next.0
+ - @backstage/plugin-permission-node@0.6.2-next.0
+ - @backstage/plugin-proxy-backend@0.2.27-next.0
+ - @backstage/plugin-rollbar-backend@0.1.30-next.0
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.0
+ - @backstage/plugin-search-backend@0.5.3-next.0
+ - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.0
+ - @backstage/plugin-search-backend-module-pg@0.3.4-next.0
+ - @backstage/plugin-tech-insights-backend@0.4.1-next.0
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.0
+ - @backstage/plugin-tech-insights-node@0.3.1-next.0
+ - @backstage/plugin-todo-backend@0.1.30-next.0
+
## 0.2.71
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index d3c42db1c9..9dedf360c1 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.2.71",
+ "version": "0.2.72",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -26,39 +26,39 @@
"build-image": "docker build ../.. -f Dockerfile --tag example-backend"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
- "@backstage/backend-tasks": "^0.3.1",
- "@backstage/catalog-client": "^1.0.2",
- "@backstage/catalog-model": "^1.0.2",
+ "@backstage/backend-common": "^0.14.0",
+ "@backstage/backend-tasks": "^0.3.2",
+ "@backstage/catalog-client": "^1.0.3",
+ "@backstage/catalog-model": "^1.0.3",
"@backstage/config": "^1.0.1",
- "@backstage/integration": "^1.2.0",
- "@backstage/plugin-app-backend": "^0.3.32",
- "@backstage/plugin-auth-backend": "^0.14.0",
- "@backstage/plugin-auth-node": "^0.2.1",
- "@backstage/plugin-azure-devops-backend": "^0.3.11",
- "@backstage/plugin-badges-backend": "^0.1.26",
- "@backstage/plugin-catalog-backend": "^1.1.2",
- "@backstage/plugin-code-coverage-backend": "^0.1.30",
- "@backstage/plugin-graphql-backend": "^0.1.22",
- "@backstage/plugin-jenkins-backend": "^0.1.22",
- "@backstage/plugin-kubernetes-backend": "^0.5.1",
- "@backstage/plugin-kafka-backend": "^0.2.25",
- "@backstage/plugin-permission-backend": "^0.5.7",
- "@backstage/plugin-permission-common": "^0.6.1",
- "@backstage/plugin-permission-node": "^0.6.1",
- "@backstage/plugin-proxy-backend": "^0.2.26",
- "@backstage/plugin-rollbar-backend": "^0.1.29",
- "@backstage/plugin-scaffolder-backend": "^1.2.0",
- "@backstage/plugin-scaffolder-backend-module-rails": "^0.4.0",
- "@backstage/plugin-search-backend": "^0.5.2",
- "@backstage/plugin-search-backend-node": "^0.6.1",
- "@backstage/plugin-search-backend-module-elasticsearch": "^0.1.4",
- "@backstage/plugin-search-backend-module-pg": "^0.3.3",
- "@backstage/plugin-techdocs-backend": "^1.1.1",
- "@backstage/plugin-tech-insights-backend": "^0.4.0",
- "@backstage/plugin-tech-insights-node": "^0.3.0",
- "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.16",
- "@backstage/plugin-todo-backend": "^0.1.29",
+ "@backstage/integration": "^1.2.1",
+ "@backstage/plugin-app-backend": "^0.3.33",
+ "@backstage/plugin-auth-backend": "^0.14.1",
+ "@backstage/plugin-auth-node": "^0.2.2",
+ "@backstage/plugin-azure-devops-backend": "^0.3.12",
+ "@backstage/plugin-badges-backend": "^0.1.27",
+ "@backstage/plugin-catalog-backend": "^1.2.0",
+ "@backstage/plugin-code-coverage-backend": "^0.1.31",
+ "@backstage/plugin-graphql-backend": "^0.1.23",
+ "@backstage/plugin-jenkins-backend": "^0.1.23",
+ "@backstage/plugin-kubernetes-backend": "^0.6.0",
+ "@backstage/plugin-kafka-backend": "^0.2.26",
+ "@backstage/plugin-permission-backend": "^0.5.8",
+ "@backstage/plugin-permission-common": "^0.6.2",
+ "@backstage/plugin-permission-node": "^0.6.2",
+ "@backstage/plugin-proxy-backend": "^0.2.27",
+ "@backstage/plugin-rollbar-backend": "^0.1.30",
+ "@backstage/plugin-scaffolder-backend": "^1.3.0",
+ "@backstage/plugin-scaffolder-backend-module-rails": "^0.4.1",
+ "@backstage/plugin-search-backend": "^0.5.3",
+ "@backstage/plugin-search-backend-node": "^0.6.2",
+ "@backstage/plugin-search-backend-module-elasticsearch": "^0.1.5",
+ "@backstage/plugin-search-backend-module-pg": "^0.3.4",
+ "@backstage/plugin-techdocs-backend": "^1.1.2",
+ "@backstage/plugin-tech-insights-backend": "^0.4.1",
+ "@backstage/plugin-tech-insights-node": "^0.3.1",
+ "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.17",
+ "@backstage/plugin-todo-backend": "^0.1.30",
"@gitbeaker/node": "^35.1.0",
"@octokit/rest": "^18.5.3",
"better-sqlite3": "^7.5.0",
@@ -75,7 +75,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/dockerode": "^3.3.0",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5",
diff --git a/packages/backend/src/plugins/auth.ts b/packages/backend/src/plugins/auth.ts
index cd0c42afe5..8beda6f3fb 100644
--- a/packages/backend/src/plugins/auth.ts
+++ b/packages/backend/src/plugins/auth.ts
@@ -44,7 +44,27 @@ export default async function createPlugin(
// It is here for demo purposes only.
github: providers.github.create({
signIn: {
- resolver: providers.github.resolvers.usernameMatchingUserEntityName(),
+ async resolver({ result: { fullProfile } }, ctx) {
+ const userId = fullProfile.username;
+ if (!userId) {
+ throw new Error(
+ `GitHub user profile does not contain a username`,
+ );
+ }
+
+ const userEntityRef = stringifyEntityRef({
+ kind: 'User',
+ name: userId,
+ namespace: DEFAULT_NAMESPACE,
+ });
+
+ return ctx.issueToken({
+ claims: {
+ sub: userEntityRef,
+ ent: [userEntityRef],
+ },
+ });
+ },
},
}),
gitlab: providers.gitlab.create({
diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md
index a434db2f23..93d232dc24 100644
--- a/packages/catalog-client/CHANGELOG.md
+++ b/packages/catalog-client/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/catalog-client
+## 1.0.3
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 35bc0a7c27: Update README to point to catalog-react for frontend usage
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3
+
+## 1.0.3-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/catalog-model@1.0.3-next.0
+
## 1.0.2
### Patch Changes
diff --git a/packages/catalog-client/README.md b/packages/catalog-client/README.md
index 574e23cf62..330c1f3ea1 100644
--- a/packages/catalog-client/README.md
+++ b/packages/catalog-client/README.md
@@ -5,10 +5,9 @@ Backstage Catalog.
Backend code may import and use this package directly.
-However, frontend code will not want to import this package directly - use the
-`@backstage/plugin-catalog` package instead, which re-exports all of the types
-and classes from this package. Thereby, you will also gain access to its
-`catalogApiRef`.
+However, frontend code will not want to instantiate a catalog client directly -
+use the `@backstage/plugin-catalog-react` package instead, which exports a
+`catalogApiRef` that can be leveraged like other frontend utility APIs.
## Links
diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json
index 1ccd49ab6c..76818ed10f 100644
--- a/packages/catalog-client/package.json
+++ b/packages/catalog-client/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/catalog-client",
"description": "An isomorphic client for the catalog backend",
- "version": "1.0.2",
+ "version": "1.0.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -33,14 +33,14 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/catalog-model": "^1.0.2",
+ "@backstage/catalog-model": "^1.0.3",
"@backstage/errors": "^1.0.0",
"cross-fetch": "^3.1.5"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/jest": "^26.0.7",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md
index c6b2fc39e3..7d491dad5b 100644
--- a/packages/catalog-model/CHANGELOG.md
+++ b/packages/catalog-model/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/catalog-model
+## 1.0.3
+
+### Patch Changes
+
+- 131a99e909: Added targetRef to common.schema.json to match the Typescript type
+
+## 1.0.3-next.0
+
+### Patch Changes
+
+- 131a99e909: Added targetRef to common.schema.json to match the Typescript type
+
## 1.0.2
### Patch Changes
diff --git a/packages/catalog-model/api-report.md b/packages/catalog-model/api-report.md
index fca23d6ab9..8427ef4112 100644
--- a/packages/catalog-model/api-report.md
+++ b/packages/catalog-model/api-report.md
@@ -159,6 +159,7 @@ export type EntityLink = {
url: string;
title?: string;
icon?: string;
+ type?: string;
};
// @public
diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json
index 41f6f15851..328482fd24 100644
--- a/packages/catalog-model/package.json
+++ b/packages/catalog-model/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/catalog-model",
"description": "Types and validators that help describe the model of a Backstage Catalog",
- "version": "1.0.2",
+ "version": "1.0.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -43,7 +43,7 @@
"uuid": "^8.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/jest": "^26.0.7",
"@types/json-schema": "^7.0.5",
"@types/lodash": "^4.14.151",
diff --git a/packages/catalog-model/src/entity/Entity.ts b/packages/catalog-model/src/entity/Entity.ts
index 96f19b2c8a..80c9adaffb 100644
--- a/packages/catalog-model/src/entity/Entity.ts
+++ b/packages/catalog-model/src/entity/Entity.ts
@@ -210,4 +210,9 @@ export type EntityLink = {
* An optional semantic key that represents a visual icon.
*/
icon?: string;
+
+ /**
+ * An optional value to categorize links into specific groups
+ */
+ type?: string;
};
diff --git a/packages/catalog-model/src/schema/EntityMeta.schema.json b/packages/catalog-model/src/schema/EntityMeta.schema.json
index cfdf9539c2..483e69f672 100644
--- a/packages/catalog-model/src/schema/EntityMeta.schema.json
+++ b/packages/catalog-model/src/schema/EntityMeta.schema.json
@@ -108,6 +108,12 @@
"description": "A key representing a visual icon to be displayed in the UI.",
"examples": ["dashboard"],
"minLength": 1
+ },
+ "type": {
+ "type": "string",
+ "description": "An optional value to categorize links into specific groups.",
+ "examples": ["runbook", "documentation", "logs", "dashboard"],
+ "minLength": 1
}
}
}
diff --git a/packages/catalog-model/src/schema/shared/common.schema.json b/packages/catalog-model/src/schema/shared/common.schema.json
index a9082d53e4..5a5eb97bb7 100644
--- a/packages/catalog-model/src/schema/shared/common.schema.json
+++ b/packages/catalog-model/src/schema/shared/common.schema.json
@@ -43,6 +43,11 @@
},
"target": {
"$ref": "#reference"
+ },
+ "targetRef": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The entity ref of the target of this relation."
}
}
},
diff --git a/packages/catalog-model/src/validation/CommonValidatorFunctions.ts b/packages/catalog-model/src/validation/CommonValidatorFunctions.ts
index 8c814412c1..40a85c5331 100644
--- a/packages/catalog-model/src/validation/CommonValidatorFunctions.ts
+++ b/packages/catalog-model/src/validation/CommonValidatorFunctions.ts
@@ -24,7 +24,7 @@ import lodash from 'lodash';
*/
export class CommonValidatorFunctions {
/**
- * Checks that the value is on the form or , and validates
+ * Checks that the value is on the form `` or ``, and validates
* those parts separately.
*
* @param value - The value to check
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 5ad3803a25..4da56c18bd 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,46 @@
# @backstage/cli
+## 0.17.2
+
+### Patch Changes
+
+- 026cfe525a: Fix the public path configuration of the frontend app build so that a trailing `/` is always appended when needed.
+- 4f73352608: Updated Lockfile to support new versions of yarn as well as the legacy 1 version
+- b8970b8941: Improved the `create-github-app` permissions selection prompt by converting it into a multi-select with clearer descriptions. The `members` permission is now also included in the list which is required for ingesting user data into the catalog.
+- bd58365d09: Updated dependency `run-script-webpack-plugin` to `^0.0.14`.
+- 9002ebd76b: Updated dependency `@rollup/plugin-commonjs` to `^22.0.0`.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 1a33e8b287: Updated dependency `minimatch` to `5.1.0`.
+- 6de866ea74: Added console warning to frontend start when the `app.baseUrl` and `backend.baseUrl` are identical
+- Updated dependencies
+ - @backstage/config-loader@1.1.2
+ - @backstage/release-manifests@0.0.4
+
+## 0.17.2-next.2
+
+### Patch Changes
+
+- 026cfe525a: Fix the public path configuration of the frontend app build so that a trailing `/` is always appended when needed.
+- 9002ebd76b: Updated dependency `@rollup/plugin-commonjs` to `^22.0.0`.
+- 1a33e8b287: Updated dependency `minimatch` to `5.1.0`.
+
+## 0.17.2-next.1
+
+### Patch Changes
+
+- bd58365d09: Updated dependency `run-script-webpack-plugin` to `^0.0.14`.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/config-loader@1.1.2-next.0
+ - @backstage/release-manifests@0.0.4-next.0
+
+## 0.17.2-next.0
+
+### Patch Changes
+
+- 4f73352608: Updated Lockfile to support new versions of yarn as well as the legacy 1 version
+- 6de866ea74: Added console warning to frontend start when the `app.baseUrl` and `backend.baseUrl` are identical
+
## 0.17.1
### Patch Changes
diff --git a/packages/cli/package.json b/packages/cli/package.json
index e36a59b8e2..071fc74f97 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
- "version": "0.17.1",
+ "version": "0.17.2",
"private": false,
"publishConfig": {
"access": "public"
@@ -33,15 +33,15 @@
"dependencies": {
"@backstage/cli-common": "^0.1.9",
"@backstage/config": "^1.0.1",
- "@backstage/config-loader": "^1.1.1",
+ "@backstage/config-loader": "^1.1.2",
"@backstage/errors": "^1.0.0",
- "@backstage/release-manifests": "^0.0.3",
+ "@backstage/release-manifests": "^0.0.4",
"@backstage/types": "^1.0.0",
"@hot-loader/react-dom-v16": "npm:@hot-loader/react-dom@^16.0.2",
"@hot-loader/react-dom-v17": "npm:@hot-loader/react-dom@^17.0.2",
"@manypkg/get-packages": "^1.1.3",
"@octokit/request": "^5.4.12",
- "@rollup/plugin-commonjs": "^21.0.1",
+ "@rollup/plugin-commonjs": "^22.0.0",
"@rollup/plugin-json": "^4.1.0",
"@rollup/plugin-node-resolve": "^13.0.0",
"@rollup/plugin-yaml": "^3.1.0",
@@ -94,7 +94,7 @@
"json-schema": "^0.4.0",
"lodash": "^4.17.21",
"mini-css-extract-plugin": "^2.4.2",
- "minimatch": "5.0.1",
+ "minimatch": "5.1.0",
"node-fetch": "^2.6.7",
"node-libs-browser": "^2.2.1",
"npm-packlist": "^5.0.0",
@@ -110,7 +110,7 @@
"rollup-plugin-esbuild": "^4.7.2",
"rollup-plugin-postcss": "^4.0.0",
"rollup-pluginutils": "^2.8.2",
- "run-script-webpack-plugin": "^0.0.11",
+ "run-script-webpack-plugin": "^0.0.14",
"semver": "^7.3.2",
"style-loader": "^3.3.1",
"sucrase": "^3.20.2",
@@ -126,13 +126,13 @@
"zod": "^3.11.6"
},
"devDependencies": {
- "@backstage/backend-common": "^0.13.3",
+ "@backstage/backend-common": "^0.14.0",
"@backstage/config": "^1.0.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/dev-utils": "^1.0.2",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/dev-utils": "^1.0.3",
+ "@backstage/test-utils": "^1.1.1",
"@backstage/theme": "^0.2.15",
"@types/diff": "^5.0.0",
"@types/express": "^4.17.6",
@@ -152,7 +152,7 @@
"@types/yarnpkg__lockfile": "^1.1.4",
"del": "^6.0.0",
"mock-fs": "^5.1.0",
- "msw": "^0.35.0",
+ "msw": "^0.42.0",
"nodemon": "^2.0.2",
"ts-node": "^10.0.0"
},
diff --git a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts
index 0fe321541e..70b8c0ca53 100644
--- a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts
+++ b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts
@@ -19,18 +19,6 @@ import openBrowser from 'react-dev-utils/openBrowser';
import { request } from '@octokit/request';
import express, { Express, Request, Response } from 'express';
-const MANIFEST_DATA = {
- default_events: ['create', 'delete', 'push', 'repository'],
- default_permissions: {
- contents: 'read',
- metadata: 'read',
- },
- name: 'Backstage-',
- url: 'https://backstage.io',
- description: 'GitHub App for Backstage',
- public: false,
-};
-
const FORM_PAGE = `
@@ -62,17 +50,17 @@ export class GithubCreateAppServer {
static async run(options: {
org: string;
- readWrite: boolean;
+ permissions: string[];
}): Promise {
const encodedOrg = encodeURIComponent(options.org);
const actionUrl = `https://github.com/organizations/${encodedOrg}/settings/apps/new`;
- const server = new GithubCreateAppServer(actionUrl, options.readWrite);
+ const server = new GithubCreateAppServer(actionUrl, options.permissions);
return server.start();
}
private constructor(
private readonly actionUrl: string,
- private readonly readWrite: boolean,
+ private readonly permissions: string[],
) {
const webhookId = crypto
.randomBytes(15)
@@ -121,21 +109,29 @@ export class GithubCreateAppServer {
if (!baseUrl) {
throw new Error('baseUrl is not set');
}
+
const manifest = {
- ...MANIFEST_DATA,
+ default_events: ['create', 'delete', 'push', 'repository'],
+ default_permissions: {
+ metadata: 'read',
+ ...(this.permissions.includes('members') && { members: 'read' }),
+ ...(this.permissions.includes('read') && { contents: 'read' }),
+ ...(this.permissions.includes('write') && {
+ contents: 'write',
+ actions: 'write',
+ }),
+ },
+ name: 'Backstage-',
+ url: 'https://backstage.io',
+ description: 'GitHub App for Backstage',
+ public: false,
redirect_url: `${baseUrl}/callback`,
hook_attributes: {
url: this.webhookUrl,
active: false,
},
- ...(this.readWrite && {
- default_permissions: {
- contents: 'write',
- actions: 'write',
- metadata: 'read',
- },
- }),
};
+
const manifestJson = JSON.stringify(manifest).replace(/\"/g, '"');
let body = FORM_PAGE;
diff --git a/packages/cli/src/commands/create-github-app/index.ts b/packages/cli/src/commands/create-github-app/index.ts
index 175530402e..6b3e732f18 100644
--- a/packages/cli/src/commands/create-github-app/index.ts
+++ b/packages/cli/src/commands/create-github-app/index.ts
@@ -26,19 +26,38 @@ import openBrowser from 'react-dev-utils/openBrowser';
// due to lacking support for creating apps from manifests.
// https://docs.github.com/en/free-pro-team@latest/developers/apps/creating-a-github-app-from-a-manifest
export default async (org: string) => {
- const answers: Answers = await inquirer.prompt([
- {
- type: 'list',
- name: 'appType',
- message: chalk.blue('What will the app be used for [required]'),
- choices: ['Read and Write (needed by Software Templates)', 'Read only'],
- },
- ]);
- const readWrite = answers.appType !== 'Read only';
+ const answers: Answers = await inquirer.prompt({
+ name: 'appType',
+ type: 'checkbox',
+ message:
+ 'Select permissions [required] (these can be changed later but then require approvals in all installations)',
+ choices: [
+ {
+ name: 'Read access to content (required by Software Catalog to ingest data from repositories)',
+ value: 'read',
+ checked: true,
+ },
+ {
+ name: 'Read access to members (required by Software Catalog to ingest GitHub teams)',
+ value: 'members',
+ checked: true,
+ },
+ {
+ name: 'Read and Write to content and actions (required by Software Templates to create new repositories)',
+ value: 'write',
+ },
+ ],
+ });
+
+ if (answers.appType.length === 0) {
+ console.log(chalk.red('You must select at least one permission'));
+ process.exit(1);
+ }
+
await verifyGithubOrg(org);
const { slug, name, ...config } = await GithubCreateAppServer.run({
org,
- readWrite,
+ permissions: answers.appType,
});
const fileName = `github-app-${slug}-credentials.yaml`;
diff --git a/packages/cli/src/commands/start/startFrontend.ts b/packages/cli/src/commands/start/startFrontend.ts
index e5500c310b..f6923632c8 100644
--- a/packages/cli/src/commands/start/startFrontend.ts
+++ b/packages/cli/src/commands/start/startFrontend.ts
@@ -44,7 +44,7 @@ export async function startFrontend(options: StartAppOptions) {
if (problemPackages.length > 1) {
console.log(
chalk.yellow(
- `โ ๏ธ Some of the following packages may be outdated or have duplicate installations:
+ `โ ๏ธ Some of the following packages may be outdated or have duplicate installations:
${uniq(problemPackages).join(', ')}
`,
@@ -52,7 +52,7 @@ export async function startFrontend(options: StartAppOptions) {
);
console.log(
chalk.yellow(
- `โ ๏ธ This can be resolved using the following command:
+ `โ ๏ธ This can be resolved using the following command:
yarn backstage-cli versions:check --fix
`,
@@ -62,14 +62,34 @@ export async function startFrontend(options: StartAppOptions) {
}
const { name } = await fs.readJson(paths.resolveTarget('package.json'));
+ const config = await loadCliConfig({
+ args: options.configPaths,
+ fromPackage: name,
+ withFilteredKeys: true,
+ });
+
+ const appBaseUrl = config.frontendConfig.getString('app.baseUrl');
+ const backendBaseUrl = config.frontendConfig.getString('backend.baseUrl');
+ if (appBaseUrl === backendBaseUrl) {
+ console.log(
+ chalk.yellow(
+ `โ ๏ธ Conflict between app baseUrl and backend baseUrl:
+
+ app.baseUrl: ${appBaseUrl}
+ backend.baseUrl: ${appBaseUrl}
+
+ Must have unique hostname and/or ports.
+
+ This can be resolved by changing app.baseUrl and backend.baseUrl to point to their respective local development ports.
+`,
+ ),
+ );
+ }
+
const waitForExit = await serveBundle({
entry: options.entry,
checksEnabled: options.checksEnabled,
- ...(await loadCliConfig({
- args: options.configPaths,
- fromPackage: name,
- withFilteredKeys: true,
- })),
+ ...config,
});
await waitForExit();
diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts
index fb073a25e3..d723b963bd 100644
--- a/packages/cli/src/lib/bundler/config.ts
+++ b/packages/cli/src/lib/bundler/config.ts
@@ -89,6 +89,7 @@ export async function createConfig(
const baseUrl = frontendConfig.getString('app.baseUrl');
const validBaseUrl = new URL(baseUrl);
+ const publicPath = validBaseUrl.pathname.replace(/\/$/, '');
if (checksEnabled) {
plugins.push(
new ForkTsCheckerWebpackPlugin({
@@ -121,7 +122,7 @@ export async function createConfig(
new HtmlWebpackPlugin({
template: paths.targetHtml,
templateParameters: {
- publicPath: validBaseUrl.pathname.replace(/\/$/, ''),
+ publicPath,
config: frontendConfig,
},
}),
@@ -194,7 +195,7 @@ export async function createConfig(
},
output: {
path: paths.targetDist,
- publicPath: validBaseUrl.pathname,
+ publicPath: `${publicPath}/`,
filename: isDev ? '[name].js' : 'static/[name].[fullhash:8].js',
chunkFilename: isDev
? '[name].chunk.js'
diff --git a/packages/cli/src/lib/bundler/server.ts b/packages/cli/src/lib/bundler/server.ts
index e65e598106..d573f80e27 100644
--- a/packages/cli/src/lib/bundler/server.ts
+++ b/packages/cli/src/lib/bundler/server.ts
@@ -43,7 +43,6 @@ export async function serveBundle(options: ServeOptions) {
const compiler = webpack(config);
const server = new WebpackDevServer(
- compiler as any,
{
hot: !process.env.CI,
devMiddleware: {
@@ -71,10 +70,11 @@ export async function serveBundle(options: ServeOptions) {
webSocketURL: 'auto://0.0.0.0:0/ws',
},
} as any,
+ compiler as any,
);
await new Promise((resolve, reject) => {
- server.listen(port, host, (err?: Error) => {
+ server.startCallback((err?: Error) => {
if (err) {
reject(err);
return;
diff --git a/packages/cli/templates/default-backend-plugin/package.json.hbs b/packages/cli/templates/default-backend-plugin/package.json.hbs
index dacc1d601a..2416fd75cb 100644
--- a/packages/cli/templates/default-backend-plugin/package.json.hbs
+++ b/packages/cli/templates/default-backend-plugin/package.json.hbs
@@ -41,7 +41,7 @@
"@backstage/cli": "{{versionQuery '@backstage/cli'}}",
"@types/supertest": "{{versionQuery '@types/supertest' '2.0.8'}}",
"supertest": "{{versionQuery 'supertest' '4.0.2'}}",
- "msw": "{{versionQuery 'msw' '0.35.0'}}"
+ "msw": "{{versionQuery 'msw' '0.42.0'}}"
},
"files": [
"dist"
diff --git a/packages/cli/templates/default-plugin/package.json.hbs b/packages/cli/templates/default-plugin/package.json.hbs
index a174c1bafd..34a0548b29 100644
--- a/packages/cli/templates/default-plugin/package.json.hbs
+++ b/packages/cli/templates/default-plugin/package.json.hbs
@@ -49,7 +49,7 @@
"@testing-library/user-event": "{{versionQuery '@testing-library/user-event' '14.0.0'}}",
"@types/jest": "{{versionQuery '@types/jest' '26.0.7'}}",
"@types/node": "{{versionQuery '@types/node' '16.11.26'}}",
- "msw": "{{versionQuery 'msw' '0.35.0'}}",
+ "msw": "{{versionQuery 'msw' '0.42.0'}}",
"cross-fetch": "{{versionQuery 'cross-fetch' '3.1.5'}}"
},
"files": [
diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md
index f72cf1d71e..d9228aa091 100644
--- a/packages/config-loader/CHANGELOG.md
+++ b/packages/config-loader/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/config-loader
+## 1.1.2
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## 1.1.2-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
## 1.1.1
### Patch Changes
diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json
index 00629bf2fb..3448b336b7 100644
--- a/packages/config-loader/package.json
+++ b/packages/config-loader/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/config-loader",
"description": "Config loading functionality used by Backstage backend, and CLI",
- "version": "1.1.1",
+ "version": "1.1.2",
"private": false,
"publishConfig": {
"access": "public",
@@ -57,7 +57,7 @@
"@types/node": "^16.11.26",
"@types/yup": "^0.29.13",
"mock-fs": "^5.1.0",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/packages/config/package.json b/packages/config/package.json
index d49d31b2f3..bc0693fa73 100644
--- a/packages/config/package.json
+++ b/packages/config/package.json
@@ -37,7 +37,7 @@
"lodash": "^4.17.21"
},
"devDependencies": {
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/test-utils": "^1.1.1-next.0",
"@types/jest": "^26.0.7",
"@types/node": "^16.0.0"
},
diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md
index b749a1caaa..8d78e51c62 100644
--- a/packages/core-app-api/CHANGELOG.md
+++ b/packages/core-app-api/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/core-app-api
+## 1.0.3
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 19781483a2: Handle URLs as the first argument to `fetchApi`, when using the `plugin:` protocol
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3
+
+## 1.0.3-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+
## 1.0.2
### Patch Changes
diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json
index 28baeab4df..cbf9d7eb40 100644
--- a/packages/core-app-api/package.json
+++ b/packages/core-app-api/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-app-api",
"description": "Core app API used by Backstage apps",
- "version": "1.0.2",
+ "version": "1.0.3",
"private": false,
"publishConfig": {
"access": "public",
@@ -34,7 +34,7 @@
},
"dependencies": {
"@backstage/config": "^1.0.1",
- "@backstage/core-plugin-api": "^1.0.2",
+ "@backstage/core-plugin-api": "^1.0.3",
"@backstage/types": "^1.0.0",
"@backstage/version-bridge": "^1.0.1",
"@types/prop-types": "^15.7.3",
@@ -49,8 +49,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
@@ -59,7 +59,7 @@
"@types/node": "^16.11.26",
"@types/zen-observable": "^0.8.0",
"cross-fetch": "^3.1.5",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist",
diff --git a/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.ts b/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.ts
index 6265e8d3d2..ff20b594b4 100644
--- a/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.ts
+++ b/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.ts
@@ -55,7 +55,14 @@ export class PluginProtocolResolverFetchMiddleware implements FetchMiddleware {
}
const target = `${join(base, pathname)}${search}${hash}`;
- return next(target, typeof input === 'string' ? init : input);
+ return next(
+ target,
+ typeof input === 'string' || isUrl(input) ? init : input,
+ );
};
}
}
+
+function isUrl(a: unknown): a is URL {
+ return typeof a === 'object' && a?.constructor === URL;
+}
diff --git a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts
index aa15182499..3d4f83b05d 100644
--- a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts
+++ b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts
@@ -31,7 +31,7 @@ describe('AppIdentityProxy', () => {
it('should forward user identities', async () => {
const proxy = new AppIdentityProxy();
- proxy.setTarget(mockIdentityApi);
+ proxy.setTarget(mockIdentityApi, { signOutTargetUrl: '/' });
const logs = await withLogCollector(async () => {
mockIdentityApi.getBackstageIdentity.mockResolvedValueOnce({
@@ -55,7 +55,7 @@ describe('AppIdentityProxy', () => {
it('should warn about invalid user entity refs', async () => {
const proxy = new AppIdentityProxy();
- proxy.setTarget(mockIdentityApi);
+ proxy.setTarget(mockIdentityApi, { signOutTargetUrl: '/' });
const logs = await withLogCollector(async () => {
mockIdentityApi.getBackstageIdentity.mockResolvedValueOnce({
@@ -79,4 +79,16 @@ describe('AppIdentityProxy', () => {
error: [],
});
});
+
+ it('should navigate to target URL on sign out', async () => {
+ const proxy = new AppIdentityProxy();
+ proxy.setTarget(mockIdentityApi, { signOutTargetUrl: '/foo' });
+ Object.defineProperty(window, 'location', {
+ writable: true,
+ value: {},
+ });
+
+ await proxy.signOut();
+ expect(location.href).toBe('/foo');
+ });
});
diff --git a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts
index 3ef3a1f6d3..2df351bc18 100644
--- a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts
+++ b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts
@@ -49,6 +49,7 @@ export class AppIdentityProxy implements IdentityApi {
private target?: CompatibilityIdentityApi;
private waitForTarget: Promise;
private resolveTarget: (api: CompatibilityIdentityApi) => void = () => {};
+ private signOutTargetUrl = '/';
constructor() {
this.waitForTarget = new Promise(resolve => {
@@ -57,8 +58,12 @@ export class AppIdentityProxy implements IdentityApi {
}
// This is called by the app manager once the sign-in page provides us with an implementation
- setTarget(identityApi: CompatibilityIdentityApi) {
+ setTarget(
+ identityApi: CompatibilityIdentityApi,
+ targetOptions: { signOutTargetUrl: string },
+ ) {
this.target = identityApi;
+ this.signOutTargetUrl = targetOptions.signOutTargetUrl;
this.resolveTarget(identityApi);
}
@@ -119,6 +124,6 @@ export class AppIdentityProxy implements IdentityApi {
async signOut(): Promise {
await this.waitForTarget.then(target => target.signOut());
- location.reload();
+ location.href = this.signOutTargetUrl;
}
}
diff --git a/packages/core-app-api/src/app/AppManager.tsx b/packages/core-app-api/src/app/AppManager.tsx
index 75bab5c2df..f47ddf676a 100644
--- a/packages/core-app-api/src/app/AppManager.tsx
+++ b/packages/core-app-api/src/app/AppManager.tsx
@@ -334,41 +334,49 @@ export class AppManager implements BackstageApp {
children: ReactElement;
}) => {
const [identityApi, setIdentityApi] = useState();
+ const configApi = useApi(configApiRef);
+ const basePath = getBasePath(configApi);
if (!identityApi) {
return ;
}
- this.appIdentityProxy.setTarget(identityApi);
+ this.appIdentityProxy.setTarget(identityApi, {
+ signOutTargetUrl: basePath || '/',
+ });
return children;
};
const AppRouter = ({ children }: PropsWithChildren<{}>) => {
const configApi = useApi(configApiRef);
- const mountPath = `${getBasePath(configApi)}/*`;
+ const basePath = getBasePath(configApi);
+ const mountPath = `${basePath}/*`;
const { routeObjects } = useContext(InternalAppContext);
// If the app hasn't configured a sign-in page, we just continue as guest.
if (!SignInPageComponent) {
- this.appIdentityProxy.setTarget({
- getUserId: () => 'guest',
- getIdToken: async () => undefined,
- getProfile: () => ({
- email: 'guest@example.com',
- displayName: 'Guest',
- }),
- getProfileInfo: async () => ({
- email: 'guest@example.com',
- displayName: 'Guest',
- }),
- getBackstageIdentity: async () => ({
- type: 'user',
- userEntityRef: 'user:default/guest',
- ownershipEntityRefs: ['user:default/guest'],
- }),
- getCredentials: async () => ({}),
- signOut: async () => {},
- });
+ this.appIdentityProxy.setTarget(
+ {
+ getUserId: () => 'guest',
+ getIdToken: async () => undefined,
+ getProfile: () => ({
+ email: 'guest@example.com',
+ displayName: 'Guest',
+ }),
+ getProfileInfo: async () => ({
+ email: 'guest@example.com',
+ displayName: 'Guest',
+ }),
+ getBackstageIdentity: async () => ({
+ type: 'user',
+ userEntityRef: 'user:default/guest',
+ ownershipEntityRefs: ['user:default/guest'],
+ }),
+ getCredentials: async () => ({}),
+ signOut: async () => {},
+ },
+ { signOutTargetUrl: basePath || '/' },
+ );
return (
diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md
index 167076a74e..faec6d3d90 100644
--- a/packages/core-components/CHANGELOG.md
+++ b/packages/core-components/CHANGELOG.md
@@ -1,5 +1,60 @@
# @backstage/core-components
+## 0.9.5
+
+### Patch Changes
+
+- feb4e8de07: Fix EntityPage tab scrolling overflow bug on Firefox
+- 65840b17be: Fix issue where right arrow icon was incorrectly added to side bar items without a sub-menu
+- de593ec78f: Updated dependency `react-text-truncate` to `^0.19.0`.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
+- ee2cd642c5: Updated dependency `rc-progress` to `3.3.3`.
+- 96d1e01641: Accessibility updates:
+
+ - Added `aria-label` to the `Select` component
+ - Changed heading level used in the header of `Table` component
+
+- 7d355c4b3f: Fix the missing filter in the toolbar when passing a custom component in the core-components Table
+- 1cf9caecd6: fix Sidebar Contexts deprecation message
+- bff65e6958: The `SidebarPinStateContext` and `SidebarContext` have been deprecated and will be removed in a future release. Instead, use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()`.
+
+ This was done to ensure that sidebar state can be shared successfully across components exported by different packages, regardless of what version of this package is resolved and installed for each individual package.
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3
+
+## 0.9.5-next.2
+
+### Patch Changes
+
+- ee2cd642c5: Updated dependency `rc-progress` to `3.3.3`.
+- 1cf9caecd6: fix Sidebar Contexts deprecation message
+
+## 0.9.5-next.1
+
+### Patch Changes
+
+- feb4e8de07: Fix EntityPage tab scrolling overflow bug on Firefox
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- bff65e6958: The `SidebarPinStateContext` and `SidebarContext` have been deprecated and will be removed in a future release. Instead, use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()`.
+
+ This was done to ensure that sidebar state can be shared successfully across components exported by different packages, regardless of what version of this package is resolved and installed for each individual package.
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.3-next.0
+
+## 0.9.5-next.0
+
+### Patch Changes
+
+- 65840b17be: Fix issue where right arrow icon was incorrectly added to side bar items without a sub-menu
+- 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
+- 96d1e01641: Accessibility updates:
+
+ - Added `aria-label` to the `Select` component
+ - Changed heading level used in the header of `Table` component
+
## 0.9.4
### Patch Changes
diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md
index 727a50926c..911ef36867 100644
--- a/packages/core-components/api-report.md
+++ b/packages/core-components/api-report.md
@@ -16,7 +16,6 @@ import { CardHeaderProps } from '@material-ui/core/CardHeader';
import { Column } from '@material-table/core';
import { ComponentClass } from 'react';
import { ComponentProps } from 'react';
-import { Context } from 'react';
import { default as CSS_2 } from 'csstype';
import { CSSProperties } from 'react';
import { ElementType } from 'react';
@@ -903,14 +902,10 @@ export const sidebarConfig: {
mobileSidebarHeight: number;
};
-// Warning: (ae-missing-release-tag) "SidebarContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
-//
-// @public
-export const SidebarContext: Context;
+// @public @deprecated
+export const SidebarContext: React_2.Context;
-// Warning: (ae-missing-release-tag) "SidebarContextType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
-//
-// @public
+// @public @deprecated
export type SidebarContextType = {
isOpen: boolean;
setOpen: (open: boolean) => void;
@@ -983,6 +978,21 @@ export type SidebarItemClassKey =
| 'arrows'
| 'selected';
+// @public
+export type SidebarOpenState = {
+ isOpen: boolean;
+ setOpen: (open: boolean) => void;
+};
+
+// @public
+export const SidebarOpenStateProvider: ({
+ children,
+ value,
+}: {
+ children: ReactNode;
+ value: SidebarOpenState;
+}) => JSX.Element;
+
// @public (undocumented)
export type SidebarOptions = {
drawerWidthClosed?: number;
@@ -1005,15 +1015,31 @@ export type SidebarPageProps = {
};
// @public
+export type SidebarPinState = {
+ isPinned: boolean;
+ toggleSidebarPinState: () => any;
+ isMobile?: boolean;
+};
+
+// @public @deprecated
export const SidebarPinStateContext: React_2.Context;
-// @public
+// @public @deprecated
export type SidebarPinStateContextType = {
isPinned: boolean;
toggleSidebarPinState: () => any;
isMobile?: boolean;
};
+// @public
+export const SidebarPinStateProvider: ({
+ children,
+ value,
+}: {
+ children: ReactNode;
+ value: SidebarPinStateContextType;
+}) => JSX.Element;
+
// @public (undocumented)
export type SidebarProps = {
openDelayMs?: number;
@@ -1447,6 +1473,12 @@ export class UserIdentity implements IdentityApi {
signOut(): Promise;
}
+// @public
+export const useSidebarOpenState: () => SidebarOpenState;
+
+// @public
+export const useSidebarPinState: () => SidebarPinState;
+
// Warning: (ae-missing-release-tag) "useSupportConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
diff --git a/packages/core-components/package.json b/packages/core-components/package.json
index a988d8213e..867909b3cf 100644
--- a/packages/core-components/package.json
+++ b/packages/core-components/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-components",
"description": "Core components used by Backstage plugins and apps",
- "version": "0.9.4",
+ "version": "0.9.5",
"private": false,
"publishConfig": {
"access": "public",
@@ -34,9 +34,10 @@
},
"dependencies": {
"@backstage/config": "^1.0.1",
- "@backstage/core-plugin-api": "^1.0.2",
+ "@backstage/core-plugin-api": "^1.0.3",
"@backstage/errors": "^1.0.0",
"@backstage/theme": "^0.2.15",
+ "@backstage/version-bridge": "^1.0.1",
"@material-table/core": "^3.1.0",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -55,7 +56,7 @@
"pluralize": "^8.0.0",
"prop-types": "^15.7.2",
"qs": "^6.9.4",
- "rc-progress": "3.3.2",
+ "rc-progress": "3.3.3",
"react-helmet": "6.1.0",
"react-hook-form": "^7.12.2",
"react-markdown": "^8.0.0",
@@ -63,7 +64,7 @@
"react-router-dom": "6.0.0-beta.0",
"react-sparklines": "^1.7.0",
"react-syntax-highlighter": "^15.4.5",
- "react-text-truncate": "^0.18.0",
+ "react-text-truncate": "^0.19.0",
"react-use": "^17.3.2",
"@react-hookz/web": "^14.0.0",
"react-virtualized-auto-sizer": "^1.0.6",
@@ -78,9 +79,9 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/cli": "^0.17.1",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
@@ -100,7 +101,7 @@
"@types/react-window": "^1.8.5",
"@types/zen-observable": "^0.8.0",
"cross-fetch": "^3.1.5",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx b/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx
index 6db8e2dd02..9f447f80cc 100644
--- a/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx
+++ b/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx
@@ -40,7 +40,7 @@ import { ARROW_MARKER_ID } from './constants';
*
* @public
* @remarks
- * and are useful when rendering custom or edge labels
+ * `` and `` are useful when rendering custom or edge labels
*/
export interface DependencyGraphProps
extends React.SVGProps {
diff --git a/packages/core-components/src/components/Table/Table.test.tsx b/packages/core-components/src/components/Table/Table.test.tsx
index 12431dea59..ff17409502 100644
--- a/packages/core-components/src/components/Table/Table.test.tsx
+++ b/packages/core-components/src/components/Table/Table.test.tsx
@@ -160,4 +160,55 @@ describe('', () => {
);
expect(rendered.getByText('EMPTY')).toBeInTheDocument();
});
+
+ describe('with custom components', () => {
+ const CustomRow = ({ data }: any) => {
+ return (
+
+ customised cell {data.col1}
+ customised cell {data.col2}
+
+ );
+ };
+
+ it('should not override the toolbar implementation', async () => {
+ const rendered = await renderInTestApp(
+ EMPTY}
+ columns={minProps.columns}
+ data={minProps.data}
+ filters={[
+ {
+ column: column1.title,
+ type: 'select',
+ },
+ ]}
+ components={{
+ Row: CustomRow,
+ }}
+ />,
+ );
+
+ expect(rendered.getByText('Filters (0)')).toBeInTheDocument();
+ });
+
+ it('should render the provided custom row component correctly', async () => {
+ const rendered = await renderInTestApp(
+ EMPTY}
+ columns={minProps.columns}
+ data={minProps.data}
+ components={{
+ Row: CustomRow,
+ }}
+ />,
+ );
+
+ expect(
+ rendered.getByText('customised cell first value, first row'),
+ ).toBeInTheDocument();
+ });
+ });
});
diff --git a/packages/core-components/src/components/Table/Table.tsx b/packages/core-components/src/components/Table/Table.tsx
index 84e88ae01e..65edb5b69b 100644
--- a/packages/core-components/src/components/Table/Table.tsx
+++ b/packages/core-components/src/components/Table/Table.tsx
@@ -303,6 +303,7 @@ export function Table(props: TableProps) {
initialState,
emptyContent,
onStateChange,
+ components,
...restProps
} = props;
const tableClasses = useTableStyles();
@@ -493,6 +494,7 @@ export function Table(props: TableProps) {
Header: StyledMTableHeader,
Toolbar,
Body,
+ ...components,
}}
options={{ ...defaultOptions, ...options }}
columns={MTColumns}
diff --git a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx
index bee4bdfce2..0a937683a5 100644
--- a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx
+++ b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx
@@ -35,6 +35,7 @@ const useStyles = makeStyles(
gridArea: 'pageSubheader',
backgroundColor: theme.palette.background.paper,
paddingLeft: theme.spacing(3),
+ minWidth: 0,
},
defaultTab: {
padding: theme.spacing(3, 3),
diff --git a/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx b/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx
index 3209848ecb..a34d773ce3 100644
--- a/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx
+++ b/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx
@@ -64,7 +64,7 @@ export type ItemCardHeaderProps = Partial> & {
* A simple card header, rendering a default look for "item cards" - cards that
* are arranged in a grid for users to select among several options.
*
- * This component expects to be placed within a MUI .
+ * This component expects to be placed within a MUI ``.
*
* Styles for the header can be overridden using the `classes` prop, e.g.:
*
diff --git a/packages/core-components/src/layout/Page/Page.tsx b/packages/core-components/src/layout/Page/Page.tsx
index 9bfc16fea3..1abb8da93b 100644
--- a/packages/core-components/src/layout/Page/Page.tsx
+++ b/packages/core-components/src/layout/Page/Page.tsx
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-import React, { useContext } from 'react';
+import React from 'react';
import { BackstageTheme } from '@backstage/theme';
import { makeStyles, ThemeProvider } from '@material-ui/core/styles';
-import { SidebarPinStateContext } from '../Sidebar/Page';
+import { useSidebarPinState } from '../Sidebar/SidebarPinStateContext';
export type PageClassKey = 'root';
@@ -43,7 +43,7 @@ type Props = {
export function Page(props: Props) {
const { themeId, children } = props;
- const { isMobile } = useContext(SidebarPinStateContext);
+ const { isMobile } = useSidebarPinState();
const classes = useStyles({ isMobile });
return (
- ,
+ ,
);
}
diff --git a/packages/core-components/src/layout/Sidebar/Bar.tsx b/packages/core-components/src/layout/Sidebar/Bar.tsx
index e78706bd62..c86f60a0a2 100644
--- a/packages/core-components/src/layout/Sidebar/Bar.tsx
+++ b/packages/core-components/src/layout/Sidebar/Bar.tsx
@@ -25,14 +25,15 @@ import {
makeSidebarConfig,
makeSidebarSubmenuConfig,
SidebarConfig,
- SidebarContext,
SidebarConfigContext,
SubmenuConfig,
SidebarOptions,
SubmenuOptions,
} from './config';
import { BackstageTheme } from '@backstage/theme';
-import { SidebarPinStateContext, useContent } from './Page';
+import { useContent } from './Page';
+import { SidebarOpenStateProvider } from './SidebarOpenStateContext';
+import { useSidebarPinState } from './SidebarPinStateContext';
import { MobileSidebar } from './MobileSidebar';
/** @public */
@@ -133,9 +134,7 @@ const DesktopSidebar = (props: DesktopSidebarProps) => {
);
const [state, setState] = useState(State.Closed);
const hoverTimerRef = useRef();
- const { isPinned, toggleSidebarPinState } = useContext(
- SidebarPinStateContext,
- );
+ const { isPinned, toggleSidebarPinState } = useSidebarPinState();
const handleOpen = () => {
if (isPinned || disableExpandOnHover) {
@@ -191,7 +190,7 @@ const DesktopSidebar = (props: DesktopSidebarProps) => {
return (
-
+
{
{children}
-
+
);
};
@@ -226,7 +225,7 @@ export const Sidebar = (props: SidebarProps) => {
props.submenuOptions ?? {},
);
const { children, disableExpandOnHover, openDelayMs, closeDelayMs } = props;
- const { isMobile } = useContext(SidebarPinStateContext);
+ const { isMobile } = useSidebarPinState();
return isMobile ? (
{children}
diff --git a/packages/core-components/src/layout/Sidebar/Intro.tsx b/packages/core-components/src/layout/Sidebar/Intro.tsx
index d1d8f4b2a2..05d580c960 100644
--- a/packages/core-components/src/layout/Sidebar/Intro.tsx
+++ b/packages/core-components/src/layout/Sidebar/Intro.tsx
@@ -25,10 +25,10 @@ import { useLocalStorageValue } from '@react-hookz/web';
import {
SidebarConfigContext,
SidebarConfig,
- SidebarContext,
SIDEBAR_INTRO_LOCAL_STORAGE,
} from './config';
import { SidebarDivider } from './Items';
+import { useSidebarOpenState } from './SidebarOpenStateContext';
/** @public */
export type SidebarIntroClassKey =
@@ -151,7 +151,7 @@ const recentlyViewedIntroText =
'And your recently viewed plugins will pop up here!';
export function SidebarIntro(_props: {}) {
- const { isOpen } = useContext(SidebarContext);
+ const { isOpen } = useSidebarOpenState();
const defaultValue = {
starredItemsDismissed: false,
recentlyViewedItemsDismissed: false,
diff --git a/packages/core-components/src/layout/Sidebar/Items.tsx b/packages/core-components/src/layout/Sidebar/Items.tsx
index c004f6904c..0413864084 100644
--- a/packages/core-components/src/layout/Sidebar/Items.tsx
+++ b/packages/core-components/src/layout/Sidebar/Items.tsx
@@ -48,7 +48,6 @@ import {
useResolvedPath,
} from 'react-router-dom';
import {
- SidebarContext,
SidebarConfigContext,
SidebarItemWithSubmenuContext,
SidebarConfig,
@@ -62,6 +61,7 @@ import DoubleArrowLeft from './icons/DoubleArrowLeft';
import DoubleArrowRight from './icons/DoubleArrowRight';
import { isLocationMatch } from './utils';
import { Location } from 'history';
+import { useSidebarOpenState } from './SidebarOpenStateContext';
/** @public */
export type SidebarItemClassKey =
@@ -259,6 +259,7 @@ type SidebarItemBaseProps = {
icon: IconComponent;
text?: string;
hasNotifications?: boolean;
+ hasSubmenu?: boolean;
disableHighlight?: boolean;
className?: string;
};
@@ -356,6 +357,7 @@ const SidebarItemBase = forwardRef((props, ref) => {
icon: Icon,
text,
hasNotifications = false,
+ hasSubmenu = false,
disableHighlight = false,
onClick,
children,
@@ -367,15 +369,15 @@ const SidebarItemBase = forwardRef((props, ref) => {
// XXX (@koroeskohr): unsure this is optimal. But I just really didn't want to have the item component
// depend on the current location, and at least have it being optionally forced to selected.
// Still waiting on a Q answered to fine tune the implementation
- const { isOpen } = useContext(SidebarContext);
+ const { isOpen } = useSidebarOpenState();
const divStyle =
- !isOpen && children ? { display: 'flex', marginLeft: '24px' } : {};
+ !isOpen && hasSubmenu ? { display: 'flex', marginLeft: '24px' } : {};
const displayItemIcon = (
- {!isOpen && children ?
: <>>}
+ {!isOpen && hasSubmenu ?
: <>>}
);
@@ -492,6 +494,7 @@ const SidebarItemWithSubmenu = ({
className={classnames(isHoveredOn && classes.highlighted)}
>
@@ -668,7 +671,7 @@ export const SidebarScrollWrapper = styled('div')(({ theme }) => {
export const SidebarExpandButton = () => {
const { sidebarConfig } = useContext(SidebarConfigContext);
const classes = useMemoStyles(sidebarConfig);
- const { isOpen, setOpen } = useContext(SidebarContext);
+ const { isOpen, setOpen } = useSidebarOpenState();
const isSmallScreen = useMediaQuery(
theme => theme.breakpoints.down('md'),
{ noSsr: true },
diff --git a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
index 111bf38314..b51e3cbc0d 100644
--- a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
+++ b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
@@ -27,8 +27,9 @@ import MenuIcon from '@material-ui/icons/Menu';
import { orderBy } from 'lodash';
import React, { createContext, useEffect, useState, useContext } from 'react';
import { useLocation } from 'react-router';
+import { SidebarOpenStateProvider } from './SidebarOpenStateContext';
import { SidebarGroup } from './SidebarGroup';
-import { SidebarConfigContext, SidebarContext, SidebarConfig } from './config';
+import { SidebarConfigContext, SidebarConfig } from './config';
/**
* Type of `MobileSidebarContext`
@@ -207,7 +208,7 @@ export const MobileSidebar = (props: MobileSidebarProps) => {
!sidebarGroups[selectedMenuItemIndex].props.to;
return (
- {} }}>
+ {} }}>
@@ -231,6 +232,6 @@ export const MobileSidebar = (props: MobileSidebarProps) => {
{sidebarGroups}
-
+
);
};
diff --git a/packages/core-components/src/layout/Sidebar/Page.tsx b/packages/core-components/src/layout/Sidebar/Page.tsx
index 9bf8105f81..bdf41b5dd7 100644
--- a/packages/core-components/src/layout/Sidebar/Page.tsx
+++ b/packages/core-components/src/layout/Sidebar/Page.tsx
@@ -29,6 +29,7 @@ import { SidebarConfigContext, SidebarConfig } from './config';
import { BackstageTheme } from '@backstage/theme';
import { LocalStorage } from './localStorage';
import useMediaQuery from '@material-ui/core/useMediaQuery';
+import { SidebarPinStateProvider } from './SidebarPinStateContext';
export type SidebarPageClassKey = 'root';
@@ -62,17 +63,6 @@ const useStyles = makeStyles<
{ name: 'BackstageSidebarPage' },
);
-/**
- * Type of `SidebarPinStateContext`
- *
- * @public
- */
-export type SidebarPinStateContextType = {
- isPinned: boolean;
- toggleSidebarPinState: () => any;
- isMobile?: boolean;
-};
-
/**
* Props for SidebarPage
*
@@ -82,19 +72,6 @@ export type SidebarPageProps = {
children?: React.ReactNode;
};
-/**
- * Contains the state on how the `Sidebar` is rendered
- *
- * @public
- */
-export const SidebarPinStateContext = createContext(
- {
- isPinned: true,
- toggleSidebarPinState: () => {},
- isMobile: false,
- },
-);
-
type PageContextType = {
content: {
contentRef?: React.MutableRefObject;
@@ -137,7 +114,7 @@ export function SidebarPage(props: SidebarPageProps) {
const classes = useStyles({ isPinned, sidebarConfig });
return (
-
{props.children}
-
+
);
}
diff --git a/packages/core-components/src/layout/Sidebar/SidebarGroup.tsx b/packages/core-components/src/layout/Sidebar/SidebarGroup.tsx
index 55b5e770b0..1158cc14df 100644
--- a/packages/core-components/src/layout/Sidebar/SidebarGroup.tsx
+++ b/packages/core-components/src/layout/Sidebar/SidebarGroup.tsx
@@ -22,7 +22,7 @@ import BottomNavigationAction, {
import { makeStyles } from '@material-ui/core/styles';
import React, { useContext } from 'react';
import { useLocation } from 'react-router-dom';
-import { SidebarPinStateContext } from '.';
+import { useSidebarPinState } from '.';
import { Link } from '../../components';
import { SidebarConfigContext, SidebarConfig } from './config';
import { MobileSidebarContext } from './MobileSidebar';
@@ -122,7 +122,7 @@ const MobileSidebarGroup = (props: SidebarGroupProps) => {
*/
export const SidebarGroup = (props: SidebarGroupProps) => {
const { children, to, label, icon, value } = props;
- const { isMobile } = useContext(SidebarPinStateContext);
+ const { isMobile } = useSidebarPinState();
return isMobile ? (
diff --git a/packages/core-components/src/layout/Sidebar/SidebarOpenStateContext.test.tsx b/packages/core-components/src/layout/Sidebar/SidebarOpenStateContext.test.tsx
new file mode 100644
index 0000000000..f1900f025c
--- /dev/null
+++ b/packages/core-components/src/layout/Sidebar/SidebarOpenStateContext.test.tsx
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { ReactNode, useContext } from 'react';
+import { renderWithEffects } from '@backstage/test-utils';
+import { waitFor } from '@testing-library/react';
+import { renderHook, act } from '@testing-library/react-hooks';
+import {
+ LegacySidebarContext,
+ SidebarOpenStateProvider,
+ useSidebarOpenState,
+} from './SidebarOpenStateContext';
+
+describe('SidebarOpenStateContext', () => {
+ describe('SidebarOpenStateProvider', () => {
+ it('should render children', async () => {
+ const { findByText } = await renderWithEffects(
+ {} }}>
+ Child
+ ,
+ );
+ expect(await findByText('Child')).toBeInTheDocument();
+ });
+
+ it('should provide the legacy context as well, for now', async () => {
+ const LegacyContextSpy = () => {
+ const { isOpen } = useContext(LegacySidebarContext);
+ return <>{String(isOpen)}>;
+ };
+
+ const { findByText } = await renderWithEffects(
+ {},
+ }}
+ >
+
+ ,
+ );
+
+ expect(await findByText('true')).toBeInTheDocument();
+ });
+ });
+
+ describe('useSidebarOpenState', () => {
+ it('can be invoked within legacy context', () => {
+ const wrapper = ({ children }: { children: ReactNode }) => (
+ {},
+ }}
+ >
+ {children}
+
+ );
+
+ const { result } = renderHook(() => useSidebarOpenState(), {
+ wrapper,
+ });
+
+ expect(result.current.isOpen).toBe(true);
+ expect(typeof result.current.setOpen).toBe('function');
+ });
+
+ it('does not need to be invoked within provider', () => {
+ const { result } = renderHook(() => useSidebarOpenState());
+ expect(result.current.isOpen).toBe(false);
+ expect(typeof result.current.setOpen).toBe('function');
+ });
+
+ it('should read and update state', async () => {
+ let actualValue = true;
+ const wrapper = ({ children }: { children: ReactNode }) => (
+ {
+ actualValue = value;
+ },
+ }}
+ >
+ {children}
+
+ );
+ const { result, rerender } = renderHook(() => useSidebarOpenState(), {
+ wrapper,
+ });
+
+ expect(result.current.isOpen).toBe(true);
+
+ act(() => {
+ result.current.setOpen(false);
+ rerender();
+ });
+
+ await waitFor(() => {
+ expect(result.current.isOpen).toBe(false);
+ });
+ });
+ });
+});
diff --git a/packages/core-components/src/layout/Sidebar/SidebarOpenStateContext.tsx b/packages/core-components/src/layout/Sidebar/SidebarOpenStateContext.tsx
new file mode 100644
index 0000000000..7cb0e5b2c3
--- /dev/null
+++ b/packages/core-components/src/layout/Sidebar/SidebarOpenStateContext.tsx
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { createContext, ReactNode, useContext } from 'react';
+import {
+ createVersionedContext,
+ createVersionedValueMap,
+} from '@backstage/version-bridge';
+
+/**
+ * Types for the `SidebarContext`
+ *
+ * @public @deprecated
+ * Use `SidebarOpenState` instead.
+ */
+export type SidebarContextType = {
+ isOpen: boolean;
+ setOpen: (open: boolean) => void;
+};
+
+/**
+ * The open state of the sidebar.
+ *
+ * @public
+ */
+export type SidebarOpenState = {
+ /**
+ * Whether or not the sidebar is open and full-width. When `false`, the
+ * sidebar is "closed" and typically only shows icons with no text.
+ */
+ isOpen: boolean;
+
+ /**
+ * A function to set whether or not the sidebar is open. Pass `true` to open
+ * the sidebar. Pass `false` to close it.
+ */
+ setOpen: (open: boolean) => void;
+};
+
+const defaultSidebarOpenStateContext = {
+ isOpen: false,
+ setOpen: () => {},
+};
+
+/**
+ * Context whether the `Sidebar` is open
+ *
+ * @public @deprecated
+ * Use `` + `useSidebarOpenState()` instead.
+ */
+export const LegacySidebarContext = createContext(
+ defaultSidebarOpenStateContext,
+);
+
+const VersionedSidebarContext = createVersionedContext<{
+ 1: SidebarOpenState;
+}>('sidebar-open-state-context');
+
+/**
+ * Provides context for reading and updating sidebar state.
+ *
+ * @public
+ */
+export const SidebarOpenStateProvider = ({
+ children,
+ value,
+}: {
+ children: ReactNode;
+ value: SidebarOpenState;
+}) => (
+
+
+ {children}
+
+
+);
+
+/**
+ * Hook to read and update the sidebar's open state, which controls whether or
+ * not the sidebar is open and full-width, or closed and only displaying icons.
+ *
+ * @public
+ */
+export const useSidebarOpenState = (): SidebarOpenState => {
+ const versionedOpenStateContext = useContext(VersionedSidebarContext);
+ const legacyOpenStateContext = useContext(LegacySidebarContext);
+
+ // Invoked from outside a SidebarOpenStateProvider: check for the legacy
+ // context's value, but otherwise return the default.
+ if (versionedOpenStateContext === undefined) {
+ return legacyOpenStateContext || defaultSidebarOpenStateContext;
+ }
+
+ const openStateContext = versionedOpenStateContext.atVersion(1);
+ if (openStateContext === undefined) {
+ throw new Error('No context found for version 1.');
+ }
+
+ return openStateContext;
+};
diff --git a/packages/core-components/src/layout/Sidebar/SidebarPinStateContext.test.tsx b/packages/core-components/src/layout/Sidebar/SidebarPinStateContext.test.tsx
new file mode 100644
index 0000000000..8bd1597725
--- /dev/null
+++ b/packages/core-components/src/layout/Sidebar/SidebarPinStateContext.test.tsx
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { ReactNode, useContext } from 'react';
+import { renderWithEffects } from '@backstage/test-utils';
+import { waitFor } from '@testing-library/react';
+import { renderHook, act } from '@testing-library/react-hooks';
+import {
+ LegacySidebarPinStateContext,
+ SidebarPinStateProvider,
+ useSidebarPinState,
+} from './SidebarPinStateContext';
+
+describe('SidebarPinStateContext', () => {
+ describe('SidebarPinStateProvider', () => {
+ it('should render children', async () => {
+ const { findByText } = await renderWithEffects(
+ {},
+ }}
+ >
+ Child
+ ,
+ );
+ expect(await findByText('Child')).toBeInTheDocument();
+ });
+
+ it('should provide the legacy context as well, for now', async () => {
+ const LegacyContextSpy = () => {
+ const { isMobile } = useContext(LegacySidebarPinStateContext);
+ return <>{String(isMobile)}>;
+ };
+
+ const { findByText } = await renderWithEffects(
+ {},
+ }}
+ >
+
+ ,
+ );
+
+ expect(await findByText('true')).toBeInTheDocument();
+ });
+ });
+
+ describe('useSidebarPinState', () => {
+ it('can be invoked within legacy context', () => {
+ const wrapper = ({ children }: { children: ReactNode }) => (
+ {},
+ }}
+ >
+ {children}
+
+ );
+
+ const { result } = renderHook(() => useSidebarPinState(), {
+ wrapper,
+ });
+
+ expect(result.current.isPinned).toBe(true);
+ expect(result.current.isMobile).toBe(true);
+ expect(typeof result.current.toggleSidebarPinState).toBe('function');
+ });
+
+ it('does not need to be invoked within provider', () => {
+ const { result } = renderHook(() => useSidebarPinState());
+ expect(result.current.isPinned).toBe(true);
+ expect(result.current.isMobile).toBe(false);
+ expect(typeof result.current.toggleSidebarPinState).toBe('function');
+ });
+
+ it('should read and update state', async () => {
+ let actualValue = true;
+ const wrapper = ({ children }: { children: ReactNode }) => (
+ {
+ actualValue = !actualValue;
+ },
+ }}
+ >
+ {children}
+
+ );
+ const { result, rerender } = renderHook(() => useSidebarPinState(), {
+ wrapper,
+ });
+
+ expect(result.current.isPinned).toBe(true);
+
+ act(() => {
+ result.current.toggleSidebarPinState();
+ rerender();
+ });
+
+ await waitFor(() => {
+ expect(result.current.isPinned).toBe(false);
+ });
+ });
+ });
+});
diff --git a/packages/core-components/src/layout/Sidebar/SidebarPinStateContext.tsx b/packages/core-components/src/layout/Sidebar/SidebarPinStateContext.tsx
new file mode 100644
index 0000000000..e00ed259e9
--- /dev/null
+++ b/packages/core-components/src/layout/Sidebar/SidebarPinStateContext.tsx
@@ -0,0 +1,121 @@
+/*
+ * 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 {
+ createVersionedContext,
+ createVersionedValueMap,
+} from '@backstage/version-bridge';
+import React, { createContext, ReactNode, useContext } from 'react';
+
+/**
+ * Type of `SidebarPinStateContext`
+ *
+ * @public @deprecated
+ * Use `SidebarPinState` instead.
+ */
+export type SidebarPinStateContextType = {
+ isPinned: boolean;
+ toggleSidebarPinState: () => any;
+ isMobile?: boolean;
+};
+
+/**
+ * The pin state of the sidebar.
+ *
+ * @public
+ */
+export type SidebarPinState = {
+ /**
+ * Whether or not the sidebar is pinned to the `open` state. When `isPinned`
+ * is `false`, the sidebar opens and closes on hover. When `true`, the
+ * sidebar is permanently opened, regardless of user interaction.
+ */
+ isPinned: boolean;
+
+ /**
+ * A function to toggle the pin state of the sidebar.
+ */
+ toggleSidebarPinState: () => any;
+
+ /**
+ * Whether or not the sidebar is or should be rendered in a mobile-optimized
+ * way.
+ */
+ isMobile?: boolean;
+};
+
+const defaultSidebarPinStateContext = {
+ isPinned: true,
+ toggleSidebarPinState: () => {},
+ isMobile: false,
+};
+
+/**
+ * Contains the state on how the `Sidebar` is rendered
+ *
+ * @public @deprecated
+ * Use `` + `useSidebarPinState()` instead.
+ */
+export const LegacySidebarPinStateContext =
+ createContext(defaultSidebarPinStateContext);
+
+const VersionedSidebarPinStateContext = createVersionedContext<{
+ 1: SidebarPinState;
+}>('sidebar-pin-state-context');
+
+/**
+ * Provides state for how the `Sidebar` is rendered
+ *
+ * @public
+ */
+export const SidebarPinStateProvider = ({
+ children,
+ value,
+}: {
+ children: ReactNode;
+ value: SidebarPinStateContextType;
+}) => (
+
+
+ {children}
+
+
+);
+
+/**
+ * Hook to read and update sidebar pin state, which controls whether or not the
+ * sidebar is pinned open.
+ *
+ * @public
+ */
+export const useSidebarPinState = (): SidebarPinState => {
+ const versionedPinStateContext = useContext(VersionedSidebarPinStateContext);
+ const legacyPinStateContext = useContext(LegacySidebarPinStateContext);
+
+ // Invoked from outside a SidebarPinStateProvider: check for the legacy
+ // context's value, but otherwise return the default.
+ if (versionedPinStateContext === undefined) {
+ return legacyPinStateContext || defaultSidebarPinStateContext;
+ }
+
+ const pinStateContext = versionedPinStateContext.atVersion(1);
+ if (pinStateContext === undefined) {
+ throw new Error('No context found for version 1.');
+ }
+
+ return pinStateContext;
+};
diff --git a/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx b/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx
index d1b79263eb..438e580ef4 100644
--- a/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx
+++ b/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx
@@ -19,10 +19,10 @@ import classnames from 'classnames';
import React, { ReactNode, useContext, useEffect, useState } from 'react';
import {
SidebarItemWithSubmenuContext,
- SidebarContext,
SidebarConfigContext,
SubmenuConfig,
} from './config';
+import { useSidebarOpenState } from './SidebarOpenStateContext';
import { BackstageTheme } from '@backstage/theme';
const useStyles = makeStyles<
@@ -105,7 +105,7 @@ export type SidebarSubmenuProps = {
* @public
*/
export const SidebarSubmenu = (props: SidebarSubmenuProps) => {
- const { isOpen } = useContext(SidebarContext);
+ const { isOpen } = useSidebarOpenState();
const { sidebarConfig, submenuConfig } = useContext(SidebarConfigContext);
const left = isOpen
? sidebarConfig.drawerWidthOpen
diff --git a/packages/core-components/src/layout/Sidebar/config.ts b/packages/core-components/src/layout/Sidebar/config.ts
index 08d469d5a3..bb0ff207fb 100644
--- a/packages/core-components/src/layout/Sidebar/config.ts
+++ b/packages/core-components/src/layout/Sidebar/config.ts
@@ -101,22 +101,6 @@ export const makeSidebarSubmenuConfig = (
export const SIDEBAR_INTRO_LOCAL_STORAGE =
'@backstage/core/sidebar-intro-dismissed';
-/**
- * Types for the `SidebarContext`
- */
-export type SidebarContextType = {
- isOpen: boolean;
- setOpen: (open: boolean) => void;
-};
-
-/**
- * Context whether the `Sidebar` is open
- */
-export const SidebarContext = createContext({
- isOpen: false,
- setOpen: () => {},
-});
-
export type SidebarConfigContextType = {
sidebarConfig: SidebarConfig;
submenuConfig: SubmenuConfig;
diff --git a/packages/core-components/src/layout/Sidebar/index.ts b/packages/core-components/src/layout/Sidebar/index.ts
index ecc573fbda..4c91ea6a8f 100644
--- a/packages/core-components/src/layout/Sidebar/index.ts
+++ b/packages/core-components/src/layout/Sidebar/index.ts
@@ -27,16 +27,8 @@ export type {
SidebarSubmenuItemDropdownItem,
} from './SidebarSubmenuItem';
export type { SidebarClassKey, SidebarProps } from './Bar';
-export {
- SidebarPage,
- SidebarPinStateContext as SidebarPinStateContext,
- useContent,
-} from './Page';
-export type {
- SidebarPinStateContextType as SidebarPinStateContextType,
- SidebarPageClassKey,
- SidebarPageProps,
-} from './Page';
+export { SidebarPage, useContent } from './Page';
+export type { SidebarPageClassKey, SidebarPageProps } from './Page';
export {
SidebarDivider,
SidebarItem,
@@ -54,13 +46,23 @@ export type {
} from './Items';
export { IntroCard, SidebarIntro } from './Intro';
export type { SidebarIntroClassKey } from './Intro';
+export { SIDEBAR_INTRO_LOCAL_STORAGE, sidebarConfig } from './config';
+export type { SidebarOptions, SubmenuOptions } from './config';
export {
- SIDEBAR_INTRO_LOCAL_STORAGE,
- SidebarContext,
- sidebarConfig,
-} from './config';
+ LegacySidebarContext as SidebarContext,
+ SidebarOpenStateProvider,
+ useSidebarOpenState,
+} from './SidebarOpenStateContext';
export type {
SidebarContextType,
- SidebarOptions,
- SubmenuOptions,
-} from './config';
+ SidebarOpenState,
+} from './SidebarOpenStateContext';
+export {
+ LegacySidebarPinStateContext as SidebarPinStateContext,
+ SidebarPinStateProvider,
+ useSidebarPinState,
+} from './SidebarPinStateContext';
+export type {
+ SidebarPinStateContextType,
+ SidebarPinState,
+} from './SidebarPinStateContext';
diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md
index 44104208ef..8b363df966 100644
--- a/packages/core-plugin-api/CHANGELOG.md
+++ b/packages/core-plugin-api/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/core-plugin-api
+## 1.0.3
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## 1.0.3-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
## 1.0.2
### Patch Changes
diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json
index 4377761d89..8d525b5f0f 100644
--- a/packages/core-plugin-api/package.json
+++ b/packages/core-plugin-api/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-plugin-api",
"description": "Core API used by Backstage plugins",
- "version": "1.0.2",
+ "version": "1.0.3",
"private": false,
"publishConfig": {
"access": "public",
@@ -46,9 +46,9 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0",
@@ -58,7 +58,7 @@
"@types/prop-types": "^15.7.3",
"@types/zen-observable": "^0.8.0",
"cross-fetch": "^3.1.5",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md
index 6993b4631e..775aed3faa 100644
--- a/packages/create-app/CHANGELOG.md
+++ b/packages/create-app/CHANGELOG.md
@@ -1,5 +1,294 @@
# @backstage/create-app
+## 0.4.28
+
+### Patch Changes
+
+- 881fbd7e8d: Register `TechDocs` addons on catalog entity pages, follow the steps below to add them manually:
+
+ ```diff
+ // packages/app/src/components/catalog/EntityPage.tsx
+
+ + import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
+ + import {
+ + ReportIssue,
+ + } from '@backstage/plugin-techdocs-module-addons-contrib';
+
+ + const techdocsContent = (
+ +
+ +
+ +
+ +
+ +
+ + );
+
+ const defaultEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+
+ const serviceEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+
+ const websiteEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+ ```
+
+- 0e870fe0ac: Removed peer dependencies, as they are no longer needed.
+- bff65e6958: Use of `SidebarContext` has been deprecated and will be removed in a future release. Instead, `useSidebarOpenState()` should be used to consume the context and `` should be used to provide it.
+
+ To prepare your app, update `packages/app/src/components/Root/Root.tsx` as follows:
+
+ ```diff
+ import {
+ Sidebar,
+ sidebarConfig,
+ - SidebarContext
+ SidebarDivider,
+ // ...
+ SidebarSpace,
+ + useSidebarOpenState,
+ } from '@backstage/core-components';
+
+ // ...
+
+ const SidebarLogo = () => {
+ const classes = useSidebarLogoStyles();
+ - const { isOpen } = useContext(SidebarContext);
+ + const { isOpen } = useSidebarOpenState();
+
+ // ...
+ };
+ ```
+
+- 935d8515da: Updated the `--version` flag to output the version of the current backstage release instead of the version of create-app.
+- 18d4c3e50a: Updated `app-config.production.yaml` to specify an empty list of catalog locations. This is done to prevent example locations stored in `app-config.yaml` from being loaded as these are examples.
+- 1f70704580: Accessibility updates:
+
+ - Added `aria-label` to the sidebar Logo link. To enable this for an existing app, please make the following changes:
+
+ `packages/app/src/components/Root/Root.tsx`
+
+ ```diff
+ const SidebarLogo = () => {
+ const classes = useSidebarLogoStyles();
+ const { isOpen } = useContext(SidebarContext);
+
+ return (
+
+
+ {isOpen ? : }
+
+
+ );
+ };
+ ```
+
+- 30f04d1497: Components ``, ``, ``, and `` are now deprecated in `@backstage/plugin-search` and should be imported from `@backstage/plugin-search-react` instead.
+
+ To upgrade your App, update the following in `packages/app/src/components/search/SearchPage.tsx`:
+
+ ```diff
+ import {
+ DefaultResultListItem
+ SearchBar
+ SearchFilter
+ SearchResult
+ - } from `@backstage/plugin-search`;
+ + } from `@backstage/plugin-search-react`;
+ ```
+
+- f7f5a6c6a3: It's now possible to pass result item components a `rank`, which is captured by the analytics API when a user clicks on a search result. To apply this change, update your `/packages/app/src/components/search/SearchPage.tsx` in the following way:
+
+ ```diff
+ // ...
+
+ {({ results }) => (
+
+ - {results.map(({ type, document, highlight }) => {
+ + {results.map(({ type, document, highlight, rank }) => {
+ switch (type) {
+ case 'software-catalog':
+ return (
+
+ );
+ case 'techdocs':
+ return (
+
+ );
+ default:
+ return (
+
+ );
+ }
+ })}
+
+ )}
+
+ // ...
+ ```
+
+ If you have implemented a custom Search Modal or other custom search experience, you will want to make similar changes in those components.
+
+- aaf7652084: Bump version of `cypress` in newly scaffolded Backstage Applications. To apply this change to your own instance, please make the following change to `packages/app/package.json` under `devDependencies`.
+
+ ```diff
+ - "cypress": "^7.3.0",
+ + "cypress": "^9.7.0",
+ ```
+
+- 141a1caebe: Updated the auth backend setup in the template to include a guest sign-in resolver in order to make it quicker to get up and running with a basic sign-in setup. There is no need to update existing apps to match this change, but in case you want to use the guest sign-in resolver you can find it at https://backstage.io/docs/auth/identity-resolver#guest-sign-in-resolver
+
+## 0.4.28-next.2
+
+### Patch Changes
+
+- aaf7652084: Bump version of `cypress` in newly scaffolded Backstage Applications. To apply this change to your own instance, please make the following change to `packages/app/package.json` under `devDependencies`.
+
+ ```diff
+ - "cypress": "^7.3.0",
+ + "cypress": "^9.7.0",
+ ```
+
+## 0.4.28-next.1
+
+### Patch Changes
+
+- bff65e6958: Use of `SidebarContext` has been deprecated and will be removed in a future release. Instead, `useSidebarOpenState()` should be used to consume the context and `` should be used to provide it.
+
+ To prepare your app, update `packages/app/src/components/Root/Root.tsx` as follows:
+
+ ```diff
+ import {
+ Sidebar,
+ sidebarConfig,
+ - SidebarContext
+ SidebarDivider,
+ // ...
+ SidebarSpace,
+ + useSidebarOpenState,
+ } from '@backstage/core-components';
+
+ // ...
+
+ const SidebarLogo = () => {
+ const classes = useSidebarLogoStyles();
+ - const { isOpen } = useContext(SidebarContext);
+ + const { isOpen } = useSidebarOpenState();
+
+ // ...
+ };
+ ```
+
+## 0.4.28-next.0
+
+### Patch Changes
+
+- 881fbd7e8d: Register `TechDocs` addons on catalog entity pages, follow the steps below to add them manually:
+
+ ```diff
+ // packages/app/src/components/catalog/EntityPage.tsx
+
+ + import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
+ + import {
+ + ReportIssue,
+ + } from '@backstage/plugin-techdocs-module-addons-contrib';
+
+ + const techdocsContent = (
+ +
+ +
+ +
+ +
+ +
+ + );
+
+ const defaultEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+
+ const serviceEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+
+ const websiteEntityPage = (
+ ...
+
+ + {techdocsContent}
+
+ ...
+ );
+ ```
+
+- 935d8515da: Updated the `--version` flag to output the version of the current backstage release instead of the version of create-app.
+- 1f70704580: Accessibility updates:
+
+ - Added `aria-label` to the sidebar Logo link. To enable this for an existing app, please make the following changes:
+
+ `packages/app/src/components/Root/Root.tsx`
+
+ ```diff
+ const SidebarLogo = () => {
+ const classes = useSidebarLogoStyles();
+ const { isOpen } = useContext(SidebarContext);
+
+ return (
+
+
+ {isOpen ? : }
+
+
+ );
+ };
+ ```
+
## 0.4.27
### Patch Changes
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index 2fe8398309..bca9fe9b68 100644
--- a/packages/create-app/package.json
+++ b/packages/create-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
- "version": "0.4.27",
+ "version": "0.4.28",
"private": false,
"publishConfig": {
"access": "public"
@@ -50,54 +50,6 @@
"mock-fs": "^5.1.1",
"ts-node": "^10.0.0"
},
- "peerDependencies": {
- "@backstage/app-defaults": "",
- "@backstage/backend-common": "",
- "@backstage/backend-tasks": "",
- "@backstage/catalog-client": "",
- "@backstage/catalog-model": "",
- "@backstage/cli": "",
- "@backstage/config": "",
- "@backstage/core-app-api": "",
- "@backstage/core-components": "",
- "@backstage/core-plugin-api": "",
- "@backstage/errors": "",
- "@backstage/integration-react": "",
- "@backstage/plugin-api-docs": "",
- "@backstage/plugin-app-backend": "",
- "@backstage/plugin-auth-backend": "",
- "@backstage/plugin-catalog": "",
- "@backstage/plugin-catalog-backend": "",
- "@backstage/plugin-catalog-common": "",
- "@backstage/plugin-catalog-graph": "",
- "@backstage/plugin-catalog-import": "",
- "@backstage/plugin-catalog-react": "",
- "@backstage/plugin-circleci": "",
- "@backstage/plugin-explore": "",
- "@backstage/plugin-github-actions": "",
- "@backstage/plugin-lighthouse": "",
- "@backstage/plugin-org": "",
- "@backstage/plugin-permission-common": "",
- "@backstage/plugin-permission-node": "",
- "@backstage/plugin-permission-react": "",
- "@backstage/plugin-proxy-backend": "",
- "@backstage/plugin-rollbar-backend": "",
- "@backstage/plugin-scaffolder": "",
- "@backstage/plugin-scaffolder-backend": "",
- "@backstage/plugin-search": "",
- "@backstage/plugin-search-react": "",
- "@backstage/plugin-search-backend": "",
- "@backstage/plugin-search-backend-module-pg": "",
- "@backstage/plugin-search-backend-node": "",
- "@backstage/plugin-tech-radar": "",
- "@backstage/plugin-techdocs": "",
- "@backstage/plugin-techdocs-react": "",
- "@backstage/plugin-techdocs-module-addons-contrib": "",
- "@backstage/plugin-techdocs-backend": "",
- "@backstage/plugin-user-settings": "",
- "@backstage/test-utils": "",
- "@backstage/theme": ""
- },
"nodemonConfig": {
"watch": "./src",
"exec": "bin/backstage-create-app",
diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts
index 25007d7535..78b28b5811 100644
--- a/packages/create-app/src/lib/versions.ts
+++ b/packages/create-app/src/lib/versions.ts
@@ -20,9 +20,8 @@
This is a list of all packages used by the template. If dependencies are added or removed,
this list should be updated as well.
-The list, and the accompanying peerDependencies entries, are here to ensure correct versioning
-and bumping of this package. Without this list the version would not be bumped unless we
-manually trigger a release.
+There is a release step that ensures that this package is always bumped with every
+release, meaning these version will always be up to date.
This does not create an actual dependency on these packages and does not bring in any code.
Relative imports are used rather than package imports to make sure the packages aren't externalized.
diff --git a/packages/create-app/templates/default-app/app-config.production.yaml b/packages/create-app/templates/default-app/app-config.production.yaml
index b9dd00bb01..6535d967d5 100644
--- a/packages/create-app/templates/default-app/app-config.production.yaml
+++ b/packages/create-app/templates/default-app/app-config.production.yaml
@@ -32,3 +32,9 @@ backend:
# ssl:
# ca: # if you have a CA file and want to verify it you can uncomment this section
# $file: /ca/server.crt
+
+catalog:
+ # Overrides the default list locations from app-config.yaml as these contain example data.
+ # See https://backstage.io/docs/features/software-catalog/software-catalog-overview#adding-components-to-the-catalog for more details
+ # on how to get entities into the catalog.
+ locations: []
diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs
index d4cf4fb5fe..47fb0d622f 100644
--- a/packages/create-app/templates/default-app/package.json.hbs
+++ b/packages/create-app/templates/default-app/package.json.hbs
@@ -35,7 +35,8 @@
"concurrently": "^6.0.0",
"lerna": "^4.0.0",
"prettier": "^2.3.2",
- "typescript": "~4.6.4"
+ "typescript": "~4.6.4",
+ "node-gyp": "^9.0.0"
},
"resolutions": {
"@types/react": "^17",
diff --git a/packages/create-app/templates/default-app/packages/app/cypress.json b/packages/create-app/templates/default-app/packages/app/cypress.json
index 5de7ebffea..0cb845a86d 100644
--- a/packages/create-app/templates/default-app/packages/app/cypress.json
+++ b/packages/create-app/templates/default-app/packages/app/cypress.json
@@ -1,5 +1,6 @@
{
"baseUrl": "http://localhost:3001",
"fixturesFolder": false,
- "pluginsFile": false
+ "pluginsFile": false,
+ "retries": 3
}
diff --git a/packages/create-app/templates/default-app/packages/app/package.json.hbs b/packages/create-app/templates/default-app/packages/app/package.json.hbs
index 9bf67f6e52..d3ba938960 100644
--- a/packages/create-app/templates/default-app/packages/app/package.json.hbs
+++ b/packages/create-app/templates/default-app/packages/app/package.json.hbs
@@ -50,7 +50,7 @@
"@types/node": "^14.14.32",
"@types/react-dom": "*",
"cross-env": "^7.0.0",
- "cypress": "^7.3.0",
+ "cypress": "^9.7.0",
"eslint-plugin-cypress": "^2.10.3",
"start-server-and-test": "^1.10.11"
},
@@ -63,7 +63,7 @@
"test:e2e": "cross-env PORT=3001 start-server-and-test start http://localhost:3001 cy:dev",
"test:e2e:ci": "cross-env PORT=3001 start-server-and-test start http://localhost:3001 cy:run",
"cy:dev": "cypress open",
- "cy:run": "cypress run"
+ "cy:run": "cypress run --browser chrome"
},
"browserslist": {
"production": [
diff --git a/packages/create-app/templates/default-app/packages/app/src/components/Root/Root.tsx b/packages/create-app/templates/default-app/packages/app/src/components/Root/Root.tsx
index d10eccf03a..b1164a32f0 100644
--- a/packages/create-app/templates/default-app/packages/app/src/components/Root/Root.tsx
+++ b/packages/create-app/templates/default-app/packages/app/src/components/Root/Root.tsx
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import React, { useContext, PropsWithChildren } from 'react';
+import React, { PropsWithChildren } from 'react';
import { Link, makeStyles } from '@material-ui/core';
import HomeIcon from '@material-ui/icons/Home';
import ExtensionIcon from '@material-ui/icons/Extension';
@@ -32,13 +32,13 @@ import { SidebarSearchModal } from '@backstage/plugin-search';
import {
Sidebar,
sidebarConfig,
- SidebarContext,
SidebarDivider,
SidebarGroup,
SidebarItem,
SidebarPage,
SidebarScrollWrapper,
SidebarSpace,
+ useSidebarOpenState,
} from '@backstage/core-components';
import MenuIcon from '@material-ui/icons/Menu';
import SearchIcon from '@material-ui/icons/Search';
@@ -60,7 +60,7 @@ const useSidebarLogoStyles = makeStyles({
const SidebarLogo = () => {
const classes = useSidebarLogoStyles();
- const { isOpen } = useContext(SidebarContext);
+ const { isOpen } = useSidebarOpenState();
return (
diff --git a/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx b/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx
index 84d094410b..6ec4da055d 100644
--- a/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx
+++ b/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx
@@ -68,6 +68,17 @@ import {
RELATION_PROVIDES_API,
} from '@backstage/catalog-model';
+import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
+import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib';
+
+const techdocsContent = (
+
+
+
+
+
+);
+
const cicdContent = (
// This is an example of how you can implement your company's logic in entity page.
// You can for example enforce that all components of type 'service' should use GitHubActions
@@ -167,7 +178,7 @@ const serviceEntityPage = (
-
+ {techdocsContent}
);
@@ -194,7 +205,7 @@ const websiteEntityPage = (
-
+ {techdocsContent}
);
@@ -213,7 +224,7 @@ const defaultEntityPage = (
-
+ {techdocsContent}
);
diff --git a/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx b/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx
index d4c7c92346..928b8201ea 100644
--- a/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx
+++ b/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx
@@ -8,14 +8,14 @@ import {
} from '@backstage/plugin-catalog-react';
import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs';
+import { SearchType } from '@backstage/plugin-search';
import {
+ DefaultResultListItem,
SearchBar,
SearchFilter,
SearchResult,
- SearchType,
- DefaultResultListItem,
-} from '@backstage/plugin-search';
-import { useSearch } from '@backstage/plugin-search-react';
+ useSearch,
+} from '@backstage/plugin-search-react';
import {
CatalogIcon,
Content,
@@ -112,7 +112,7 @@ const SearchPage = () => {
{({ results }) => (
- {results.map(({ type, document, highlight }) => {
+ {results.map(({ type, document, highlight, rank }) => {
switch (type) {
case 'software-catalog':
return (
@@ -120,6 +120,7 @@ const SearchPage = () => {
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
case 'techdocs':
@@ -128,6 +129,7 @@ const SearchPage = () => {
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
default:
@@ -136,6 +138,7 @@ const SearchPage = () => {
key={document.location}
result={document}
highlight={highlight}
+ rank={rank}
/>
);
}
diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts
index 13f18c55e9..159116d7b8 100644
--- a/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts
+++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts
@@ -18,18 +18,36 @@ export default async function createPlugin(
providerFactories: {
...defaultAuthProviderFactories,
- // This overrides the default GitHub auth provider with a custom one.
- // Since the options are empty it will behave just like the default
- // provider, but if you uncomment the `signIn` section you will enable
- // sign-in via GitHub. This particular configuration uses a resolver
- // that matches the username to the user entity name. See the auth
- // documentation for more details on how to enable and customize sign-in:
+ // This replaces the default GitHub auth provider with a customized one.
+ // The `signIn` option enables sign-in for this provider, using the
+ // identity resolution logic that's provided in the `resolver` callback.
+ //
+ // This particular resolver makes all users share a single "guest" identity.
+ // It should only be used for testing and trying out Backstage.
+ //
+ // If you want to use a production ready resolver you can switch to the
+ // the one that is commented out below, it looks up a user entity in the
+ // catalog using the GitHub username of the authenticated user.
+ // That resolver requires you to have user entities populated in the catalog,
+ // for example using https://backstage.io/docs/integrations/github/org
+ //
+ // There are other resolvers to choose from, and you can also create
+ // your own, see the auth documentation for more details:
//
// https://backstage.io/docs/auth/identity-resolver
github: providers.github.create({
- // signIn: {
- // resolver: providers.github.resolvers.usernameMatchingUserEntityName(),
- // },
+ signIn: {
+ resolver(_, ctx) {
+ const userRef = 'user:default/guest'; // Must be a full entity reference
+ return ctx.issueToken({
+ claims: {
+ sub: userRef, // The user's own identity
+ ent: [userRef], // A list of identities that the user claims ownership through
+ },
+ });
+ },
+ // resolver: providers.github.resolvers.usernameMatchingUserEntityName(),
+ },
}),
},
});
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index 3463c378fe..563de9fc44 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,5 +1,43 @@
# @backstage/dev-utils
+## 1.0.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/test-utils@1.1.1
+ - @backstage/catalog-model@1.0.3
+ - @backstage/app-defaults@1.0.3
+
+## 1.0.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/test-utils@1.1.1-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/app-defaults@1.0.3-next.1
+
+## 1.0.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/app-defaults@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
## 1.0.2
### Patch Changes
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index 8ced35c07c..2da041d9b7 100644
--- a/packages/dev-utils/package.json
+++ b/packages/dev-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/dev-utils",
"description": "Utilities for developing Backstage plugins.",
- "version": "1.0.2",
+ "version": "1.0.3",
"private": false,
"publishConfig": {
"access": "public",
@@ -33,14 +33,14 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/app-defaults": "^1.0.2",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/catalog-model": "^1.0.2",
- "@backstage/integration-react": "^1.1.0",
- "@backstage/plugin-catalog-react": "^1.1.0",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/app-defaults": "^1.0.3",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/catalog-model": "^1.0.3",
+ "@backstage/integration-react": "^1.1.1",
+ "@backstage/plugin-catalog-react": "^1.1.1",
+ "@backstage/test-utils": "^1.1.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -59,7 +59,7 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/jest": "^26.0.7",
"@types/node": "^16.0.0"
},
diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts
index e1477d98d7..d324aeafaf 100644
--- a/packages/e2e-test/src/commands/run.ts
+++ b/packages/e2e-test/src/commands/run.ts
@@ -235,6 +235,18 @@ async function createApp(
print('Rewriting module resolutions of app to use workspace packages');
await overrideModuleResolutions(appDir, workspaceDir);
+ // Yarn does not clean up node_module folders in the linked in dependencies by itself
+ print('Cleaning up node_modules in workspace');
+ await fs.remove(resolvePath(workspaceDir, 'node_modules'));
+ for (const wsDir of ['packages', 'plugins']) {
+ for (const dir of await fs.readdir(resolvePath(workspaceDir, wsDir))) {
+ const moduleDir = resolvePath(workspaceDir, wsDir, dir, 'node_modules');
+ if (await fs.pathExists(moduleDir)) {
+ await fs.remove(moduleDir);
+ }
+ }
+ }
+
print('Pinning yarn version and registry in app');
await pinYarnVersion(appDir);
await fs.writeFile(
diff --git a/packages/errors/package.json b/packages/errors/package.json
index f37c103f37..8327246224 100644
--- a/packages/errors/package.json
+++ b/packages/errors/package.json
@@ -38,7 +38,7 @@
"serialize-error": "^8.0.1"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.2-next.0",
"@types/jest": "^26.0.7"
},
"files": [
diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md
index baa0318529..d03553f50d 100644
--- a/packages/integration-react/CHANGELOG.md
+++ b/packages/integration-react/CHANGELOG.md
@@ -1,5 +1,33 @@
# @backstage/integration-react
+## 1.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5
+ - @backstage/integration@1.2.1
+ - @backstage/core-plugin-api@1.0.3
+
+## 1.1.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+
+## 1.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration@1.2.1-next.0
+
## 1.1.0
### Minor Changes
diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json
index 34790174d0..580b91509f 100644
--- a/packages/integration-react/package.json
+++ b/packages/integration-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/integration-react",
"description": "Frontend package for managing integrations towards external systems",
- "version": "1.1.0",
+ "version": "1.1.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,9 +25,9 @@
},
"dependencies": {
"@backstage/config": "^1.0.1",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/integration": "^1.2.0",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/integration": "^1.2.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -38,15 +38,15 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/dev-utils": "^1.0.2",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/dev-utils": "^1.0.3",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
"@types/jest": "^26.0.7",
"@types/node": "^16.11.26",
- "msw": "^0.35.0",
+ "msw": "^0.42.0",
"cross-fetch": "^3.1.5"
},
"files": [
diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md
index fa4999f57c..736d9ff2a1 100644
--- a/packages/integration/CHANGELOG.md
+++ b/packages/integration/CHANGELOG.md
@@ -1,5 +1,31 @@
# @backstage/integration
+## 1.2.1
+
+### Patch Changes
+
+- 72dfcbc8bf: Gerrit Integration: Handle absolute paths in `resolveUrl` properly.
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- e37c71b5a4: Updated to support deployments of Azure DevOps Server under TFS or similar sub path
+
+## 1.2.1-next.2
+
+### Patch Changes
+
+- e37c71b5a4: Updated to support deployments of Azure DevOps Server under TFS or similar sub path
+
+## 1.2.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## 1.2.1-next.0
+
+### Patch Changes
+
+- 72dfcbc8bf: Gerrit Integration: Handle absolute paths in `resolveUrl` properly.
+
## 1.2.0
### Minor Changes
diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts
index c14f5c76cd..22acc5cd70 100644
--- a/packages/integration/config.d.ts
+++ b/packages/integration/config.d.ts
@@ -15,7 +15,10 @@
*/
export interface Config {
- /** Configuration for integrations towards various external repository provider systems */
+ /**
+ * Configuration for integrations towards various external repository provider systems
+ * @visibility frontend
+ */
integrations?: {
/** Integration configuration for Azure */
azure?: Array<{
diff --git a/packages/integration/package.json b/packages/integration/package.json
index ae91c4ca2f..06faef890d 100644
--- a/packages/integration/package.json
+++ b/packages/integration/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/integration",
"description": "Helpers for managing integrations towards external systems",
- "version": "1.2.0",
+ "version": "1.2.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -43,12 +43,12 @@
"lodash": "^4.17.21"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/config-loader": "^1.1.1",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/config-loader": "^1.1.2",
+ "@backstage/test-utils": "^1.1.1",
"@types/jest": "^26.0.7",
"@types/luxon": "^2.0.4",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist",
diff --git a/packages/integration/src/azure/AzureUrl.test.ts b/packages/integration/src/azure/AzureUrl.test.ts
index 2f22dd13da..a56f800133 100644
--- a/packages/integration/src/azure/AzureUrl.test.ts
+++ b/packages/integration/src/azure/AzureUrl.test.ts
@@ -142,6 +142,30 @@ describe('AzureUrl', () => {
);
});
+ it('should work with the old tfs long URL', () => {
+ const url = AzureUrl.fromRepoUrl(
+ 'http://my-host/tfs/projects/my-project/_git/my-repo',
+ );
+
+ expect(url.getOwner()).toBe('tfs/projects');
+ expect(url.getProject()).toBe('my-project');
+ expect(url.getRepo()).toBe('my-repo');
+ expect(url.getRef()).toBeUndefined();
+ expect(url.getPath()).toBeUndefined();
+ });
+
+ it('should work with the old tfs long URL form with a path and ref', () => {
+ const url = AzureUrl.fromRepoUrl(
+ 'http://my-host/tfs/projects/my-project/_git/my-repo?path=%2Ffolder&version=GBtest-branch',
+ );
+
+ expect(url.getOwner()).toBe('tfs/projects');
+ expect(url.getProject()).toBe('my-project');
+ expect(url.getRepo()).toBe('my-repo');
+ expect(url.getRef()).toBe('test-branch');
+ expect(url.getPath()).toBe('/folder');
+ });
+
it('should reject non-branch refs', () => {
expect(() =>
AzureUrl.fromRepoUrl(
diff --git a/packages/integration/src/azure/AzureUrl.ts b/packages/integration/src/azure/AzureUrl.ts
index 76de8550ed..1161ab7a1b 100644
--- a/packages/integration/src/azure/AzureUrl.ts
+++ b/packages/integration/src/azure/AzureUrl.ts
@@ -37,6 +37,10 @@ export class AzureUrl {
owner = parts[1];
project = parts[2];
repo = parts[4];
+ } else if (parts[4] === '_git') {
+ owner = `${parts[1]}/${parts[2]}`;
+ project = parts[3];
+ repo = parts[5];
}
if (!owner || !project || !repo) {
diff --git a/packages/integration/src/gerrit/GerritIntegration.test.ts b/packages/integration/src/gerrit/GerritIntegration.test.ts
index 6b5e228bb6..1a7bac5be6 100644
--- a/packages/integration/src/gerrit/GerritIntegration.test.ts
+++ b/packages/integration/src/gerrit/GerritIntegration.test.ts
@@ -97,6 +97,24 @@ describe('GerritIntegration', () => {
});
});
+ describe('resolves with an absolute url', () => {
+ it('works for valid urls', () => {
+ const integration = new GerritIntegration({
+ host: 'gerrit-review.example.com',
+ gitilesBaseUrl: 'https://gerrit-review.example.com/gitiles',
+ } as any);
+
+ expect(
+ integration.resolveUrl({
+ url: '/catalog-info.yaml',
+ base: 'https://gerrit-review.example.com/gitiles/repo/+/refs/heads/master/',
+ }),
+ ).toBe(
+ 'https://gerrit-review.example.com/gitiles/repo/+/refs/heads/master/catalog-info.yaml',
+ );
+ });
+ });
+
it('resolve edit URL', () => {
const integration = new GerritIntegration({
host: 'gerrit-review.example.com',
diff --git a/packages/integration/src/gerrit/GerritIntegration.ts b/packages/integration/src/gerrit/GerritIntegration.ts
index 97eb9372c0..d57b54df8e 100644
--- a/packages/integration/src/gerrit/GerritIntegration.ts
+++ b/packages/integration/src/gerrit/GerritIntegration.ts
@@ -20,6 +20,7 @@ import {
GerritIntegrationConfig,
readGerritIntegrationConfigs,
} from './config';
+import { parseGerritGitilesUrl, builldGerritGitilesUrl } from './core';
/**
* A Gerrit based integration.
@@ -58,6 +59,10 @@ export class GerritIntegration implements ScmIntegration {
}): string {
const { url, base, lineNumber } = options;
let updated;
+ if (url.startsWith('/')) {
+ const { branch, project } = parseGerritGitilesUrl(this.config, base);
+ return builldGerritGitilesUrl(this.config, project, branch, url);
+ }
if (url) {
updated = new URL(url, base);
} else {
diff --git a/packages/integration/src/gerrit/core.test.ts b/packages/integration/src/gerrit/core.test.ts
index 84bc1c0c19..351e7ce58e 100644
--- a/packages/integration/src/gerrit/core.test.ts
+++ b/packages/integration/src/gerrit/core.test.ts
@@ -20,6 +20,7 @@ import fetch from 'cross-fetch';
import { setupRequestMockHandlers } from '@backstage/test-utils';
import { GerritIntegrationConfig } from './config';
import {
+ builldGerritGitilesUrl,
getGerritBranchApiUrl,
getGerritCloneRepoUrl,
getGerritRequestOptions,
@@ -32,6 +33,20 @@ describe('gerrit core', () => {
const worker = setupServer();
setupRequestMockHandlers(worker);
+ describe('builldGerritGitilesUrl', () => {
+ it('can create an url from arguments', () => {
+ const config: GerritIntegrationConfig = {
+ host: 'gerrit.com',
+ gitilesBaseUrl: 'https://gerrit.com/gitiles',
+ };
+ expect(
+ builldGerritGitilesUrl(config, 'repo', 'dev', 'catalog-info.yaml'),
+ ).toEqual(
+ 'https://gerrit.com/gitiles/repo/+/refs/heads/dev/catalog-info.yaml',
+ );
+ });
+ });
+
describe('getGerritRequestOptions', () => {
it('adds headers when a password is specified', () => {
const authRequest: GerritIntegrationConfig = {
diff --git a/packages/integration/src/gerrit/core.ts b/packages/integration/src/gerrit/core.ts
index eb413a2608..cd2b919e09 100644
--- a/packages/integration/src/gerrit/core.ts
+++ b/packages/integration/src/gerrit/core.ts
@@ -70,6 +70,26 @@ export function parseGerritGitilesUrl(
};
}
+/**
+ * Build a Gerrit Gitiles url that targets a specific path.
+ *
+ * @param config - A Gerrit provider config.
+ * @param project - The name of the git project
+ * @param branch - The branch we will target.
+ * @param filePath - The absolute file path.
+ * @public
+ */
+export function builldGerritGitilesUrl(
+ config: GerritIntegrationConfig,
+ project: string,
+ branch: string,
+ filePath: string,
+): string {
+ return `${
+ config.gitilesBaseUrl
+ }/${project}/+/refs/heads/${branch}/${trimStart(filePath, '/')}`;
+}
+
/**
* Return the authentication prefix.
*
diff --git a/packages/release-manifests/CHANGELOG.md b/packages/release-manifests/CHANGELOG.md
index 017a50bd6c..279128576c 100644
--- a/packages/release-manifests/CHANGELOG.md
+++ b/packages/release-manifests/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/release-manifests
+## 0.0.4
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
+## 0.0.4-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+
## 0.0.3
### Patch Changes
diff --git a/packages/release-manifests/package.json b/packages/release-manifests/package.json
index ef968e7a2d..f0627a9c95 100644
--- a/packages/release-manifests/package.json
+++ b/packages/release-manifests/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/release-manifests",
"description": "Helper library for receiving release manifests",
- "version": "0.0.3",
+ "version": "0.0.4",
"private": false,
"main": "src/index.ts",
"types": "src/index.ts",
@@ -36,8 +36,8 @@
"cross-fetch": "^3.1.5"
},
"devDependencies": {
- "@backstage/test-utils": "^1.1.0",
- "msw": "^0.35.0",
+ "@backstage/test-utils": "^1.1.1",
+ "msw": "^0.42.0",
"@types/jest": "^26.0.7",
"@types/node": "^16.0.0"
},
diff --git a/packages/release-manifests/src/manifest.test.ts b/packages/release-manifests/src/manifest.test.ts
index 70894e5431..272555df70 100644
--- a/packages/release-manifests/src/manifest.test.ts
+++ b/packages/release-manifests/src/manifest.test.ts
@@ -14,73 +14,75 @@
* limitations under the License.
*/
-import { setupRequestMockHandlers } from '@backstage/test-utils';
-import { getManifestByReleaseLine, getManifestByVersion } from './manifest';
import { setupServer } from 'msw/node';
import { rest } from 'msw';
+import { setupRequestMockHandlers } from '@backstage/test-utils';
+import { getManifestByReleaseLine, getManifestByVersion } from './manifest';
-describe('getManifestByVersion', () => {
+describe('Release Manifests', () => {
const worker = setupServer();
setupRequestMockHandlers(worker);
- it('should return a list of packages in a release', async () => {
- worker.use(
- rest.get('*/v1/releases/0.0.0/manifest.json', (_, res, ctx) =>
- res(
- ctx.status(200),
- ctx.json({
- packages: [{ name: '@backstage/core', version: '1.2.3' }],
- }),
+ describe('getManifestByVersion', () => {
+ it('should return a list of packages in a release', async () => {
+ worker.use(
+ rest.get('*/v1/releases/0.0.0/manifest.json', (_, res, ctx) =>
+ res(
+ ctx.status(200),
+ ctx.json({
+ packages: [{ name: '@backstage/core', version: '1.2.3' }],
+ }),
+ ),
),
- ),
- rest.get('*/v1/releases/999.0.1/manifest.json', (_, res, ctx) =>
- res(ctx.status(404), ctx.json({})),
- ),
- );
+ rest.get('*/v1/releases/999.0.1/manifest.json', (_, res, ctx) =>
+ res(ctx.status(404), ctx.json({})),
+ ),
+ );
- const pkgs = await getManifestByVersion({ version: '0.0.0' });
- expect(pkgs.packages).toEqual([
- {
- name: '@backstage/core',
- version: '1.2.3',
- },
- ]);
+ const pkgs = await getManifestByVersion({ version: '0.0.0' });
+ expect(pkgs.packages).toEqual([
+ {
+ name: '@backstage/core',
+ version: '1.2.3',
+ },
+ ]);
- await expect(getManifestByVersion({ version: '999.0.1' })).rejects.toThrow(
- 'No release found for 999.0.1 version',
- );
- });
-});
-
-describe('getManifestByReleaseLine', () => {
- const worker = setupServer();
- setupRequestMockHandlers(worker);
-
- it('should return a list of packages in a release', async () => {
- worker.use(
- rest.get('*/v1/tags/main/manifest.json', (_, res, ctx) =>
- res(
- ctx.status(200),
- ctx.json({
- packages: [{ name: '@backstage/core', version: '1.2.3' }],
- }),
- ),
- ),
- rest.get('*/v1/tags/foo/manifest.json', (_, res, ctx) =>
- res(ctx.status(404), ctx.json({})),
- ),
- );
-
- const pkgs = await getManifestByReleaseLine({ releaseLine: 'main' });
- expect(pkgs.packages).toEqual([
- {
- name: '@backstage/core',
- version: '1.2.3',
- },
- ]);
-
- await expect(
- getManifestByReleaseLine({ releaseLine: 'foo' }),
- ).rejects.toThrow("No 'foo' release line found");
+ await expect(
+ getManifestByVersion({ version: '999.0.1' }),
+ ).rejects.toThrow('No release found for 999.0.1 version');
+ });
+ });
+
+ describe('getManifestByReleaseLine', () => {
+ it('should return a list of packages in a release', async () => {
+ worker.use(
+ rest.get(
+ 'https://versions.backstage.io/v1/tags/main/manifest.json',
+ (_, res, ctx) =>
+ res(
+ ctx.status(200),
+ ctx.json({
+ packages: [{ name: '@backstage/core', version: '1.2.3' }],
+ }),
+ ),
+ ),
+ rest.get(
+ 'https://versions.backstage.io/v1/tags/foo/manifest.json',
+ (_, res, ctx) => res(ctx.status(404), ctx.json({})),
+ ),
+ );
+
+ const pkgs = await getManifestByReleaseLine({ releaseLine: 'main' });
+ expect(pkgs.packages).toEqual([
+ {
+ name: '@backstage/core',
+ version: '1.2.3',
+ },
+ ]);
+
+ await expect(
+ getManifestByReleaseLine({ releaseLine: 'foo' }),
+ ).rejects.toThrow("No 'foo' release line found");
+ });
});
});
diff --git a/packages/search-common/CHANGELOG.md b/packages/search-common/CHANGELOG.md
deleted file mode 100644
index 2a757c1909..0000000000
--- a/packages/search-common/CHANGELOG.md
+++ /dev/null
@@ -1,213 +0,0 @@
-# @backstage/search-common
-
-## 0.3.4
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-search-common@0.3.4
-
-## 0.3.4-next.0
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-search-common@0.3.4-next.0
-
-## 0.3.3
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-search-common@0.3.3
-
-## 0.3.3-next.1
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-search-common@0.3.3-next.1
-
-## 0.3.3-next.0
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-search-common@0.3.3-next.0
-
-## 0.3.2
-
-### Patch Changes
-
-- 82b0190155: This package is no longer maintained. Use `@backstage/plugin-search-common`, going forward.
-- Updated dependencies
- - @backstage/plugin-search-common@0.3.2
-
-## 0.3.1
-
-### Patch Changes
-
-- d52155466a: **DEPRECATION**
-
- The `@backstage/search-common` package is being renamed `@backstage/plugin-search-common`. We may continue to publish changes to `@backstage/search-common` for a time, but will stop doing so in the near future. If you depend on this package, you should update your dependencies to point at the renamed package.
-
-- Updated dependencies
- - @backstage/plugin-search-common@0.3.1
-
-## 0.3.1-next.0
-
-### Patch Changes
-
-- d52155466a: **DEPRECATION**
-
- The `@backstage/search-common` package is being renamed `@backstage/plugin-search-common`. We may continue to publish changes to `@backstage/search-common` for a time, but will stop doing so in the near future. If you depend on this package, you should update your dependencies to point at the renamed package.
-
-- Updated dependencies
- - @backstage/plugin-search-common@0.3.1-next.0
-
-## 0.3.0
-
-### Minor Changes
-
-- 022507c860: **BREAKING**
-
- The Backstage Search Platform's indexing process has been rewritten as a stream
- pipeline in order to improve efficiency and performance on large document sets.
-
- The concepts of `Collator` and `Decorator` have been replaced with readable and
- transform object streams (respectively), as well as factory classes to
- instantiate them. Accordingly, the `SearchEngine.index()` method has also been
- replaced with a `getIndexer()` factory method that resolves to a writable
- object stream.
-
- Check [this upgrade guide](https://backstage.io/docs/features/search/how-to-guides#how-to-migrate-from-search-alpha-to-beta)
- for further details.
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-permission-common@0.5.2
-
-## 0.2.4
-
-### Patch Changes
-
-- Fix for the previous release with missing type declarations.
-- Updated dependencies
- - @backstage/types@0.1.3
- - @backstage/plugin-permission-common@0.5.1
-
-## 0.2.3
-
-### Patch Changes
-
-- c77c5c7eb6: Added `backstage.role` to `package.json`
-- Updated dependencies
- - @backstage/plugin-permission-common@0.5.0
- - @backstage/types@0.1.2
-
-## 0.2.2
-
-### Patch Changes
-
-- 9a511968b1: - Add optional visibilityPermission property to DocumentCollator type
- - Add new DocumentTypeInfo type for housing information about the document types stored in a search engine.
-- b2e918fa0b: Add optional resourceRef field to the IndexableDocument type for use when authorizing access to documents.
-- 96cbebc629: Add optional query request options containing authorization token to SearchEngine#query.
-
-## 0.2.1
-
-### Patch Changes
-
-- 10615525f3: Switch to use the json and observable types from `@backstage/types`
-
-## 0.2.0
-
-### Minor Changes
-
-- a13f21cdc: Implement optional `pageCursor` based paging in search.
-
- To use paging in your app, add a ` ` to your
- `SearchPage.tsx`.
-
-## 0.1.3
-
-### Patch Changes
-
-- d9c13d535: Implements configuration and indexing functionality for ElasticSearch search engine. Adds indexing, searching and default translator for ElasticSearch and modifies default backend example-app to use ES if it is configured.
-
- ## Example configurations:
-
- ### AWS
-
- Using AWS hosted ElasticSearch the only configuration options needed is the URL to the ElasticSearch service. The implementation assumes
- that environment variables for AWS access key id and secret access key are defined in accordance to the [default AWS credential chain.](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html).
-
- ```yaml
- search:
- elasticsearch:
- provider: aws
- node: https://my-backstage-search-asdfqwerty.eu-west-1.es.amazonaws.com
- ```
-
- ### Elastic.co
-
- Elastic Cloud hosted ElasticSearch uses a Cloud ID to determine the instance of hosted ElasticSearch to connect to. Additionally, username and password needs to be provided either directly or using environment variables like defined in [Backstage documentation.](https://backstage.io/docs/conf/writing#includes-and-dynamic-data)
-
- ```yaml
- search:
- elasticsearch:
- provider: elastic
- cloudId: backstage-elastic:asdfqwertyasdfqwertyasdfqwertyasdfqwerty==
- auth:
- username: elastic
- password: changeme
- ```
-
- ### Others
-
- Other ElasticSearch instances can be connected to by using standard ElasticSearch authentication methods and exposed URL, provided that the cluster supports that. The configuration options needed are the URL to the node and authentication information. Authentication can be handled by either providing username/password or and API key or a bearer token. In case both username/password combination and one of the tokens are provided, token takes precedence. For more information how to create an API key, see [Elastic documentation on API keys](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html) and how to create a bearer token, see [Elastic documentation on tokens.](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-service-token.html)
-
- #### Configuration examples
-
- ##### With username and password
-
- ```yaml
- search:
- elasticsearch:
- node: http://localhost:9200
- auth:
- username: elastic
- password: changeme
- ```
-
- ##### With bearer token
-
- ```yaml
- search:
- elasticsearch:
- node: http://localhost:9200
- auth:
- bearer: token
- ```
-
- ##### With API key
-
- ```yaml
- search:
- elasticsearch:
- node: http://localhost:9200
- auth:
- apiKey: base64EncodedKey
- ```
-
-- Updated dependencies
- - @backstage/config@0.1.6
-
-## 0.1.2
-
-### Patch Changes
-
-- db1c8f93b: The ` set of components exported by the Search Plugin are now updated to use the Search Backend API. These will be made available as the default non-"next" versions in a follow-up release.
-
- The interfaces for decorators and collators in the Search Backend have also seen minor, breaking revisions ahead of a general release. If you happen to be building on top of these interfaces, check and update your implementations accordingly. The APIs will be considered more stable in a follow-up release.
diff --git a/packages/search-common/README.md b/packages/search-common/README.md
deleted file mode 100644
index 80b0c09c40..0000000000
--- a/packages/search-common/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# @backstage/search-common
-
-This package has been moved to `@backstage/plugin-search-common` and is no
-longer maintained. Please update any dependencies you have on this package
-accordingly.
diff --git a/packages/search-common/api-report.md b/packages/search-common/api-report.md
deleted file mode 100644
index 03965ace66..0000000000
--- a/packages/search-common/api-report.md
+++ /dev/null
@@ -1,9 +0,0 @@
-## API Report File for "@backstage/search-common"
-
-> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
-
-```ts
-export * from '@backstage/plugin-search-common';
-
-// (No @packageDocumentation comment for this package)
-```
diff --git a/packages/search-common/package.json b/packages/search-common/package.json
deleted file mode 100644
index 35e20d57ca..0000000000
--- a/packages/search-common/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "@backstage/search-common",
- "description": "No longer maintained. Use @backstage/plugin-search-common instead.",
- "version": "0.3.4",
- "main": "src/index.ts",
- "types": "src/index.ts",
- "private": false,
- "publishConfig": {
- "access": "public",
- "main": "dist/index.cjs.js",
- "types": "dist/index.d.ts"
- },
- "backstage": {
- "role": "common-library"
- },
- "homepage": "https://backstage.io",
- "repository": {
- "type": "git",
- "url": "https://github.com/backstage/backstage",
- "directory": "packages/search-common"
- },
- "license": "Apache-2.0",
- "files": [
- "dist"
- ],
- "scripts": {
- "build": "backstage-cli package build",
- "lint": "backstage-cli package lint",
- "test": "backstage-cli package test",
- "prepack": "backstage-cli package prepack",
- "postpack": "backstage-cli package postpack",
- "clean": "backstage-cli package clean"
- },
- "bugs": {
- "url": "https://github.com/backstage/backstage/issues"
- },
- "dependencies": {
- "@backstage/plugin-search-common": "0.3.4"
- },
- "devDependencies": {},
- "jest": {
- "roots": [
- ".."
- ]
- }
-}
diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md
index 9f749dc2ab..58102369ed 100644
--- a/packages/techdocs-cli-embedded-app/CHANGELOG.md
+++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md
@@ -1,5 +1,52 @@
# techdocs-cli-embedded-app
+## 0.2.71
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-techdocs@1.2.0
+ - @backstage/cli@0.17.2
+ - @backstage/core-components@0.9.5
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/test-utils@1.1.1
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-techdocs-react@1.0.1
+ - @backstage/app-defaults@1.0.3
+
+## 0.2.71-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/cli@0.17.2-next.1
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/test-utils@1.1.1-next.0
+ - @backstage/plugin-techdocs@1.1.2-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/app-defaults@1.0.3-next.1
+ - @backstage/plugin-techdocs-react@1.0.1-next.1
+
+## 0.2.71-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/cli@0.17.2-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/plugin-techdocs@1.1.2-next.0
+ - @backstage/plugin-techdocs-react@1.0.1-next.0
+ - @backstage/app-defaults@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.0
+
## 0.2.70
### Patch Changes
diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json
index d174cd0525..8029d604db 100644
--- a/packages/techdocs-cli-embedded-app/package.json
+++ b/packages/techdocs-cli-embedded-app/package.json
@@ -1,24 +1,24 @@
{
"name": "techdocs-cli-embedded-app",
- "version": "0.2.70",
+ "version": "0.2.71",
"private": true,
"backstage": {
"role": "frontend"
},
"bundled": true,
"dependencies": {
- "@backstage/app-defaults": "^1.0.2",
- "@backstage/catalog-model": "^1.0.2",
- "@backstage/cli": "^0.17.1",
+ "@backstage/app-defaults": "^1.0.3",
+ "@backstage/catalog-model": "^1.0.3",
+ "@backstage/cli": "^0.17.2",
"@backstage/config": "^1.0.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/integration-react": "^1.1.0",
- "@backstage/plugin-catalog": "^1.2.0",
- "@backstage/plugin-techdocs": "^1.1.1",
- "@backstage/plugin-techdocs-react": "^1.0.0",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/integration-react": "^1.1.1",
+ "@backstage/plugin-catalog": "^1.3.0",
+ "@backstage/plugin-techdocs": "^1.2.0",
+ "@backstage/plugin-techdocs-react": "^1.0.1",
+ "@backstage/test-utils": "^1.1.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -30,7 +30,7 @@
"react-use": "^17.2.4"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
@@ -38,7 +38,7 @@
"@types/node": "^16.11.26",
"@types/react-dom": "*",
"cross-env": "^7.0.0",
- "cypress": "^9.5.0",
+ "cypress": "^10.0.0",
"eslint-plugin-cypress": "^2.10.3",
"start-server-and-test": "^1.10.11"
},
diff --git a/packages/techdocs-cli-embedded-app/src/components/Root/Root.tsx b/packages/techdocs-cli-embedded-app/src/components/Root/Root.tsx
index 249394fdc4..cd8b5d35ed 100644
--- a/packages/techdocs-cli-embedded-app/src/components/Root/Root.tsx
+++ b/packages/techdocs-cli-embedded-app/src/components/Root/Root.tsx
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import React, { PropsWithChildren, useContext } from 'react';
+import React, { PropsWithChildren } from 'react';
import { Link, makeStyles } from '@material-ui/core';
import LibraryBooks from '@material-ui/icons/LibraryBooks';
@@ -27,7 +27,7 @@ import {
SidebarPage,
sidebarConfig,
SidebarDivider,
- SidebarContext,
+ useSidebarOpenState,
} from '@backstage/core-components';
import { NavLink } from 'react-router-dom';
@@ -48,7 +48,7 @@ const useSidebarLogoStyles = makeStyles({
const SidebarLogo = () => {
const classes = useSidebarLogoStyles();
- const { isOpen } = useContext(SidebarContext);
+ const { isOpen } = useSidebarOpenState();
return (
diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md
index 44c8b9a1d1..21eb2393b7 100644
--- a/packages/techdocs-cli/CHANGELOG.md
+++ b/packages/techdocs-cli/CHANGELOG.md
@@ -1,5 +1,43 @@
# @techdocs/cli
+## 1.1.2
+
+### Patch Changes
+
+- f96e98f4cd: Updated dependency `cypress` to `^10.0.0`.
+- bff65e6958: Updated sidebar-related logic to use `
` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()` from `@backstage/core-components`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-techdocs-node@1.1.2
+ - @backstage/catalog-model@1.0.3
+
+## 1.1.2-next.2
+
+### Patch Changes
+
+- f96e98f4cd: Updated dependency `cypress` to `^10.0.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-techdocs-node@1.1.2-next.2
+
+## 1.1.2-next.1
+
+### Patch Changes
+
+- bff65e6958: Updated sidebar-related logic to use `` + `useSidebarPinState()` and/or `` + `useSidebarOpenState()` from `@backstage/core-components`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-techdocs-node@1.1.2-next.1
+
+## 1.1.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-techdocs-node@1.1.2-next.0
+
## 1.1.1
### Patch Changes
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 2e8107aa35..d1db470572 100644
--- a/packages/techdocs-cli/package.json
+++ b/packages/techdocs-cli/package.json
@@ -1,7 +1,7 @@
{
"name": "@techdocs/cli",
"description": "Utility CLI for managing TechDocs sites in Backstage.",
- "version": "1.1.1",
+ "version": "1.1.2",
"private": false,
"publishConfig": {
"access": "public"
@@ -37,7 +37,7 @@
"techdocs-cli": "bin/techdocs-cli"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/commander": "^2.12.2",
"@types/fs-extra": "^9.0.6",
"@types/http-proxy": "^1.17.4",
@@ -45,7 +45,7 @@
"@types/node": "^16.11.26",
"@types/serve-handler": "^6.1.0",
"@types/webpack-env": "^1.15.3",
- "cypress": "^9.5.0",
+ "cypress": "^10.0.0",
"cypress-plugin-snapshots": "^1.4.4",
"find-process": "^1.4.5",
"nodemon": "^2.0.2",
@@ -62,11 +62,11 @@
"ext": "ts"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
- "@backstage/catalog-model": "^1.0.2",
+ "@backstage/backend-common": "^0.14.0",
+ "@backstage/catalog-model": "^1.0.3",
"@backstage/cli-common": "^0.1.9",
"@backstage/config": "^1.0.1",
- "@backstage/plugin-techdocs-node": "^1.1.1",
+ "@backstage/plugin-techdocs-node": "^1.1.2",
"@types/dockerode": "^3.3.0",
"commander": "^9.1.0",
"dockerode": "^3.3.1",
diff --git a/packages/techdocs-cli/src/commands/index.ts b/packages/techdocs-cli/src/commands/index.ts
index 85a218eb54..68e8f88c0b 100644
--- a/packages/techdocs-cli/src/commands/index.ts
+++ b/packages/techdocs-cli/src/commands/index.ts
@@ -38,7 +38,7 @@ export function registerCommands(program: Command) {
'The mkdocs docker container to use',
defaultDockerImage,
)
- .option('--no-pull', 'Do not pull the latest docker image', false)
+ .option('--no-pull', 'Do not pull the latest docker image')
.option(
'--no-docker',
'Do not use Docker, use MkDocs executable and plugins in current user environment.',
diff --git a/packages/techdocs-common/CHANGELOG.md b/packages/techdocs-common/CHANGELOG.md
deleted file mode 100644
index 5d930469fa..0000000000
--- a/packages/techdocs-common/CHANGELOG.md
+++ /dev/null
@@ -1,1144 +0,0 @@
-# @backstage/techdocs-common
-
-## 0.11.15
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@1.1.1
-
-## 0.11.15-next.1
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@1.1.1-next.1
-
-## 0.11.15-next.0
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@1.1.1-next.0
-
-## 0.11.14
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@1.1.0
-
-## 0.11.14-next.2
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@1.1.0-next.2
-
-## 0.11.14-next.1
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@1.0.1-next.1
-
-## 0.11.14-next.0
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@1.0.1-next.0
-
-## 0.11.13
-
-### Patch Changes
-
-- 82b0190155: This package is no longer maintained. Use `@backstage/plugin-techdocs-node`, going forward.
-- Updated dependencies
- - @backstage/plugin-techdocs-node@1.0.0
-
-## 0.11.12
-
-### Patch Changes
-
-- cea6f10b97: **DEPRECATION**
-
- The `@backstage/techdocs-common` package is being renamed `@backstage/plugin-techdocs-node`. We may continue to publish changes to `@backstage/techdocs-common` for a time, but will stop doing so in the near future. If you depend on this package, you should update your dependencies to point at the renamed package.
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@0.11.12
-
-## 0.11.12-next.0
-
-### Patch Changes
-
-- cea6f10b97: **DEPRECATION**
-
- The `@backstage/techdocs-common` package is being renamed `@backstage/plugin-techdocs-node`. We may continue to publish changes to `@backstage/techdocs-common` for a time, but will stop doing so in the near future. If you depend on this package, you should update your dependencies to point at the renamed package.
-
-- Updated dependencies
- - @backstage/plugin-techdocs-node@0.11.12-next.0
-
-## 0.11.11
-
-### Patch Changes
-
-- 955be6bc7d: adds passing projectID to the Storage client
-- ff0a16fb1a: Modify techdocs builder to automatically append techdocs-core plugin to mkdocs.yaml file if it is missing. Adds an optional configuration item if this plugin needs to be omitted.
-- Updated dependencies
- - @backstage/catalog-model@0.12.0
- - @backstage/backend-common@0.12.0
- - @backstage/integration@0.8.0
- - @backstage/search-common@0.3.0
-
-## 0.11.10
-
-### Patch Changes
-
-- 209fd128e6: Updated usage of `github:` location types in docs to use `url:` instead.
-- 13ef228d03: Clean up the API interface for TechDocs common library.
-- Updated dependencies
- - @backstage/backend-common@0.11.0
- - @backstage/catalog-model@0.11.0
- - @backstage/integration@0.7.5
-
-## 0.11.9
-
-### Patch Changes
-
-- Fix for the previous release with missing type declarations.
-- Updated dependencies
- - @backstage/backend-common@0.10.9
- - @backstage/catalog-model@0.10.1
- - @backstage/config@0.1.15
- - @backstage/errors@0.2.2
- - @backstage/integration@0.7.4
- - @backstage/search-common@0.2.4
-
-## 0.11.8
-
-### Patch Changes
-
-- c77c5c7eb6: Added `backstage.role` to `package.json`
-- 216725b434: Updated to use new names for `parseLocationRef` and `stringifyLocationRef`
-- 7aeb491394: Replace use of deprecated `ENTITY_DEFAULT_NAMESPACE` constant with `DEFAULT_NAMESPACE`.
-- Updated dependencies
- - @backstage/backend-common@0.10.8
- - @backstage/errors@0.2.1
- - @backstage/integration@0.7.3
- - @backstage/catalog-model@0.10.0
- - @backstage/config@0.1.14
- - @backstage/search-common@0.2.3
-
-## 0.11.7
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/backend-common@0.10.7
-
-## 0.11.7-next.0
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/backend-common@0.10.7-next.0
-
-## 0.11.6
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/backend-common@0.10.6
-
-## 0.11.6-next.0
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/backend-common@0.10.6-next.0
-
-## 0.11.5
-
-### Patch Changes
-
-- ff93fbeeec: Fix interpolated string for "Failed to generate docs from ..."
-- Updated dependencies
- - @backstage/search-common@0.2.2
- - @backstage/backend-common@0.10.5
-
-## 0.11.4
-
-### Patch Changes
-
-- 47277c0d8c: Updated the default version of the `@spotify/techdocs` container used when `techdocs.generator.runIn` is `docker` to `v0.3.6`, which includes an update to `mkdocs-monorepo-plugin` that allows glob-based wildcard includes.
-- Updated dependencies
- - @backstage/integration@0.7.2
- - @backstage/backend-common@0.10.4
- - @backstage/config@0.1.13
- - @backstage/catalog-model@0.9.10
-
-## 0.11.4-next.0
-
-### Patch Changes
-
-- 47277c0d8c: Updated the default version of the `@spotify/techdocs` container used when `techdocs.generator.runIn` is `docker` to `v0.3.6`, which includes an update to `mkdocs-monorepo-plugin` that allows glob-based wildcard includes.
-- Updated dependencies
- - @backstage/backend-common@0.10.4-next.0
- - @backstage/config@0.1.13-next.0
- - @backstage/catalog-model@0.9.10-next.0
- - @backstage/integration@0.7.2-next.0
-
-## 0.11.3
-
-### Patch Changes
-
-- 5333451def: Cleaned up API exports
-- Updated dependencies
- - @backstage/config@0.1.12
- - @backstage/integration@0.7.1
- - @backstage/backend-common@0.10.3
- - @backstage/errors@0.2.0
- - @backstage/catalog-model@0.9.9
-
-## 0.11.2
-
-### Patch Changes
-
-- c2c8768771: Bump `@azure/identity` from `^1.5.0` to `^2.0.1`.
-- Updated dependencies
- - @backstage/backend-common@0.10.1
- - @backstage/integration@0.7.0
-
-## 0.11.1
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/backend-common@0.10.0
-
-## 0.11.0
-
-### Minor Changes
-
-- 1bada775a9: Added the ability for the TechDocs Backend to (optionally) leverage a cache
- store to improve performance when reading files from a cloud storage provider.
-
-### Patch Changes
-
-- dcd1a0c3f4: Minor improvement to the API reports, by not unpacking arguments directly
-- Updated dependencies
- - @backstage/backend-common@0.9.13
-
-## 0.10.8
-
-### Patch Changes
-
-- bab752e2b3: Change default port of backend from 7000 to 7007.
-
- This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start.
-
- You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values:
-
- ```
- backend:
- listen: 0.0.0.0:7123
- baseUrl: http://localhost:7123
- ```
-
- More information can be found here: https://backstage.io/docs/conf/writing
-
-- Updated dependencies
- - @backstage/errors@0.1.5
- - @backstage/backend-common@0.9.11
-
-## 0.10.7
-
-### Patch Changes
-
-- 0b60a051c9: Added OpenStack Swift case migration support.
-- 9e64a7ac1e: Allow amazon web services s3 buckets to pass an server side encryption configuration so they can publish to encrypted buckets
-- Updated dependencies
- - @backstage/catalog-model@0.9.7
- - @backstage/backend-common@0.9.10
-
-## 0.10.6
-
-### Patch Changes
-
-- a2d4389587: 1. Techdocs publisher constructors now use parameter objects when being
- instantiated
-
- 2. Internal refactor of `LocalPublish` publisher to use `fromConfig` for
- creation to be aligned with other publishers; this does not impact
- `LocalPublish` usage.
-
- ```diff
- - const publisher = new LocalPublish(config, logger, discovery);
- + const publisher = LocalPublish.fromConfig(config, logger, discovery);
- ```
-
-- 6129c89a47: Default TechDocs container used at docs generation-time is now [v0.3.5](https://github.com/backstage/techdocs-container/releases/tag/v0.3.5).
-- f3c7eec64b: Updated to properly join URL segments under any OS for both AWS S3 and GCP
-- Updated dependencies
- - @backstage/backend-common@0.9.9
-
-## 0.10.5
-
-### Patch Changes
-
-- d207f6ee9e: Support optional bucketRootPath configuration parameter in S3 and GCS publishers
-- Updated dependencies
- - @backstage/config@0.1.11
- - @backstage/errors@0.1.4
- - @backstage/integration@0.6.9
- - @backstage/backend-common@0.9.8
- - @backstage/catalog-model@0.9.6
- - @backstage/search-common@0.2.1
-
-## 0.10.4
-
-### Patch Changes
-
-- 87f5b9db13: Use docs/README.md or README.md as fallback if docs/index.md is missing
-- 36e67d2f24: Internal updates to apply more strict checks to throw errors.
-- Updated dependencies
- - @backstage/backend-common@0.9.7
- - @backstage/errors@0.1.3
- - @backstage/catalog-model@0.9.5
-
-## 0.10.3
-
-### Patch Changes
-
-- 156421c59a: Sets the default techdocs docker image to the [latest released version - v0.3.3](https://github.com/backstage/techdocs-container/releases/tag/v0.3.3).
-- Updated dependencies
- - @backstage/catalog-model@0.9.4
- - @backstage/backend-common@0.9.6
- - @backstage/integration@0.6.7
-
-## 0.10.2
-
-### Patch Changes
-
-- 1c75e8bf98: Add more context to techdocs log lines when files are not found along with
- ensuring that the routers return 404 with a descriptive message.
-- e92f0f728b: Locks the version of the default docker image used to generate TechDocs. As of
- this changelog entry, it is v0.3.2!
-- Updated dependencies
- - @backstage/backend-common@0.9.5
- - @backstage/integration@0.6.6
-
-## 0.10.1
-
-### Patch Changes
-
-- 96fef17a18: Upgrade git-parse-url to v11.6.0
-- Updated dependencies
- - @backstage/backend-common@0.9.3
- - @backstage/integration@0.6.4
-
-## 0.10.0
-
-### Minor Changes
-
-- 8b0f6f860: Set the correct `edit_uri` or `repo_url` for documentation pages that are hosted on GitHub and GitLab.
-
- The constructor of the `TechDocsGenerator` changed.
- Prefer the use of `TechdocsGenerator.fromConfig(โฆ)` instead:
-
- ```diff
- - const techdocsGenerator = new TechdocsGenerator({
- + const techdocsGenerator = TechdocsGenerator.fromConfig(config, {
- logger,
- containerRunner,
- - config,
- });
- ```
-
-### Patch Changes
-
-- 30ed662a3: Adding in-context search to TechDocs Reader component. Using existing search-backend to query for indexed search results scoped into a specific entity's techdocs. Needs TechDocsCollator enabled on the backend to work.
-
- Adding extra information to indexed tech docs documents for search.
-
-- 3624616e7: "Local" (out-of-the-box) publisher explicitly follows lower-case entity triplet
- logic.
-- 67ba7e088: Only write the updated `mkdocs.yml` file if the content was updated.
-
- This keeps local files unchanged if the `dir` annotation is used in combination with the `file` location.
-
-- 8eab6be6a: Force using `posix` path for cloud storage
-- Updated dependencies
- - @backstage/integration@0.6.3
- - @backstage/search-common@0.2.0
- - @backstage/catalog-model@0.9.1
- - @backstage/backend-common@0.9.1
-
-## 0.9.0
-
-### Minor Changes
-
-- 58452cdb7: OpenStack Swift Client changed with Trendyol's OpenStack Swift SDK.
-
- ## Migration from old OpenStack Swift Configuration
-
- Let's assume we have the old OpenStack Swift configuration here.
-
- ```yaml
- techdocs:
- publisher:
- type: 'openStackSwift'
- openStackSwift:
- containerName: 'name-of-techdocs-storage-bucket'
- credentials:
- username: ${OPENSTACK_SWIFT_STORAGE_USERNAME}
- password: ${OPENSTACK_SWIFT_STORAGE_PASSWORD}
- authUrl: ${OPENSTACK_SWIFT_STORAGE_AUTH_URL}
- keystoneAuthVersion: ${OPENSTACK_SWIFT_STORAGE_AUTH_VERSION}
- domainId: ${OPENSTACK_SWIFT_STORAGE_DOMAIN_ID}
- domainName: ${OPENSTACK_SWIFT_STORAGE_DOMAIN_NAME}
- region: ${OPENSTACK_SWIFT_STORAGE_REGION}
- ```
-
- ##### Step 1: Change the credential keys
-
- Since the new SDK uses _Application Credentials_ to authenticate OpenStack, we
- need to change the keys `credentials.username` to `credentials.id`,
- `credentials.password` to `credentials.secret` and use Application Credential ID
- and secret here. For more detail about credentials look
- [here](https://docs.openstack.org/api-ref/identity/v3/?expanded=password-authentication-with-unscoped-authorization-detail,authenticating-with-an-application-credential-detail#authenticating-with-an-application-credential).
-
- ##### Step 2: Remove the unused keys
-
- Since the new SDK doesn't use the old way authentication, we don't need the keys
- `openStackSwift.keystoneAuthVersion`, `openStackSwift.domainId`,
- `openStackSwift.domainName` and `openStackSwift.region`. So you can remove them.
-
- ##### Step 3: Add Swift URL
-
- The new SDK needs the OpenStack Swift connection URL for connecting the Swift.
- So you need to add a new key called `openStackSwift.swiftUrl` and give the
- OpenStack Swift url here. Example url should look like that:
- `https://example.com:6780/swift/v1`
-
- ##### That's it!
-
- Your new configuration should look like that!
-
- ```yaml
- techdocs:
- publisher:
- type: 'openStackSwift'
- openStackSwift:
- containerName: 'name-of-techdocs-storage-bucket'
- credentials:
- id: ${OPENSTACK_SWIFT_STORAGE_APPLICATION_CREDENTIALS_ID}
- secret: ${OPENSTACK_SWIFT_STORAGE_APPLICATION_CREDENTIALS_SECRET}
- authUrl: ${OPENSTACK_SWIFT_STORAGE_AUTH_URL}
- swiftUrl: ${OPENSTACK_SWIFT_STORAGE_SWIFT_URL}
- ```
-
-- c772d9a84: TechDocs sites can now be accessed using paths containing entity triplets of
- any case (e.g. `/docs/namespace/KIND/name` or `/docs/namespace/kind/name`).
-
- If you do not use an external storage provider for serving TechDocs, this is a
- transparent change and no action is required from you.
-
- If you _do_ use an external storage provider for serving TechDocs (one of\* GCS,
- AWS S3, or Azure Blob Storage), you must run a migration command against your
- storage provider before updating.
-
- [A migration guide is available here](https://backstage.io/docs/features/techdocs/how-to-guides#how-to-migrate-from-techdocs-alpha-to-beta).
-
- - (\*) We're seeking help from the community to bring OpenStack Swift support
- [to feature parity](https://github.com/backstage/backstage/issues/6763) with the above.
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/backend-common@0.9.0
- - @backstage/integration@0.6.2
- - @backstage/config@0.1.8
-
-## 0.8.1
-
-### Patch Changes
-
-- bc405be6e: Stale TechDocs content (files that had previously been published but which have
- since been removed) is now removed from storage at publish-time. This is now
- supported by the following publishers:
-
- - Google GCS
- - AWS S3
- - Azure Blob Storage
-
- You may need to apply a greater level of permissions (e.g. the ability to
- delete objects in your storage provider) to any credentials/accounts used by
- the TechDocs CLI or TechDocs backend in order for this change to take effect.
-
- For more details, see [#6132][issue-ref].
-
- [issue-ref]: https://github.com/backstage/backstage/issues/6132
-
-- Updated dependencies
- - @backstage/integration@0.6.0
- - @backstage/backend-common@0.8.9
-
-## 0.8.0
-
-### Minor Changes
-
-- 48ea3d25b: TechDocs has dropped all support for the long-ago deprecated git-based common
- prepares as well as all corresponding values in `backstage.io/techdocs-ref`
- annotations.
-
- Entities whose `backstage.io/techdocs-ref` annotation values still begin with
- `github:`, `gitlab:`, `bitbucket:`, or `azure/api:` will no longer be generated
- by TechDocs. Be sure to update these values so that they align with their
- expected format and your usage of TechDocs.
-
- For details, see [this explainer on TechDocs ref annotation values][how].
-
- [how]: https://backstage.io/docs/features/techdocs/how-to-guides#how-to-understand-techdocs-ref-annotation-values
-
-### Patch Changes
-
-- Updated dependencies
- - @backstage/backend-common@0.8.8
- - @backstage/config@0.1.6
- - @backstage/integration@0.5.9
-
-## 0.7.1
-
-### Patch Changes
-
-- 59a5fa319: Migrated files are now printed when `techdocs-cli migrate` is run with the
- `--verbose` flag set.
-- 54356336e: TechDocs generator stage now supports `mkdocs.yaml` file, in addition to `.yml`
- depending on whichever is present at the time of generation. (Assumes the
- latest `spotify/techdocs` container, running mkdocs `v1.2.2` or greater).
-
-## 0.7.0
-
-### Minor Changes
-
-- d32d01e5b: Improve the annotation `backstage.io/techdocs-ref: dir:` that links to a path that is relative to the source of the annotated entity.
- This annotation works with the basic and the recommended flow, however, it will be most useful with the basic approach.
-
- This change remove the deprecation of the `dir` reference and provides first-class support for it.
- In addition, this change removes the support of the deprecated `github`, `gitlab`, and `azure/api` locations from the `dir` reference preparer.
-
- #### Example Usage
-
- The annotation is convenient if the documentation is stored in the same location, i.e. the same git repository, as the `catalog-info.yaml`.
- While it is still supported to add full URLs such as `backstage.io/techdocs-ref: url:https://...` for custom setups, documentation is mostly stored in the same repository as the entity definition.
- By automatically resolving the target relative to the registration location of the entity, the configuration overhead for this default setup is minimized.
- Since it leverages the `@backstage/integrations` package for the URL resolution, this is compatible with every supported source.
-
- Consider the following examples:
-
- 1. "I have a repository with a single `catalog-info.yaml` and a TechDocs page in the root folder!"
-
- ```
- https://github.com/backstage/example/tree/main/
- |- catalog-info.yaml
- | > apiVersion: backstage.io/v1alpha1
- | > kind: Component
- | > metadata:
- | > name: example
- | > annotations:
- | > backstage.io/techdocs-ref: dir:. # -> same folder
- | > spec: {}
- |- docs/
- |- mkdocs.yml
- ```
-
- 2. "I have a repository with a single `catalog-info.yaml` and my TechDocs page in located in a folder!"
-
- ```
- https://bitbucket.org/my-owner/my-project/src/master/
- |- catalog-info.yaml
- | > apiVersion: backstage.io/v1alpha1
- | > kind: Component
- | > metadata:
- | > name: example
- | > annotations:
- | > backstage.io/techdocs-ref: dir:./some-folder # -> subfolder
- | > spec: {}
- |- some-folder/
- |- docs/
- |- mkdocs.yml
- ```
-
- 3. "I have a mono repository that hosts multiple components!"
-
- ```
- https://dev.azure.com/organization/project/_git/repository
- |- my-1st-module/
- |- catalog-info.yaml
- | > apiVersion: backstage.io/v1alpha1
- | > kind: Component
- | > metadata:
- | > name: my-1st-module
- | > annotations:
- | > backstage.io/techdocs-ref: dir:. # -> same folder
- | > spec: {}
- |- docs/
- |- mkdocs.yml
- |- my-2nd-module/
- |- catalog-info.yaml
- | > apiVersion: backstage.io/v1alpha1
- | > kind: Component
- | > metadata:
- | > name: my-2nd-module
- | > annotations:
- | > backstage.io/techdocs-ref: dir:. # -> same folder
- | > spec: {}
- |- docs/
- |- mkdocs.yml
- |- catalog-info.yaml
- | > apiVersion: backstage.io/v1alpha1
- | > kind: Location
- | > metadata:
- | > name: example
- | > spec:
- | > targets:
- | > - ./*/catalog-info.yaml
- ```
-
-### Patch Changes
-
-- 6e5aed1c9: Fix validation of mkdocs.yml docs_dir
-- 250984333: Add link to https://backstage.io/docs/features/techdocs/configuration in the log warning message about updating techdocs.generate key.
-- Updated dependencies
- - @backstage/backend-common@0.8.7
-
-## 0.6.8
-
-### Patch Changes
-
-- d5eaab91d: Adds custom docker image support to the techdocs generator. This change adds a new `techdocs.generator` configuration key and deprecates the existing `techdocs.generators.techdocs` key.
-
- ```yaml
- techdocs:
- # recommended, going forward:
- generator:
- runIn: 'docker' # or 'local'
- # New optional settings
- dockerImage: my-org/techdocs # use a custom docker image
- pullImage: false # disable automatic pulling of image (e.g. if custom docker login is required)
- # legacy (deprecated):
- generators:
- techdocs: 'docker' # or 'local'
- ```
-
-- c18e8eb91: Provide optional `logger: Logger` and `logStream: Writable` arguments to the `GeneratorBase#run(...)` command.
- They receive all log messages that are emitted during the generator run.
-- ae84b20cf: Revert the upgrade to `fs-extra@10.0.0` as that seemed to have broken all installs inexplicably.
-- Updated dependencies
- - @backstage/backend-common@0.8.6
-
-## 0.6.7
-
-### Patch Changes
-
-- 683308ecf: Fix openStack swift publisher encoding issue. Remove utf8 forced encoding on binary files
-- 6841e0113: fix minor version of git-url-parse as 11.5.x introduced a bug for Bitbucket Server
-- Updated dependencies
- - @backstage/integration@0.5.8
- - @backstage/catalog-model@0.9.0
- - @backstage/backend-common@0.8.5
-
-## 0.6.6
-
-### Patch Changes
-
-- ab5cc376f: Use new utilities from `@backstage/backend-common` for safely resolving child paths
-- b47fc34bc: Update "service catalog" references to "software catalog"
-- Updated dependencies
- - @backstage/backend-common@0.8.4
- - @backstage/integration@0.5.7
-
-## 0.6.5
-
-### Patch Changes
-
-- c17c0fcf9: Adding additional checks on tech docs to prevent folder traversal via mkdocs.yml docs_dir value.
-- Updated dependencies
- - @backstage/catalog-model@0.8.4
-
-## 0.6.4
-
-### Patch Changes
-
-- aad98c544: Fixes multiple XSS and sanitization bypass vulnerabilities in TechDocs.
-- 090594755: Support parsing `mkdocs.yml` files that are using custom yaml tags like
- `!!python/name:materialx.emoji.twemoji`.
-- Updated dependencies [ebe802bc4]
-- Updated dependencies [49d7ec169]
- - @backstage/catalog-model@0.8.1
- - @backstage/integration@0.5.5
-
-## 0.6.3
-
-### Patch Changes
-
-- 8cefadca0: Adding validation to mkdocs.yml parsing to prevent directory tree traversing
-- Updated dependencies [0fd4ea443]
-- Updated dependencies [add62a455]
-- Updated dependencies [704875e26]
- - @backstage/integration@0.5.4
- - @backstage/catalog-model@0.8.0
-
-## 0.6.2
-
-### Patch Changes
-
-- 65e6c4541: Remove circular dependencies
-- Updated dependencies [f7f7783a3]
-- Updated dependencies [c7dad9218]
-- Updated dependencies [65e6c4541]
-- Updated dependencies [68fdbf014]
-- Updated dependencies [5001de908]
- - @backstage/catalog-model@0.7.10
- - @backstage/backend-common@0.8.1
- - @backstage/integration@0.5.3
-
-## 0.6.1
-
-### Patch Changes
-
-- e04f1ccfb: Fixed a bug that prevented loading static assets from GCS, S3, Azure, and OpenStackSwift whose keys contain spaces or other special characters.
-- Updated dependencies [22fd8ce2a]
-- Updated dependencies [10c008a3a]
-- Updated dependencies [f9fb4a205]
-- Updated dependencies [16be1d093]
- - @backstage/backend-common@0.8.0
- - @backstage/catalog-model@0.7.9
-
-## 0.6.0
-
-### Minor Changes
-
-- e0bfd3d44: Migrate the package to use the `ContainerRunner` interface instead of `runDockerContainer(โฆ)`.
- It also no longer provides the `ContainerRunner` as an input to the `GeneratorBase#run(โฆ)` function, but expects it as a constructor parameter instead.
-
- If you use the `TechdocsGenerator` you need to update the usage:
-
- ```diff
- + const containerRunner = new DockerContainerRunner({ dockerClient });
-
- - const generator = new TechdocsGenerator(logger, config);
- + const techdocsGenerator = new TechdocsGenerator({
- + logger,
- + containerRunner,
- + config,
- + });
-
- await this.generator.run({
- inputDir: preparedDir,
- outputDir,
- - dockerClient: this.dockerClient,
- parsedLocationAnnotation,
- etag: newEtag,
- });
- ```
-
-### Patch Changes
-
-- e9e56b01a: Adding optional config to enable S3-like API for tech-docs using s3ForcePathStyle option.
- This allows providers like LocalStack, Minio and Wasabi (+possibly others) to be used to host tech docs.
-- Updated dependencies [e0bfd3d44]
-- Updated dependencies [38ca05168]
-- Updated dependencies [d8b81fd28]
- - @backstage/backend-common@0.7.0
- - @backstage/integration@0.5.2
- - @backstage/catalog-model@0.7.8
- - @backstage/config@0.1.5
-
-## 0.5.1
-
-### Patch Changes
-
-- f4af06ebe: Gracefully handle HTTP request failures in download method of AzureBlobStorage publisher.
-
-## 0.5.0
-
-### Minor Changes
-
-- bc9d62f4f: Move the sanity checks of the publisher configurations to a dedicated `PublisherBase#getReadiness()` method instead of throwing an error when doing `Publisher.fromConfig(...)`.
- You should include the check when your backend to get early feedback about a potential misconfiguration:
-
- ```diff
- // packages/backend/src/plugins/techdocs.ts
-
- export default async function createPlugin({
- logger,
- config,
- discovery,
- reader,
- }: PluginEnvironment): Promise {
- // ...
-
- const publisher = await Publisher.fromConfig(config, {
- logger,
- discovery,
- })
-
- + // checks if the publisher is working and logs the result
- + await publisher.getReadiness();
-
- // Docker client (conditionally) used by the generators, based on techdocs.generators config.
- const dockerClient = new Docker();
-
- // ...
- }
- ```
-
- If you want to crash your application on invalid configurations, you can throw an `Error` to preserve the old behavior.
- Please be aware that this is not the recommended for the use in a Backstage backend but might be helpful in CLI tools such as the `techdocs-cli`.
-
- ```ts
- const publisher = await Publisher.fromConfig(config, {
- logger,
- discovery,
- });
-
- const ready = await publisher.getReadiness();
- if (!ready.isAvailable) {
- throw new Error('Invalid TechDocs publisher configuration');
- }
- ```
-
-### Patch Changes
-
-- Updated dependencies [bb5055aee]
-- Updated dependencies [5d0740563]
- - @backstage/catalog-model@0.7.7
-
-## 0.4.5
-
-### Patch Changes
-
-- 8686eb38c: Use errors from `@backstage/errors`
-- 424742dc1: Applies only if you use TechDocs local builder instead of building on CI/CD i.e. if `techdocs.builder` in your `app-config.yaml` is set to `'local'`
-
- Improvements
-
- 1. Do not check for updates in the repository if a check has been made in the last 60 seconds. This is to prevent the annoying check for update on every page switch or load.
- 2. No need to maintain an in-memory etag storage, and use the one stored in `techdocs_metadata.json` file alongside generated docs.
-
- New feature
-
- 1. You can now use a mix of basic and recommended setup i.e. `techdocs.builder` is `'local'` but using an external cloud storage instead of local storage. Previously, in this setup, the docs would never get updated.
-
-- Updated dependencies [8686eb38c]
-- Updated dependencies [0434853a5]
-- Updated dependencies [8686eb38c]
- - @backstage/backend-common@0.6.0
- - @backstage/config@0.1.4
-
-## 0.4.4
-
-### Patch Changes
-
-- d7245b733: Remove runDockerContainer, and start using the utility function provided by @backstage/backend-common
-- 0b42fff22: Make use of parseLocationReference/stringifyLocationReference
-- 2ef5bc7ea: Implement proper AWS Credentials precedence with assume-role and explicit credentials
-- aa095e469: OpenStack Swift publisher added for tech-docs.
-- bc46435f5: - Improve deprecation warning messaging in logs.
- - Replace temp folder path from git provider domain(`source`) to full git host name (`resource`). (See: https://github.com/IonicaBizau/git-url-parse#giturlparseurl)
-- a501128db: Refactor log messaging to improve clarity
-- ca4a904f6: Add an optional configuration option for setting the url endpoint for AWS S3 publisher: `techdocs.publisher.awsS3.endpoint`
-- Updated dependencies [277644e09]
-- Updated dependencies [52f613030]
-- Updated dependencies [d7245b733]
-- Updated dependencies [0b42fff22]
-- Updated dependencies [905cbfc96]
-- Updated dependencies [761698831]
-- Updated dependencies [d4e77ec5f]
- - @backstage/integration@0.5.1
- - @backstage/backend-common@0.5.6
- - @backstage/catalog-model@0.7.4
-
-## 0.4.3
-
-### Patch Changes
-
-- f43192207: remove usage of res.send() for res.json() and res.end() to ensure content types are more consistently application/json on backend responses and error cases
-- 61299519f: Remove read-store-upload loop when uploading S3 objects for TechDocs
-- Updated dependencies [12d8f27a6]
-- Updated dependencies [497859088]
-- Updated dependencies [8adb48df4]
- - @backstage/catalog-model@0.7.3
- - @backstage/backend-common@0.5.5
-
-## 0.4.2
-
-### Patch Changes
-
-- 2499f6cde: Add support for assuming role in AWS integrations
-- 1e4ddd71d: Fix AWS, GCS and Azure publisher to work on Windows.
-- Updated dependencies [bad21a085]
-- Updated dependencies [a1f5e6545]
- - @backstage/catalog-model@0.7.2
- - @backstage/config@0.1.3
-
-## 0.4.1
-
-### Patch Changes
-
-- fb28da212: Switched to using `'x-access-token'` for authenticating Git over HTTPS towards GitHub.
-- 26e143e60: After TechDocs generate step, insert build timestamp to techdocs_metadata.json
-- c6655413d: Improved error reporting in AzureBlobStorage to surface errors when fetching metadata and uploading files fails.
-- 44414239f: Pass user and group ID when invoking docker container. When TechDocs invokes Docker, docker could be run as a `root` user which results in generation of files by applications run by non-root user (e.g. TechDocs) will not have access to modify. This PR passes in current user and group ID to docker so that the file permissions of the generated files and folders are correct.
-- b0a41c707: Add etag of the prepared file tree to techdocs_metadata.json in the storage
-- Updated dependencies [16fb1d03a]
-- Updated dependencies [491f3a0ec]
-- Updated dependencies [491f3a0ec]
-- Updated dependencies [434b4e81a]
-- Updated dependencies [fb28da212]
- - @backstage/backend-common@0.5.4
- - @backstage/integration@0.5.0
-
-## 0.4.0
-
-### Minor Changes
-
-- 08142b256: URL Preparer will now use proper etag based caching introduced in https://github.com/backstage/backstage/pull/4120. Previously, builds used to be cached for 30 minutes.
-
-### Patch Changes
-
-- 77ad0003a: Revert AWS SDK version to v2
-- 08142b256: TechDocs will throw warning in backend logs when legacy git preparer or dir preparer is used to preparer docs. Migrate to URL Preparer by updating `backstage.io/techdocs-ref` annotation to be prefixed with `url:`.
- Detailed docs are here https://backstage.io/docs/features/techdocs/how-to-guides#how-to-use-url-reader-in-techdocs-prepare-step
- See benefits and reason for doing so https://github.com/backstage/backstage/issues/4409
-- Updated dependencies [ffffea8e6]
-- Updated dependencies [82b2c11b6]
-- Updated dependencies [965e200c6]
-- Updated dependencies [ffffea8e6]
-- Updated dependencies [5a5163519]
- - @backstage/backend-common@0.5.3
- - @backstage/integration@0.4.0
-
-## 0.3.7
-
-### Patch Changes
-
-- c777df180: 1. Added option to use Azure Blob Storage as a choice to store the static generated files for TechDocs.
-- e44925723: `techdocs.requestUrl` and `techdocs.storageUrl` are now optional configs and the discovery API will be used to get the URL where techdocs plugin is hosted.
-- f0320190d: dir preparer will use URL Reader in its implementation.
-- Updated dependencies [c4abcdb60]
-- Updated dependencies [2430ee7c2]
-- Updated dependencies [6e612ce25]
-- Updated dependencies [025e122c3]
-- Updated dependencies [064c513e1]
-- Updated dependencies [7881f2117]
-- Updated dependencies [3149bfe63]
-- Updated dependencies [2e62aea6f]
-- Updated dependencies [11cb5ef94]
- - @backstage/integration@0.3.2
- - @backstage/backend-common@0.5.2
- - @backstage/catalog-model@0.7.1
-
-## 0.3.6
-
-### Patch Changes
-
-- 9dd057662: Upgrade [git-url-parse](https://www.npmjs.com/package/git-url-parse) to [v11.4.4](https://github.com/IonicaBizau/git-url-parse/pull/125) which fixes parsing an Azure DevOps branch ref.
-- db2328c88: Add rate limiter for concurrent execution of file uploads in AWS and Google publishers
-- Updated dependencies [26a3a6cf0]
-- Updated dependencies [664dd08c9]
-- Updated dependencies [6800da78d]
-- Updated dependencies [9dd057662]
- - @backstage/backend-common@0.5.1
- - @backstage/integration@0.3.1
-
-## 0.3.5
-
-### Patch Changes
-
-- 53c9c51f2: TechDocs backend now streams files through from Google Cloud Storage to the browser, improving memory usage.
-- a5e27d5c1: Create type for TechDocsMetadata (#3716)
-
- This change introduces a new type (TechDocsMetadata) in packages/techdocs-common. This type is then introduced in the endpoint response in techdocs-backend and in the api interface in techdocs (frontend).
-
-- Updated dependencies [def2307f3]
-- Updated dependencies [0b135e7e0]
-- Updated dependencies [294a70cab]
-- Updated dependencies [fa8ba330a]
-- Updated dependencies [0ea032763]
-- Updated dependencies [5345a1f98]
-- Updated dependencies [ed6baab66]
-- Updated dependencies [09a370426]
-- Updated dependencies [a93f42213]
- - @backstage/catalog-model@0.7.0
- - @backstage/backend-common@0.5.0
- - @backstage/integration@0.3.0
-
-## 0.3.4
-
-### Patch Changes
-
-- a594a7257: @backstage/techdocs-common can now be imported in an environment without @backstage/plugin-techdocs-backend being installed.
-
-## 0.3.3
-
-### Patch Changes
-
-- 68ad5af51: Improve techdocs-common Generator API for it to be used by techdocs-cli. TechDocs generator.run function now takes
- an input AND an output directory. Most probably you use techdocs-common via plugin-techdocs-backend, and so there
- is no breaking change for you.
- But if you use techdocs-common separately, you need to create an output directory and pass into the generator.
-- 371f67ecd: fix to-string breakage of binary files
-- f1e74777a: Fix bug where binary files (`png`, etc.) could not load when using AWS or GCS publisher.
-- dbe4450c3: Google Cloud authentication in TechDocs has been improved.
-
- 1. `techdocs.publisher.googleGcs.credentials` is now optional. If it is missing, `GOOGLE_APPLICATION_CREDENTIALS`
- environment variable (and some other methods) will be used to authenticate.
- Read more here https://cloud.google.com/docs/authentication/production
-
- 2. `techdocs.publisher.googleGcs.projectId` is no longer used. You can remove it from your `app-config.yaml`.
-
-- 5826d0973: AWS SDK version bump for TechDocs.
-- b3b9445df: AWS S3 authentication in TechDocs has been improved.
-
- 1. `techdocs.publisher.awsS3.bucketName` is now the only required config. `techdocs.publisher.awsS3.credentials` and `techdocs.publisher.awsS3.region` are optional.
-
- 2. If `techdocs.publisher.awsS3.credentials` and `techdocs.publisher.awsS3.region` are missing, the AWS environment variables `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_REGION` will be used. There are more better ways of setting up AWS authentication. Read the guide at https://backstage.io/docs/features/techdocs/using-cloud-storage
-
-- Updated dependencies [466354aaa]
-- Updated dependencies [f3b064e1c]
-- Updated dependencies [abbee6fff]
-- Updated dependencies [147fadcb9]
- - @backstage/integration@0.2.0
- - @backstage/catalog-model@0.6.1
- - @backstage/backend-common@0.4.3
-
-## 0.3.2
-
-### Patch Changes
-
-- 7ec525481: 1. Added option to use AWS S3 as a choice to store the static generated files for TechDocs.
-- f8ba88ded: Fix for `integration.github.apiBaseUrl` configuration not properly overriding apiBaseUrl used by techdocs
-- 00042e73c: Moving the Git actions to isomorphic-git instead of the node binding version of nodegit
-- Updated dependencies [5ecd50f8a]
-- Updated dependencies [00042e73c]
-- Updated dependencies [0829ff126]
-- Updated dependencies [036a84373]
- - @backstage/backend-common@0.4.2
- - @backstage/integration@0.1.5
-
-## 0.3.1
-
-### Patch Changes
-
-- 8804e8981: Using @backstage/integration package for GitHub/GitLab/Azure tokens and request options.
-
- Most probably you do not have to make any changes in the app because of this change.
- However, if you are using the `DirectoryPreparer` or `CommonGitPreparer` exported by
- `@backstage/techdocs-common` package, you now need to add pass in a `config` (from `@backstage/config`)
- instance as argument.
-
- ```
-
- const directoryPreparer = new DirectoryPreparer(logger);
- const commonGitPreparer = new CommonGitPreparer(logger);
-
- const directoryPreparer = new DirectoryPreparer(config, logger);
- const commonGitPreparer = new CommonGitPreparer(config, logger);
- ```
-
-## 0.3.0
-
-### Minor Changes
-
-- a8573e53b: techdocs-backend: Simplified file, removing individual preparers and generators.
- techdocs-backend: UrlReader is now available to use in preparers.
-
- In your Backstage app, `packages/backend/plugins/techdocs.ts` file has now been simplified,
- to remove registering individual preparers and generators.
-
- Please update the file when upgrading the version of `@backstage/plugin-techdocs-backend` package.
-
- ```typescript
- const preparers = await Preparers.fromConfig(config, {
- logger,
- reader,
- });
-
- const generators = await Generators.fromConfig(config, {
- logger,
- });
-
- const publisher = await Publisher.fromConfig(config, {
- logger,
- discovery,
- });
- ```
-
- You should be able to remove unnecessary imports, and just do
-
- ```typescript
- import {
- createRouter,
- Preparers,
- Generators,
- Publisher,
- } from '@backstage/plugin-techdocs-backend';
- ```
-
-## 0.2.0
-
-### Minor Changes
-
-- dae4f3983: _Breaking changes_
-
- 1. Added option to use Google Cloud Storage as a choice to store the static generated files for TechDocs.
- It can be configured using `techdocs.publisher.type` option in `app-config.yaml`.
- Step-by-step guide to configure GCS is available here https://backstage.io/docs/features/techdocs/using-cloud-storage
- Set `techdocs.publisher.type` to `'local'` if you want to continue using local filesystem to store TechDocs files.
-
- 2. `techdocs.builder` is now required and can be set to `'local'` or `'external'`. (Set it to `'local'` for now, since CI/CD build
- workflow for TechDocs will be available soon (in few weeks)).
- If builder is set to 'local' and you open a TechDocs page, `techdocs-backend` will try to generate the docs, publish to storage and
- show the generated docs afterwords.
- If builder is set to `'external'`, `techdocs-backend` will only fetch the docs and will NOT try to generate and publish. In this case of `'external'`,
- we assume that docs are being built in the CI/CD pipeline of the repository.
- TechDocs will not assume a default value for `techdocs.builder`. It is better to explicitly define it in the `app-config.yaml`.
-
- 3. When configuring TechDocs in your backend, there is a difference in how a new publisher is created.
-
- ```
- --- const publisher = new LocalPublish(logger, discovery);
- +++ const publisher = Publisher.fromConfig(config, logger, discovery);
- ```
-
- Based on the config `techdocs.publisher.type`, the publisher could be either Local publisher or Google Cloud Storage publisher.
-
- 4. `techdocs.storageUrl` is now a required config. Should be `http://localhost:7007/api/techdocs/static/docs` in most setups.
-
- 5. Parts of `@backstage/plugin-techdocs-backend` have been moved to a new package `@backstage/techdocs-common` to generate docs. Also to publish docs
- to-and-fro between TechDocs and a storage (either local or external). However, a Backstage app does NOT need to import the `techdocs-common` package -
- app should only import `@backstage/plugin-techdocs` and `@backstage/plugin-techdocs-backend`.
-
- _Patch changes_
-
- 1. See all of TechDocs config options and its documentation https://backstage.io/docs/features/techdocs/configuration
-
- 2. Logic about serving static files and metadata retrieval have been abstracted away from the router in `techdocs-backend` to the instance of publisher.
-
- 3. Removed Material UI Spinner from TechDocs header. Spinners cause unnecessary UX distraction.
- Case 1 (when docs are built and are to be served): Spinners appear for a split second before the name of site shows up. This unnecessarily distracts eyes because spinners increase the size of the Header. A dot (.) would do fine. Definitely more can be done.
- Case 2 (when docs are being generated): There is already a linear progress bar (which is recommended in Storybook).
-
-### Patch Changes
-
-- Updated dependencies [c911061b7]
-- Updated dependencies [1d1c2860f]
-- Updated dependencies [0e6298f7e]
-- Updated dependencies [4eafdec4a]
-- Updated dependencies [ac3560b42]
- - @backstage/catalog-model@0.6.0
- - @backstage/backend-common@0.4.1
diff --git a/packages/techdocs-common/README.md b/packages/techdocs-common/README.md
deleted file mode 100644
index 052eae7ab2..0000000000
--- a/packages/techdocs-common/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# @backstage/techdocs-common
-
-This package has been moved to `@backstage/plugin-techdocs-node` and is no
-longer maintained. Please update any dependencies you have on this package
-accordingly.
diff --git a/packages/techdocs-common/api-report.md b/packages/techdocs-common/api-report.md
deleted file mode 100644
index 62851bbd68..0000000000
--- a/packages/techdocs-common/api-report.md
+++ /dev/null
@@ -1,9 +0,0 @@
-## API Report File for "@backstage/techdocs-common"
-
-> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
-
-```ts
-export * from '@backstage/plugin-techdocs-node';
-
-// (No @packageDocumentation comment for this package)
-```
diff --git a/packages/techdocs-common/package.json b/packages/techdocs-common/package.json
deleted file mode 100644
index fbc7052f9c..0000000000
--- a/packages/techdocs-common/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "name": "@backstage/techdocs-common",
- "description": "No longer maintained. Use @backstage/plugin-techdocs-node instead.",
- "version": "0.11.15",
- "main": "src/index.ts",
- "types": "src/index.ts",
- "private": false,
- "publishConfig": {
- "access": "public",
- "main": "dist/index.cjs.js",
- "types": "dist/index.d.ts"
- },
- "backstage": {
- "role": "node-library"
- },
- "homepage": "https://backstage.io",
- "repository": {
- "type": "git",
- "url": "https://github.com/backstage/backstage",
- "directory": "packages/techdocs-common"
- },
- "license": "Apache-2.0",
- "files": [
- "dist"
- ],
- "scripts": {
- "build": "backstage-cli package build",
- "lint": "backstage-cli package lint",
- "test": "backstage-cli package test",
- "prepack": "backstage-cli package prepack",
- "postpack": "backstage-cli package postpack",
- "clean": "backstage-cli package clean",
- "start": "backstage-cli package start"
- },
- "bugs": {
- "url": "https://github.com/backstage/backstage/issues"
- },
- "dependencies": {
- "@backstage/plugin-techdocs-node": "1.1.1"
- },
- "devDependencies": {},
- "jest": {
- "roots": [
- ".."
- ]
- }
-}
diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md
index 1fd8aa82c7..d8e9a8dd11 100644
--- a/packages/test-utils/CHANGELOG.md
+++ b/packages/test-utils/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/test-utils
+## 1.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/plugin-permission-common@0.6.2
+ - @backstage/plugin-permission-react@0.4.2
+
+## 1.1.1-next.0
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-app-api@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/plugin-permission-common@0.6.2-next.0
+ - @backstage/plugin-permission-react@0.4.2-next.0
+
## 1.1.0
### Minor Changes
diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json
index 870882463f..0c52f47325 100644
--- a/packages/test-utils/package.json
+++ b/packages/test-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/test-utils",
"description": "Utilities to test Backstage plugins and apps.",
- "version": "1.1.0",
+ "version": "1.1.1",
"private": false,
"publishConfig": {
"access": "public",
@@ -34,10 +34,10 @@
},
"dependencies": {
"@backstage/config": "^1.0.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/plugin-permission-common": "^0.6.1",
- "@backstage/plugin-permission-react": "^0.4.1",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/plugin-permission-common": "^0.6.2",
+ "@backstage/plugin-permission-react": "^0.4.2",
"@backstage/theme": "^0.2.15",
"@backstage/types": "^1.0.0",
"@material-ui/core": "^4.12.2",
@@ -55,10 +55,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/jest": "^26.0.7",
"@types/node": "^16.11.26",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/packages/theme/package.json b/packages/theme/package.json
index 537b6bab96..d10999fefb 100644
--- a/packages/theme/package.json
+++ b/packages/theme/package.json
@@ -36,7 +36,7 @@
"@material-ui/core": "^4.12.2"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0"
+ "@backstage/cli": "^0.17.2-next.0"
},
"files": [
"dist"
diff --git a/packages/types/package.json b/packages/types/package.json
index 112247fefe..5ea10709ec 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -34,7 +34,7 @@
},
"dependencies": {},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.2-next.0",
"@types/zen-observable": "^0.8.0",
"zen-observable": "^0.8.15"
},
diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json
index c7fdf46951..81ec8017a1 100644
--- a/packages/version-bridge/package.json
+++ b/packages/version-bridge/package.json
@@ -37,7 +37,7 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1-next.0",
+ "@backstage/cli": "^0.17.2-next.0",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/react-hooks": "^8.0.0"
diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md
index 20b2cf507c..946df67282 100644
--- a/plugins/adr-backend/CHANGELOG.md
+++ b/plugins/adr-backend/CHANGELOG.md
@@ -1,5 +1,49 @@
# @backstage/plugin-adr-backend
+## 0.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/backend-common@0.14.0
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+ - @backstage/plugin-adr-common@0.1.1
+
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5-next.1
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/integration@1.2.1-next.2
+
+## 0.1.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+ - @backstage/plugin-adr-common@0.1.1-next.1
+
+## 0.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/integration@1.2.1-next.0
+ - @backstage/plugin-adr-common@0.1.1-next.0
+
## 0.1.0
### Minor Changes
diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json
index bc7526754e..c192e0cd85 100644
--- a/plugins/adr-backend/package.json
+++ b/plugins/adr-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr-backend",
- "version": "0.1.0",
+ "version": "0.1.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,14 +29,14 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
- "@backstage/catalog-client": "^1.0.2",
- "@backstage/catalog-model": "^1.0.2",
+ "@backstage/backend-common": "^0.14.0",
+ "@backstage/catalog-client": "^1.0.3",
+ "@backstage/catalog-model": "^1.0.3",
"@backstage/config": "^1.0.1",
"@backstage/errors": "^1.0.0",
- "@backstage/integration": "^1.2.0",
- "@backstage/plugin-adr-common": "^0.1.0",
- "@backstage/plugin-search-common": "^0.3.4",
+ "@backstage/integration": "^1.2.1",
+ "@backstage/plugin-adr-common": "^0.1.1",
+ "@backstage/plugin-search-common": "^0.3.5",
"luxon": "^2.0.2",
"marked": "^4.0.14",
"winston": "^3.2.1",
@@ -44,11 +44,11 @@
"yn": "^4.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/marked": "^4.0.0",
"@types/supertest": "^2.0.8",
"supertest": "^6.1.3",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md
index 506d2b3d3d..d9a0207248 100644
--- a/plugins/adr-common/CHANGELOG.md
+++ b/plugins/adr-common/CHANGELOG.md
@@ -1,5 +1,30 @@
# @backstage/plugin-adr-common
+## 0.1.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/integration@1.2.1
+ - @backstage/catalog-model@1.0.3
+
+## 0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+
+## 0.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.0
+
## 0.1.0
### Minor Changes
diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json
index 69774b4f9a..d3607f3a99 100644
--- a/plugins/adr-common/package.json
+++ b/plugins/adr-common/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-adr-common",
"description": "Common functionalities for the adr plugin",
- "version": "0.1.0",
+ "version": "0.1.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,12 +30,12 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/catalog-model": "^1.0.2",
- "@backstage/integration": "^1.2.0",
- "@backstage/plugin-search-common": "^0.3.4"
+ "@backstage/catalog-model": "^1.0.3",
+ "@backstage/integration": "^1.2.1",
+ "@backstage/plugin-search-common": "^0.3.5"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1"
+ "@backstage/cli": "^0.17.2"
},
"files": [
"dist"
diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md
index 735f333b2f..61e28f3834 100644
--- a/plugins/adr/CHANGELOG.md
+++ b/plugins/adr/CHANGELOG.md
@@ -1,5 +1,45 @@
# @backstage/plugin-adr
+## 0.1.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- a6458a120b: Adding term highlighting support to `AdrSearchResultListItem`
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/plugin-search-common@0.3.5
+ - @backstage/plugin-search-react@0.2.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/integration-react@1.1.1
+ - @backstage/plugin-adr-common@0.1.1
+
+## 0.1.1-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/integration-react@1.1.1-next.1
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+ - @backstage/plugin-search-react@0.2.1-next.0
+ - @backstage/plugin-search-common@0.3.5-next.0
+ - @backstage/plugin-adr-common@0.1.1-next.1
+
+## 0.1.1-next.0
+
+### Patch Changes
+
+- a6458a120b: Adding term highlighting support to `AdrSearchResultListItem`
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+ - @backstage/integration-react@1.1.1-next.0
+ - @backstage/plugin-adr-common@0.1.1-next.0
+
## 0.1.0
### Minor Changes
diff --git a/plugins/adr/api-report.md b/plugins/adr/api-report.md
index 61cf231784..fbe04b1dc4 100644
--- a/plugins/adr/api-report.md
+++ b/plugins/adr/api-report.md
@@ -47,10 +47,12 @@ export const AdrReader: {
export const AdrSearchResultListItem: ({
lineClamp,
highlight,
+ rank,
result,
}: {
lineClamp?: number | undefined;
highlight?: ResultHighlight | undefined;
+ rank?: number | undefined;
result: AdrDocument;
}) => JSX.Element;
diff --git a/plugins/adr/package.json b/plugins/adr/package.json
index 2274bdebd4..194cc44ae4 100644
--- a/plugins/adr/package.json
+++ b/plugins/adr/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr",
- "version": "0.1.0",
+ "version": "0.1.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -22,13 +22,13 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/integration-react": "^1.1.0",
- "@backstage/plugin-adr-common": "^0.1.0",
- "@backstage/plugin-catalog-react": "^1.1.0",
- "@backstage/plugin-search-common": "^0.3.4",
- "@backstage/plugin-search-react": "^0.2.0",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/integration-react": "^1.1.1",
+ "@backstage/plugin-adr-common": "^0.1.1",
+ "@backstage/plugin-catalog-react": "^1.1.1",
+ "@backstage/plugin-search-common": "^0.3.5",
+ "@backstage/plugin-search-react": "^0.2.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -44,10 +44,10 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/dev-utils": "^1.0.2",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/dev-utils": "^1.0.3",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
@@ -55,7 +55,7 @@
"@types/jest": "*",
"@types/node": "*",
"cross-fetch": "^3.1.5",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/plugins/adr/src/search/AdrSearchResultListItem.tsx b/plugins/adr/src/search/AdrSearchResultListItem.tsx
index 484bac336e..677e39fc11 100644
--- a/plugins/adr/src/search/AdrSearchResultListItem.tsx
+++ b/plugins/adr/src/search/AdrSearchResultListItem.tsx
@@ -24,6 +24,7 @@ import {
makeStyles,
} from '@material-ui/core';
import { Link } from '@backstage/core-components';
+import { useAnalytics } from '@backstage/core-plugin-api';
import { AdrDocument } from '@backstage/plugin-adr-common';
import { ResultHighlight } from '@backstage/plugin-search-common';
import { HighlightedSearchResultText } from '@backstage/plugin-search-react';
@@ -46,16 +47,26 @@ const useStyles = makeStyles({
export const AdrSearchResultListItem = ({
lineClamp = 5,
highlight,
+ rank,
result,
}: {
lineClamp?: number;
highlight?: ResultHighlight;
+ rank?: number;
result: AdrDocument;
}) => {
const classes = useStyles();
+ const analytics = useAnalytics();
+
+ const handleClick = () => {
+ analytics.captureEvent('discover', result.title, {
+ attributes: { to: result.location },
+ value: rank,
+ });
+ };
return (
-
+
{
+ // load the default widgets
+ const definitionWidgets = defaultDefinitionWidgets();
+ // add the grpc-docs api widget to the definition widgets
+ definitionWidgets.push(grpcDocsApiWidget);
+ return {
+ getApiDefinitionWidget: (apiEntity: ApiEntity) => {
+ // find the widget for the type of api entity
+ return definitionWidgets.find(d => d.type === apiEntity.spec.type);
+ },
+ };
+ },
+ }),
+];
+```
+
+### Set the type in your api entities
+
+This widget will render the generated `protoc-gen-doc` descriptors with the `grpc-docs` package. For this make sure you use the `grpc-docs` as the type in the API catalog file.
+
+```yaml
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: hello-world
+ description: Hello World example for gRPC
+spec:
+ type: grpc-docs
+ lifecycle: deprecated
+ owner: foo
+ definition:
+ $text: https://fetch-my-json.com/awesome-resource.json
+```
diff --git a/plugins/api-docs-module-protoc-gen-doc/api-report.md b/plugins/api-docs-module-protoc-gen-doc/api-report.md
new file mode 100644
index 0000000000..696fee2a20
--- /dev/null
+++ b/plugins/api-docs-module-protoc-gen-doc/api-report.md
@@ -0,0 +1,14 @@
+## API Report File for "@backstage/plugin-api-docs-module-protoc-gen-doc"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+///
+
+// @public (undocumented)
+export const grpcDocsApiWidget: {
+ type: string;
+ title: string;
+ component: (definition: string) => JSX.Element;
+};
+```
diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json
new file mode 100644
index 0000000000..81e7b7ea45
--- /dev/null
+++ b/plugins/api-docs-module-protoc-gen-doc/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "@backstage/plugin-api-docs-module-protoc-gen-doc",
+ "description": "Additional functionalities for the api-docs plugin that renders the output of the protoc-gen-doc",
+ "version": "0.0.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "backstage": {
+ "role": "frontend-plugin-module"
+ },
+ "homepage": "https://backstage.io",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/backstage/backstage",
+ "directory": "plugins/api-docs-module-protoc-gen-doc"
+ },
+ "keywords": [
+ "backstage"
+ ],
+ "scripts": {
+ "build": "backstage-cli package build",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "clean": "backstage-cli package clean",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack"
+ },
+ "dependencies": {
+ "grpc-docs": "^1.1.2"
+ },
+ "peerDependencies": {
+ "react": "^16.13.1 || ^17.0.0"
+ },
+ "devDependencies": {
+ "@backstage/cli": "^0.17.2-next.0",
+ "@testing-library/jest-dom": "^5.16.4",
+ "@types/react": "^16.13.1 || ^17.0.0"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/plugins/api-docs-module-protoc-gen-doc/src/index.ts b/plugins/api-docs-module-protoc-gen-doc/src/index.ts
new file mode 100644
index 0000000000..8cca60ac60
--- /dev/null
+++ b/plugins/api-docs-module-protoc-gen-doc/src/index.ts
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Package encapsulating utilities to be shared by frontend TechDocs plugins.
+ *
+ * @packageDocumentation
+ */
+
+export { grpcDocsApiWidget } from './widgets';
diff --git a/plugins/search/src/components/SearchResult/index.tsx b/plugins/api-docs-module-protoc-gen-doc/src/setupTests.ts
similarity index 86%
rename from plugins/search/src/components/SearchResult/index.tsx
rename to plugins/api-docs-module-protoc-gen-doc/src/setupTests.ts
index e7d088f286..7a459ed24e 100644
--- a/plugins/search/src/components/SearchResult/index.tsx
+++ b/plugins/api-docs-module-protoc-gen-doc/src/setupTests.ts
@@ -1,5 +1,5 @@
/*
- * Copyright 2021 The Backstage Authors
+ * Copyright 2022 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { SearchResult } from './SearchResult';
+import '@testing-library/jest-dom';
diff --git a/plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx b/plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx
new file mode 100644
index 0000000000..5f35c8d9b3
--- /dev/null
+++ b/plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { GRPCSelfGeneratedAPIReference } from 'grpc-docs';
+
+/**
+ * @public
+ */
+export const grpcDocsApiWidget = {
+ type: 'grpc-docs',
+ title: 'gRPC',
+ component: (definition: string) => (
+
+ ),
+};
diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md
index 053c7d2421..2d61c19e62 100644
--- a/plugins/api-docs/CHANGELOG.md
+++ b/plugins/api-docs/CHANGELOG.md
@@ -1,5 +1,40 @@
# @backstage/plugin-api-docs
+## 0.8.6
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 811ff4bcf4: Updated `swagger-ui-react` to 4.11.1 in order to address a [XSS
+ vulnerability](https://github.com/advisories/GHSA-hqq7-2q2v-82xq) in `@braintree/sanitize-url`
+- Updated dependencies
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## 0.8.6-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## 0.8.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
## 0.8.5
### Patch Changes
diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json
index 5ac5949179..9cd1e3aef0 100644
--- a/plugins/api-docs/package.json
+++ b/plugins/api-docs/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-api-docs",
"description": "A Backstage plugin that helps represent API entities in the frontend",
- "version": "0.8.5",
+ "version": "0.8.6",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,33 +34,33 @@
},
"dependencies": {
"@asyncapi/react-component": "1.0.0-next.38",
- "@backstage/catalog-model": "^1.0.2",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/plugin-catalog": "^1.2.0",
- "@backstage/plugin-catalog-react": "^1.1.0",
+ "@backstage/catalog-model": "^1.0.3",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/plugin-catalog": "^1.3.0",
+ "@backstage/plugin-catalog-react": "^1.1.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
"graphiql": "^1.8.8",
- "graphql-ws": "^5.4.1",
"graphql": "^16.0.0",
+ "graphql-ws": "^5.4.1",
"isomorphic-form-data": "^2.0.0",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^17.2.4",
- "swagger-ui-react": "^4.1.3"
+ "swagger-ui-react": "^4.11.1"
},
"peerDependencies": {
"@types/react": "^16.13.1 || ^17.0.0",
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/dev-utils": "^1.0.2",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/dev-utils": "^1.0.3",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
@@ -68,7 +68,7 @@
"@types/node": "^16.11.26",
"@types/swagger-ui-react": "^4.1.1",
"cross-fetch": "^3.1.5",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md
index 464ad88629..6e86ece20d 100644
--- a/plugins/app-backend/CHANGELOG.md
+++ b/plugins/app-backend/CHANGELOG.md
@@ -1,5 +1,37 @@
# @backstage/plugin-app-backend
+## 0.3.33
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/config-loader@1.1.2
+
+## 0.3.33-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## 0.3.33-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/config-loader@1.1.2-next.0
+
+## 0.3.33-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
## 0.3.32
### Patch Changes
diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json
index 3d98c1ba5a..5efb839730 100644
--- a/plugins/app-backend/package.json
+++ b/plugins/app-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-app-backend",
"description": "A Backstage backend plugin that serves the Backstage frontend app",
- "version": "0.3.32",
+ "version": "0.3.33",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -33,8 +33,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
- "@backstage/config-loader": "^1.1.1",
+ "@backstage/backend-common": "^0.14.0",
+ "@backstage/config-loader": "^1.1.2",
"@backstage/config": "^1.0.1",
"@backstage/types": "^1.0.0",
"@types/express": "^4.17.6",
@@ -50,12 +50,12 @@
"yn": "^4.0.0"
},
"devDependencies": {
- "@backstage/backend-test-utils": "^0.1.24",
- "@backstage/cli": "^0.17.1",
+ "@backstage/backend-test-utils": "^0.1.25",
+ "@backstage/cli": "^0.17.2",
"@backstage/types": "^1.0.0",
"@types/supertest": "^2.0.8",
"mock-fs": "^5.1.0",
- "msw": "^0.35.0",
+ "msw": "^0.42.0",
"supertest": "^6.1.3"
},
"files": [
diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md
index 6c1ea681a1..0f69289de5 100644
--- a/plugins/auth-backend/CHANGELOG.md
+++ b/plugins/auth-backend/CHANGELOG.md
@@ -1,5 +1,51 @@
# @backstage/plugin-auth-backend
+## 0.14.1
+
+### Patch Changes
+
+- 5e055079f0: Increased key field size for signing_keys table to account for larger signature keys
+- f6aae90e4e: Added configurable algorithm field for TokenFactory
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- bc6fb57094: Updated dependency `passport` to `^0.6.0`.
+- 467facc6ea: Fix improper binding of 'this' in ALB Auth provider
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/plugin-auth-node@0.2.2
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## 0.14.1-next.2
+
+### Patch Changes
+
+- bc6fb57094: Updated dependency `passport` to `^0.6.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/plugin-auth-node@0.2.2-next.2
+
+## 0.14.1-next.1
+
+### Patch Changes
+
+- 5e055079f0: Increased key field size for signing_keys table to account for larger signature keys
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 467facc6ea: Fix improper binding of 'this' in ALB Auth provider
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.1
+ - @backstage/catalog-model@1.0.3-next.0
+
+## 0.14.1-next.0
+
+### Patch Changes
+
+- f6aae90e4e: Added configurable algorithm field for TokenFactory
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/plugin-auth-node@0.2.2-next.0
+
## 0.14.0
### Minor Changes
diff --git a/plugins/auth-backend/migrations/20220522100910_key_field_size.js b/plugins/auth-backend/migrations/20220522100910_key_field_size.js
new file mode 100644
index 0000000000..c27d038223
--- /dev/null
+++ b/plugins/auth-backend/migrations/20220522100910_key_field_size.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// @ts-check
+
+/**
+ * @param {import('knex').Knex} knex
+ */
+exports.up = async function up(knex) {
+ // Sqlite does not support alter column.
+ if (!knex.client.config.client.includes('sqlite3')) {
+ await knex.schema.alterTable('signing_keys', table => {
+ table
+ .text('key')
+ .notNullable()
+ .comment('The serialized signing key')
+ .alter({ alterType: true });
+ });
+ }
+};
+
+/**
+ * @param {import('knex').Knex} knex
+ */
+exports.down = async function down(knex) {
+ // Sqlite does not support alter column.
+ if (!knex.client.config.client.includes('sqlite3')) {
+ await knex.schema.alterTable('signing_keys', table => {
+ table
+ .string('key')
+ .notNullable()
+ .comment('The serialized signing key')
+ .alter({ alterType: true });
+ });
+ }
+};
diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json
index fbb5729843..d0a4438afa 100644
--- a/plugins/auth-backend/package.json
+++ b/plugins/auth-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend",
"description": "A Backstage backend plugin that handles authentication",
- "version": "0.14.0",
+ "version": "0.14.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -33,10 +33,10 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/plugin-auth-node": "^0.2.1",
- "@backstage/backend-common": "^0.13.3",
- "@backstage/catalog-client": "^1.0.2",
- "@backstage/catalog-model": "^1.0.2",
+ "@backstage/plugin-auth-node": "^0.2.2",
+ "@backstage/backend-common": "^0.14.0",
+ "@backstage/catalog-client": "^1.0.3",
+ "@backstage/catalog-model": "^1.0.3",
"@backstage/config": "^1.0.1",
"@backstage/errors": "^1.0.0",
"@backstage/types": "^1.0.0",
@@ -50,7 +50,7 @@
"express-promise-router": "^4.1.0",
"express-session": "^1.17.1",
"fs-extra": "10.1.0",
- "google-auth-library": "^7.6.1",
+ "google-auth-library": "^8.0.0",
"jose": "^4.6.0",
"jwt-decode": "^3.1.0",
"knex": "^1.0.2",
@@ -61,7 +61,7 @@
"node-fetch": "^2.6.7",
"node-cache": "^5.1.2",
"openid-client": "^5.1.3",
- "passport": "^0.5.2",
+ "passport": "^0.6.0",
"passport-bitbucket-oauth2": "^0.1.2",
"passport-github2": "^0.1.12",
"passport-gitlab2": "^5.0.0",
@@ -76,8 +76,8 @@
"yn": "^4.0.0"
},
"devDependencies": {
- "@backstage/backend-test-utils": "^0.1.24",
- "@backstage/cli": "^0.17.1",
+ "@backstage/backend-test-utils": "^0.1.25",
+ "@backstage/cli": "^0.17.2",
"@types/body-parser": "^1.19.0",
"@types/cookie-parser": "^1.4.2",
"@types/express-session": "^1.17.2",
@@ -88,7 +88,7 @@
"@types/passport-saml": "^1.1.3",
"@types/passport-strategy": "^0.2.35",
"@types/xml2js": "^0.4.7",
- "msw": "^0.35.0",
+ "msw": "^0.42.0",
"supertest": "^6.1.3"
},
"files": [
diff --git a/plugins/auth-backend/src/identity/TokenFactory.ts b/plugins/auth-backend/src/identity/TokenFactory.ts
index fe9d2a1b4f..44cfebfb71 100644
--- a/plugins/auth-backend/src/identity/TokenFactory.ts
+++ b/plugins/auth-backend/src/identity/TokenFactory.ts
@@ -34,6 +34,9 @@ type Options = {
keyDurationSeconds: number;
/** JWS "alg" (Algorithm) Header Parameter value. Defaults to ES256.
* Must match one of the algorithms defined for IdentityClient.
+ * When setting a different algorithm, check if the `key` field
+ * of the `signing_keys` table can fit the length of the generated keys.
+ * If not, add a knex migration file in the migrations folder.
* More info on supported algorithms: https://github.com/panva/jose */
algorithm?: string;
};
diff --git a/plugins/auth-backend/src/providers/aws-alb/provider.ts b/plugins/auth-backend/src/providers/aws-alb/provider.ts
index 78bfb9f0ec..b8d43a11e6 100644
--- a/plugins/auth-backend/src/providers/aws-alb/provider.ts
+++ b/plugins/auth-backend/src/providers/aws-alb/provider.ts
@@ -189,7 +189,7 @@ export class AwsAlbAuthProvider implements AuthProviderRouteHandlers {
};
}
- async getKey(header: JWTHeaderParameters): Promise {
+ getKey = async (header: JWTHeaderParameters): Promise => {
if (!header.kid) {
throw new AuthenticationError('No key id was specified in header');
}
@@ -208,7 +208,7 @@ export class AwsAlbAuthProvider implements AuthProviderRouteHandlers {
keyValue.export({ format: 'pem', type: 'spki' }),
);
return keyValue;
- }
+ };
}
/**
diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md
index 34deb4db30..4381303915 100644
--- a/plugins/auth-node/CHANGELOG.md
+++ b/plugins/auth-node/CHANGELOG.md
@@ -1,5 +1,38 @@
# @backstage/plugin-auth-node
+## 0.2.2
+
+### Patch Changes
+
+- 5ca0b86b88: Address corner cases where the key store was not being created at startup
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- 9079a78078: Added configurable algorithms array for IdentityClient
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## 0.2.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## 0.2.2-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## 0.2.2-next.0
+
+### Patch Changes
+
+- 9079a78078: Added configurable algorithms array for IdentityClient
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
## 0.2.1
### Patch Changes
diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json
index 301843239b..2281d2d35e 100644
--- a/plugins/auth-node/package.json
+++ b/plugins/auth-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-node",
- "version": "0.2.1",
+ "version": "0.2.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -23,7 +23,7 @@
"start": "backstage-cli package start"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
+ "@backstage/backend-common": "^0.14.0",
"@backstage/config": "^1.0.1",
"@backstage/errors": "^1.0.0",
"jose": "^4.6.0",
@@ -31,9 +31,9 @@
"winston": "^3.2.1"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"lodash": "^4.17.21",
- "msw": "^0.35.0",
+ "msw": "^0.42.0",
"uuid": "^8.0.0"
},
"files": [
diff --git a/plugins/auth-node/src/IdentityClient.ts b/plugins/auth-node/src/IdentityClient.ts
index 3799222447..0773d22c26 100644
--- a/plugins/auth-node/src/IdentityClient.ts
+++ b/plugins/auth-node/src/IdentityClient.ts
@@ -141,7 +141,7 @@ export class IdentityClient {
// Add a small margin in case clocks are out of sync
const issuedAfterLastRefresh =
payload?.iat && payload.iat > this.keyStoreUpdated - CLOCK_MARGIN_S;
- if (!keyStoreHasKey && issuedAfterLastRefresh) {
+ if (!this.keyStore || (!keyStoreHasKey && issuedAfterLastRefresh)) {
const url = await this.discovery.getBaseUrl('auth');
const endpoint = new URL(`${url}/.well-known/jwks.json`);
this.keyStore = createRemoteJWKSet(endpoint);
diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md
index 2755a273a5..f9d414bef9 100644
--- a/plugins/azure-devops-backend/CHANGELOG.md
+++ b/plugins/azure-devops-backend/CHANGELOG.md
@@ -1,5 +1,35 @@
# @backstage/plugin-azure-devops-backend
+## 0.3.12
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+
+## 0.3.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## 0.3.12-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+
+## 0.3.12-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
## 0.3.11
### Patch Changes
diff --git a/plugins/azure-devops-backend/README.md b/plugins/azure-devops-backend/README.md
index e71021471b..5dc0570bd2 100644
--- a/plugins/azure-devops-backend/README.md
+++ b/plugins/azure-devops-backend/README.md
@@ -60,7 +60,10 @@ Here's how to get the backend up and running:
// ...
async function main() {
// ...
+ // Add this line under the other lines that follow the useHotMemoize pattern
const azureDevOpsEnv = useHotMemoize(module, () => createEnv('azure-devops'));
+ // ...
+ // Insert this line under the other lines that add their routers to apiRouter in the same way
apiRouter.use('/azure-devops', await azureDevOps(azureDevOpsEnv));
```
diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json
index 852e9bf03a..e85ba907c6 100644
--- a/plugins/azure-devops-backend/package.json
+++ b/plugins/azure-devops-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops-backend",
- "version": "0.3.11",
+ "version": "0.3.12",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -23,7 +23,7 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
+ "@backstage/backend-common": "^0.14.0",
"@backstage/config": "^1.0.1",
"@backstage/plugin-azure-devops-common": "^0.2.3",
"@types/express": "^4.17.6",
@@ -35,10 +35,10 @@
"yn": "^4.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/supertest": "^2.0.8",
"supertest": "^6.1.6",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist",
diff --git a/plugins/azure-devops-common/package.json b/plugins/azure-devops-common/package.json
index 50fe55aa34..0f52082db6 100644
--- a/plugins/azure-devops-common/package.json
+++ b/plugins/azure-devops-common/package.json
@@ -32,7 +32,7 @@
"clean": "backstage-cli package clean"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1"
+ "@backstage/cli": "^0.17.2-next.0"
},
"files": [
"dist"
diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md
index 3c5466611e..8de9bd00a8 100644
--- a/plugins/azure-devops/CHANGELOG.md
+++ b/plugins/azure-devops/CHANGELOG.md
@@ -1,5 +1,35 @@
# @backstage/plugin-azure-devops
+## 0.1.22
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## 0.1.22-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## 0.1.22-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
## 0.1.21
### Patch Changes
diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md
index 9760340771..b366166d95 100644
--- a/plugins/azure-devops/api-report.md
+++ b/plugins/azure-devops/api-report.md
@@ -5,10 +5,21 @@
```ts
///
+import { ApiRef } from '@backstage/core-plugin-api';
import { BackstagePlugin } from '@backstage/core-plugin-api';
+import { BuildRun } from '@backstage/plugin-azure-devops-common';
+import { BuildRunOptions } from '@backstage/plugin-azure-devops-common';
import { DashboardPullRequest } from '@backstage/plugin-azure-devops-common';
+import { DiscoveryApi } from '@backstage/core-plugin-api';
import { Entity } from '@backstage/catalog-model';
+import { GitTag } from '@backstage/plugin-azure-devops-common';
+import { IdentityApi } from '@backstage/core-plugin-api';
+import { PullRequest } from '@backstage/plugin-azure-devops-common';
+import { PullRequestOptions } from '@backstage/plugin-azure-devops-common';
+import { RepoBuild } from '@backstage/plugin-azure-devops-common';
+import { RepoBuildOptions } from '@backstage/plugin-azure-devops-common';
import { SvgIconProps } from '@material-ui/core';
+import { Team } from '@backstage/plugin-azure-devops-common';
// Warning: (ae-missing-release-tag) "AllFilter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
@@ -55,6 +66,107 @@ export type AssignedToUserFilter = BaseFilter &
}
);
+// Warning: (ae-missing-release-tag) "AzureDevOpsApi" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
+//
+// @public (undocumented)
+export interface AzureDevOpsApi {
+ // (undocumented)
+ getAllTeams(): Promise;
+ // (undocumented)
+ getBuildRuns(
+ projectName: string,
+ repoName?: string,
+ definitionName?: string,
+ options?: BuildRunOptions,
+ ): Promise<{
+ items: BuildRun[];
+ }>;
+ // (undocumented)
+ getDashboardPullRequests(
+ projectName: string,
+ ): Promise;
+ // (undocumented)
+ getGitTags(
+ projectName: string,
+ repoName: string,
+ ): Promise<{
+ items: GitTag[];
+ }>;
+ // (undocumented)
+ getPullRequests(
+ projectName: string,
+ repoName: string,
+ options?: PullRequestOptions,
+ ): Promise<{
+ items: PullRequest[];
+ }>;
+ // (undocumented)
+ getRepoBuilds(
+ projectName: string,
+ repoName: string,
+ options?: RepoBuildOptions,
+ ): Promise<{
+ items: RepoBuild[];
+ }>;
+ // (undocumented)
+ getUserTeamIds(userId: string): Promise;
+}
+
+// Warning: (ae-missing-release-tag) "azureDevOpsApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
+//
+// @public (undocumented)
+export const azureDevOpsApiRef: ApiRef;
+
+// Warning: (ae-missing-release-tag) "AzureDevOpsClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
+//
+// @public (undocumented)
+export class AzureDevOpsClient implements AzureDevOpsApi {
+ constructor(options: {
+ discoveryApi: DiscoveryApi;
+ identityApi: IdentityApi;
+ });
+ // (undocumented)
+ getAllTeams(): Promise;
+ // (undocumented)
+ getBuildRuns(
+ projectName: string,
+ repoName?: string,
+ definitionName?: string,
+ options?: BuildRunOptions,
+ ): Promise<{
+ items: BuildRun[];
+ }>;
+ // (undocumented)
+ getDashboardPullRequests(
+ projectName: string,
+ ): Promise;
+ // (undocumented)
+ getGitTags(
+ projectName: string,
+ repoName: string,
+ ): Promise<{
+ items: GitTag[];
+ }>;
+ // (undocumented)
+ getPullRequests(
+ projectName: string,
+ repoName: string,
+ options?: PullRequestOptions,
+ ): Promise<{
+ items: PullRequest[];
+ }>;
+ // (undocumented)
+ getRepoBuilds(
+ projectName: string,
+ repoName: string,
+ options?: RepoBuildOptions,
+ ): Promise<{
+ items: RepoBuild[];
+ }>;
+ // (undocumented)
+ getUserTeamIds(userId: string): Promise;
+}
+
// Warning: (ae-missing-release-tag) "azureDevOpsPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json
index 9ddf73f5e4..8fad3a8697 100644
--- a/plugins/azure-devops/package.json
+++ b/plugins/azure-devops/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops",
- "version": "0.1.21",
+ "version": "0.1.22",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,12 +30,12 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/catalog-model": "^1.0.2",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
+ "@backstage/catalog-model": "^1.0.3",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
"@backstage/errors": "^1.0.0",
"@backstage/plugin-azure-devops-common": "^0.2.3",
- "@backstage/plugin-catalog-react": "^1.1.0",
+ "@backstage/plugin-catalog-react": "^1.1.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -49,17 +49,17 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/dev-utils": "^1.0.2",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/dev-utils": "^1.0.3",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
"@types/jest": "^26.0.7",
"@types/node": "^16.11.26",
"cross-fetch": "^3.1.5",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts
index 48177ee830..e65c1d02a3 100644
--- a/plugins/azure-devops/src/index.ts
+++ b/plugins/azure-devops/src/index.ts
@@ -26,6 +26,8 @@ export {
export { AzurePullRequestsIcon } from './components/AzurePullRequestsIcon';
+export * from './api';
+
export { FilterType } from './components/PullRequestsPage';
export type {
PullRequestColumnConfig,
diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md
index 0a40812f64..3b80f26ca1 100644
--- a/plugins/badges-backend/CHANGELOG.md
+++ b/plugins/badges-backend/CHANGELOG.md
@@ -1,5 +1,37 @@
# @backstage/plugin-badges-backend
+## 0.1.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/catalog-client@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## 0.1.27-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+
+## 0.1.27-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+
+## 0.1.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+
## 0.1.26
### Patch Changes
diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json
index cae6a418fd..d1b5d094d9 100644
--- a/plugins/badges-backend/package.json
+++ b/plugins/badges-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges-backend",
"description": "A Backstage backend plugin that generates README badges for your entities",
- "version": "0.1.26",
+ "version": "0.1.27",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,9 +34,9 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
- "@backstage/catalog-client": "^1.0.2",
- "@backstage/catalog-model": "^1.0.2",
+ "@backstage/backend-common": "^0.14.0",
+ "@backstage/catalog-client": "^1.0.3",
+ "@backstage/catalog-model": "^1.0.3",
"@backstage/config": "^1.0.1",
"@backstage/errors": "^1.0.0",
"@types/express": "^4.17.6",
@@ -48,7 +48,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
+ "@backstage/cli": "^0.17.2",
"@types/supertest": "^2.0.8",
"supertest": "^6.1.3"
},
diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md
index 33a7b76a73..ff7b290b68 100644
--- a/plugins/badges/CHANGELOG.md
+++ b/plugins/badges/CHANGELOG.md
@@ -1,5 +1,35 @@
# @backstage/plugin-badges
+## 0.2.30
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/core-components@0.9.5
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## 0.2.30-next.1
+
+### Patch Changes
+
+- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## 0.2.30-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/core-components@0.9.5-next.0
+
## 0.2.29
### Patch Changes
diff --git a/plugins/badges/package.json b/plugins/badges/package.json
index 618e6ae7f4..aeade2c50a 100644
--- a/plugins/badges/package.json
+++ b/plugins/badges/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges",
"description": "A Backstage plugin that generates README badges for your entities",
- "version": "0.2.29",
+ "version": "0.2.30",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,11 +30,11 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/catalog-model": "^1.0.2",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
+ "@backstage/catalog-model": "^1.0.3",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
"@backstage/errors": "^1.0.0",
- "@backstage/plugin-catalog-react": "^1.1.0",
+ "@backstage/plugin-catalog-react": "^1.1.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -46,17 +46,17 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/core-app-api": "^1.0.2",
- "@backstage/dev-utils": "^1.0.2",
- "@backstage/test-utils": "^1.1.0",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/core-app-api": "^1.0.3",
+ "@backstage/dev-utils": "^1.0.3",
+ "@backstage/test-utils": "^1.1.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
"@types/jest": "^26.0.7",
"@types/node": "^16.11.26",
"cross-fetch": "^3.1.5",
- "msw": "^0.35.0"
+ "msw": "^0.42.0"
},
"files": [
"dist"
diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md
index 31fd97df3d..4b0cb04530 100644
--- a/plugins/bazaar-backend/CHANGELOG.md
+++ b/plugins/bazaar-backend/CHANGELOG.md
@@ -1,5 +1,29 @@
# @backstage/plugin-bazaar-backend
+## 0.1.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0
+ - @backstage/backend-test-utils@0.1.25
+
+## 0.1.17-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.14.0-next.2
+ - @backstage/backend-test-utils@0.1.25-next.2
+
+## 0.1.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.13.6-next.0
+ - @backstage/backend-test-utils@0.1.25-next.0
+
## 0.1.16
### Patch Changes
diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json
index 8a940e5045..5f723a9dfb 100644
--- a/plugins/bazaar-backend/package.json
+++ b/plugins/bazaar-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar-backend",
- "version": "0.1.16",
+ "version": "0.1.17",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -23,8 +23,8 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.13.3",
- "@backstage/backend-test-utils": "^0.1.24",
+ "@backstage/backend-common": "^0.14.0",
+ "@backstage/backend-test-utils": "^0.1.25",
"@backstage/config": "^1.0.1",
"@types/express": "^4.17.6",
"express": "^4.17.1",
@@ -34,7 +34,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1"
+ "@backstage/cli": "^0.17.2"
},
"files": [
"dist",
diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md
index 3ae149ecfb..911390ee28 100644
--- a/plugins/bazaar/CHANGELOG.md
+++ b/plugins/bazaar/CHANGELOG.md
@@ -1,5 +1,41 @@
# @backstage/plugin-bazaar
+## 0.1.21
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.3.0
+ - @backstage/plugin-catalog-react@1.1.1
+ - @backstage/cli@0.17.2
+ - @backstage/core-components@0.9.5
+ - @backstage/catalog-client@1.0.3
+ - @backstage/core-plugin-api@1.0.3
+ - @backstage/catalog-model@1.0.3
+
+## 0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.9.5-next.1
+ - @backstage/cli@0.17.2-next.1
+ - @backstage/catalog-client@1.0.3-next.0
+ - @backstage/core-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.0.3-next.0
+ - @backstage/plugin-catalog@1.2.1-next.1
+ - @backstage/plugin-catalog-react@1.1.1-next.1
+
+## 0.1.21-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.1.1-next.0
+ - @backstage/plugin-catalog@1.2.1-next.0
+ - @backstage/cli@0.17.2-next.0
+ - @backstage/core-components@0.9.5-next.0
+
## 0.1.20
### Patch Changes
diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json
index ca26e3c800..cb3318b4e9 100644
--- a/plugins/bazaar/package.json
+++ b/plugins/bazaar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar",
- "version": "0.1.20",
+ "version": "0.1.21",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,13 +24,13 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
- "@backstage/catalog-client": "^1.0.2",
- "@backstage/catalog-model": "^1.0.2",
- "@backstage/cli": "^0.17.1",
- "@backstage/core-components": "^0.9.4",
- "@backstage/core-plugin-api": "^1.0.2",
- "@backstage/plugin-catalog": "^1.2.0",
- "@backstage/plugin-catalog-react": "^1.1.0",
+ "@backstage/catalog-client": "^1.0.3",
+ "@backstage/catalog-model": "^1.0.3",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/core-components": "^0.9.5",
+ "@backstage/core-plugin-api": "^1.0.3",
+ "@backstage/plugin-catalog": "^1.3.0",
+ "@backstage/plugin-catalog-react": "^1.1.1",
"@date-io/luxon": "1.x",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -47,8 +47,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.17.1",
- "@backstage/dev-utils": "^1.0.2",
+ "@backstage/cli": "^0.17.2",
+ "@backstage/dev-utils": "^1.0.3",
"@testing-library/jest-dom": "^5.10.1",
"cross-fetch": "^3.1.5"
},
diff --git a/packages/techdocs-common/.eslintrc.js b/plugins/bitbucket-cloud-common/.eslintrc.js
similarity index 100%
rename from packages/techdocs-common/.eslintrc.js
rename to plugins/bitbucket-cloud-common/.eslintrc.js
diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md
new file mode 100644
index 0000000000..62100f2e0b
--- /dev/null
+++ b/plugins/bitbucket-cloud-common/CHANGELOG.md
@@ -0,0 +1,34 @@
+# @backstage/plugin-bitbucket-cloud-common
+
+## 0.1.0
+
+### Minor Changes
+
+- 1dffa7dd4d: Add new common library `bitbucket-cloud-common` with a client for Bitbucket Cloud.
+
+ This client can be reused across all packages and might be the future place for additional
+ features like managing the rate limits, etc.
+
+ The client itself was generated in parts using the `@openapitools/openapi-generator-cli`.
+
+### Patch Changes
+
+- 9122060776: Updated dependency `msw` to `^0.42.0`.
+- Updated dependencies
+ - @backstage/integration@1.2.1
+
+## 0.1.0-next.0
+
+### Minor Changes
+
+- 1dffa7dd4d: Add new common library `bitbucket-cloud-common` with a client for Bitbucket Cloud.
+
+ This client can be reused across all packages and might be the future place for additional
+ features like managing the rate limits, etc.
+
+ The client itself was generated in parts using the `@openapitools/openapi-generator-cli`.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.2.1-next.1
diff --git a/plugins/bitbucket-cloud-common/README.md b/plugins/bitbucket-cloud-common/README.md
new file mode 100644
index 0000000000..f4c3bef1e2
--- /dev/null
+++ b/plugins/bitbucket-cloud-common/README.md
@@ -0,0 +1,64 @@
+# @backstage/plugin-bitbucket-cloud-common
+
+Welcome to the common package for bitbucket-cloud plugins!
+
+This common package provides a reusable API client for the Bitbucket Cloud API
+which can be reused in catalog-backend-module plugins, scaffolder modules, etc.
+
+Using a shared client allows to control all traffic going from Backstage to
+the Bitbucket Cloud API compared to separate clients or inline API calls.
+
+We may want to leverage this later to add rate limiting, etc.
+
+## How to maintain the generated code
+
+### Update the Models
+
+This command will
+
+1. [refresh the schema/OpenAPI Specification](#refresh-the-schema)
+2. [re-generate the models](#generate-models)
+3. [reduce the models to the minimal needed](#reduce-models)
+
+### Refresh the schema
+
+This command will download the latest version of the Bitbucket Cloud OpenAPI Specification
+and apply some mutations to fix bugs or improve the schema for a better code generation output.
+
+```sh
+yarn refresh-schema
+```
+
+### Generate Models
+
+The models used are created based on the [local OpenAPI Specification file](bitbucket-cloud.oas.json)
+using a code generator.
+Some post-cleanup is applied to improve the generated output.
+
+The client itself using the models is not generated.
+
+```sh
+yarn generate-models
+```
+
+### Reduce Models
+
+In order to keep the API surface minimal, this command helps to only keep the minimal part of the
+generated models by considering all `Models` module members directly or transitively used by the
+client implementation.
+
+```sh
+yarn reduce-models
+```
+
+## Adding a New Client Method
+
+If you want to add a new method to the client implementation which may use a new endpoint or "new" models
+you can
+
+1. optionally [refresh the schema](#refresh-the-schema) to get the latest version
+2. and [generate the models](#generate-models).
+
+At this point, you have **all** models usable for adding a new method using any of them.
+
+If you are ready with your addition to the client, you can [reduce the models to the minimal needed](#reduce-models).
diff --git a/plugins/bitbucket-cloud-common/api-report.md b/plugins/bitbucket-cloud-common/api-report.md
new file mode 100644
index 0000000000..367a47b9e3
--- /dev/null
+++ b/plugins/bitbucket-cloud-common/api-report.md
@@ -0,0 +1,386 @@
+## API Report File for "@backstage/plugin-bitbucket-cloud-common"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+import { BitbucketCloudIntegrationConfig } from '@backstage/integration';
+
+// @public (undocumented)
+export class BitbucketCloudClient {
+ // (undocumented)
+ static fromConfig(
+ config: BitbucketCloudIntegrationConfig,
+ ): BitbucketCloudClient;
+ // (undocumented)
+ listRepositoriesByWorkspace(
+ workspace: string,
+ options?: FilterAndSortOptions & PartialResponseOptions,
+ ): WithPagination;
+ // (undocumented)
+ searchCode(
+ workspace: string,
+ query: string,
+ options?: FilterAndSortOptions & PartialResponseOptions,
+ ): WithPagination;
+}
+
+// @public (undocumented)
+export type FilterAndSortOptions = {
+ q?: string;
+ sort?: string;
+};
+
+// @public (undocumented)
+export namespace Models {
+ export interface Account extends ModelObject {
+ account_status?: string;
+ // (undocumented)
+ created_on?: string;
+ // (undocumented)
+ display_name?: string;
+ // (undocumented)
+ has_2fa_enabled?: boolean;
+ // (undocumented)
+ links?: AccountLinks;
+ nickname?: string;
+ // (undocumented)
+ username?: string;
+ // (undocumented)
+ uuid?: string;
+ // (undocumented)
+ website?: string;
+ }
+ // (undocumented)
+ export interface AccountLinks {
+ // (undocumented)
+ avatar?: Link;
+ // (undocumented)
+ followers?: Link;
+ // (undocumented)
+ following?: Link;
+ // (undocumented)
+ html?: Link;
+ // (undocumented)
+ repositories?: Link;
+ // (undocumented)
+ self?: Link;
+ }
+ export interface Author extends ModelObject {
+ raw?: string;
+ // (undocumented)
+ user?: Account;
+ }
+ export interface BaseCommit extends ModelObject {
+ // (undocumented)
+ author?: Author;
+ // (undocumented)
+ date?: string;
+ // (undocumented)
+ hash?: string;
+ // (undocumented)
+ message?: string;
+ // (undocumented)
+ parents?: Array;
+ // (undocumented)
+ summary?: BaseCommitSummary;
+ }
+ // (undocumented)
+ export interface BaseCommitSummary {
+ html?: string;
+ markup?: BaseCommitSummaryMarkupEnum;
+ raw?: string;
+ }
+ const BaseCommitSummaryMarkupEnum: {
+ readonly Markdown: 'markdown';
+ readonly Creole: 'creole';
+ readonly Plaintext: 'plaintext';
+ };
+ export type BaseCommitSummaryMarkupEnum =
+ typeof BaseCommitSummaryMarkupEnum[keyof typeof BaseCommitSummaryMarkupEnum];
+ export interface Branch {
+ default_merge_strategy?: string;
+ // (undocumented)
+ links?: RefLinks;
+ merge_strategies?: Array;
+ name?: string;
+ // (undocumented)
+ target?: Commit;
+ // (undocumented)
+ type: string;
+ }
+ const BranchMergeStrategiesEnum: {
+ readonly MergeCommit: 'merge_commit';
+ readonly Squash: 'squash';
+ readonly FastForward: 'fast_forward';
+ };
+ export type BranchMergeStrategiesEnum =
+ typeof BranchMergeStrategiesEnum[keyof typeof BranchMergeStrategiesEnum];
+ export interface Commit extends BaseCommit {
+ // (undocumented)
+ participants?: Array;
+ // (undocumented)
+ repository?: Repository;
+ }
+ export interface CommitFile {
+ // (undocumented)
+ [key: string]: unknown;
+ // (undocumented)
+ attributes?: CommitFileAttributesEnum;
+ // (undocumented)
+ commit?: Commit;
+ escaped_path?: string;
+ path?: string;
+ // (undocumented)
+ type: string;
+ }
+ const // (undocumented)
+ CommitFileAttributesEnum: {
+ readonly Link: 'link';
+ readonly Executable: 'executable';
+ readonly Subrepository: 'subrepository';
+ readonly Binary: 'binary';
+ readonly Lfs: 'lfs';
+ };
+ // (undocumented)
+ export type CommitFileAttributesEnum =
+ typeof CommitFileAttributesEnum[keyof typeof CommitFileAttributesEnum];
+ export interface Link {
+ // (undocumented)
+ href?: string;
+ // (undocumented)
+ name?: string;
+ }
+ export interface ModelObject {
+ // (undocumented)
+ [key: string]: unknown;
+ // (undocumented)
+ type: string;
+ }
+ export interface Paginated {
+ next?: string;
+ page?: number;
+ pagelen?: number;
+ previous?: string;
+ size?: number;
+ values?: Array | Set;
+ }
+ export interface PaginatedRepositories extends Paginated {
+ values?: Set;
+ }
+ export interface Participant extends ModelObject {
+ // (undocumented)
+ approved?: boolean;
+ participated_on?: string;
+ // (undocumented)
+ role?: ParticipantRoleEnum;
+ // (undocumented)
+ state?: ParticipantStateEnum;
+ // (undocumented)
+ user?: User;
+ }
+ const // (undocumented)
+ ParticipantRoleEnum: {
+ readonly Participant: 'PARTICIPANT';
+ readonly Reviewer: 'REVIEWER';
+ };
+ // (undocumented)
+ export type ParticipantRoleEnum =
+ typeof ParticipantRoleEnum[keyof typeof ParticipantRoleEnum];
+ const // (undocumented)
+ ParticipantStateEnum: {
+ readonly Approved: 'approved';
+ readonly ChangesRequested: 'changes_requested';
+ readonly Null: 'null';
+ };
+ // (undocumented)
+ export type ParticipantStateEnum =
+ typeof ParticipantStateEnum[keyof typeof ParticipantStateEnum];
+ export interface Project extends ModelObject {
+ // (undocumented)
+ created_on?: string;
+ // (undocumented)
+ description?: string;
+ has_publicly_visible_repos?: boolean;
+ is_private?: boolean;
+ key?: string;
+ // (undocumented)
+ links?: ProjectLinks;
+ name?: string;
+ // (undocumented)
+ owner?: Team;
+ // (undocumented)
+ updated_on?: string;
+ uuid?: string;
+ }
+ // (undocumented)
+ export interface ProjectLinks {
+ // (undocumented)
+ avatar?: Link;
+ // (undocumented)
+ html?: Link;
+ }
+ // (undocumented)
+ export interface RefLinks {
+ // (undocumented)
+ commits?: Link;
+ // (undocumented)
+ html?: Link;
+ // (undocumented)
+ self?: Link;
+ }
+ export interface Repository extends ModelObject {
+ // (undocumented)
+ created_on?: string;
+ // (undocumented)
+ description?: string;
+ fork_policy?: RepositoryForkPolicyEnum;
+ full_name?: string;
+ // (undocumented)
+ has_issues?: boolean;
+ // (undocumented)
+ has_wiki?: boolean;
+ // (undocumented)
+ is_private?: boolean;
+ // (undocumented)
+ language?: string;
+ // (undocumented)
+ links?: RepositoryLinks;
+ // (undocumented)
+ mainbranch?: Branch;
+ // (undocumented)
+ name?: string;
+ // (undocumented)
+ owner?: Account;
+ // (undocumented)
+ parent?: Repository;
+ // (undocumented)
+ project?: Project;
+ // (undocumented)
+ scm?: RepositoryScmEnum;
+ // (undocumented)
+ size?: number;
+ slug?: string;
+ // (undocumented)
+ updated_on?: string;
+ uuid?: string;
+ }
+ const RepositoryForkPolicyEnum: {
+ readonly AllowForks: 'allow_forks';
+ readonly NoPublicForks: 'no_public_forks';
+ readonly NoForks: 'no_forks';
+ };
+ export type RepositoryForkPolicyEnum =
+ typeof RepositoryForkPolicyEnum[keyof typeof RepositoryForkPolicyEnum];
+ const // (undocumented)
+ RepositoryScmEnum: {
+ readonly Git: 'git';
+ };
+ // (undocumented)
+ export interface RepositoryLinks {
+ // (undocumented)
+ avatar?: Link;
+ // (undocumented)
+ clone?: Array ;
+ // (undocumented)
+ commits?: Link;
+ // (undocumented)
+ downloads?: Link;
+ // (undocumented)
+ forks?: Link;
+ // (undocumented)
+ hooks?: Link;
+ // (undocumented)
+ html?: Link;
+ // (undocumented)
+ pullrequests?: Link;
+ // (undocumented)
+ self?: Link;
+ // (undocumented)
+ watchers?: Link;
+ }
+ // (undocumented)
+ export type RepositoryScmEnum =
+ typeof RepositoryScmEnum[keyof typeof RepositoryScmEnum];
+ // (undocumented)
+ export interface SearchCodeSearchResult {
+ // (undocumented)
+ readonly content_match_count?: number;
+ // (undocumented)
+ readonly content_matches?: Array;
+ // (undocumented)
+ file?: CommitFile;
+ // (undocumented)
+ readonly path_matches?: Array;
+ // (undocumented)
+ readonly type?: string;
+ }
+ // (undocumented)
+ export interface SearchContentMatch {
+ // (undocumented)
+ readonly lines?: Array;
+ }
+ // (undocumented)
+ export interface SearchLine {
+ // (undocumented)
+ readonly line?: number;
+ // (undocumented)
+ readonly segments?: Array;
+ }
+ // (undocumented)
+ export interface SearchResultPage extends Paginated {
+ // (undocumented)
+ readonly query_substituted?: boolean;
+ readonly values?: Array;
+ }
+ // (undocumented)
+ export interface SearchSegment {
+ // (undocumented)
+ readonly match?: boolean;
+ // (undocumented)
+ readonly text?: string;
+ }
+ export interface Team extends Account {}
+ export interface User extends Account {
+ account_id?: string;
+ // (undocumented)
+ is_staff?: boolean;
+ }
+}
+
+// @public (undocumented)
+export type PaginationOptions = {
+ page?: number;
+ pagelen?: number;
+};
+
+// @public (undocumented)
+export type PartialResponseOptions = {
+ fields?: string;
+};
+
+// @public (undocumented)
+export type RequestOptions = FilterAndSortOptions &
+ PaginationOptions &
+ PartialResponseOptions & {
+ [key: string]: string | number | undefined;
+ };
+
+// @public (undocumented)
+export class WithPagination<
+ TPage extends Models.Paginated,
+ TResultItem,
+> {
+ constructor(
+ createUrl: (options: PaginationOptions) => URL,
+ fetch: (url: URL) => Promise,
+ );
+ // (undocumented)
+ getPage(options?: PaginationOptions): Promise;
+ // (undocumented)
+ iteratePages(options?: PaginationOptions): AsyncGenerator;
+ // (undocumented)
+ iterateResults(
+ options?: PaginationOptions,
+ ): AsyncGenerator, void, unknown>;
+}
+```
diff --git a/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json b/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json
new file mode 100644
index 0000000000..01cd910171
--- /dev/null
+++ b/plugins/bitbucket-cloud-common/bitbucket-cloud.oas.json
@@ -0,0 +1,25555 @@
+{
+ "openapi": "3.0.0",
+ "info": {
+ "termsOfService": "https://www.atlassian.com/legal/customer-agreement",
+ "version": "2.0",
+ "title": "Bitbucket API",
+ "description": "Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.",
+ "contact": {
+ "url": "https://support.atlassian.com/bitbucket-cloud/",
+ "name": "Bitbucket Support",
+ "email": "support@bitbucket.org"
+ }
+ },
+ "paths": {
+ "/addon": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Request has succeeded. The application has been deleted for the user."
+ },
+ "401": {
+ "description": "No authorization.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Improper authentication.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "Delete an app",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes the application for the user.\n\nThis endpoint is intended to be used by Bitbucket Connect apps\nand only supports JWT authentication -- that is how Bitbucket\nidentifies the particular installation of the app. Developers\nwith applications registered in the \"Develop Apps\" section\nof Bitbucket Marketplace need not use this endpoint as\nupdates for those applications can be sent out via the\nUI of that section.\n\n```\n$ curl -X DELETE https://api.bitbucket.org/2.0/addon \\\n -H \"Authorization: JWT \"\n```"
+ },
+ "put": {
+ "responses": {
+ "204": {
+ "description": "Request has succeeded. The installation has been updated to the new descriptor."
+ },
+ "400": {
+ "description": "Scopes have increased or decreased to none.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "No authorization.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Improper authentication.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "Update an installed app",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Updates the application installation for the user.\n\nThis endpoint is intended to be used by Bitbucket Connect apps\nand only supports JWT authentication -- that is how Bitbucket\nidentifies the particular installation of the app. Developers\nwith applications registered in the \"Develop Apps\" section\nof Bitbucket need not use this endpoint as updates for those\napplications can be sent out via the UI of that section.\n\nPassing an empty body will update the installation using the\nexisting descriptor URL.\n\n```\n$ curl -X PUT https://api.bitbucket.org/2.0/addon \\\n -H \"Authorization: JWT \" \\\n --header \"Content-Type: application/json\" \\\n --data '{}'\n```\n\nThe new `descriptor` for the installation can be also provided\nin the body directly.\n\n```\n$ curl -X PUT https://api.bitbucket.org/2.0/addon \\\n -H \"Authorization: JWT \" \\\n --header \"Content-Type: application/json\" \\\n --data '{\"descriptor\": $NEW_DESCRIPTOR}'\n```\n\nIn both these modes the URL of the descriptor cannot be changed. To\nchange the descriptor location and upgrade an installation\nthe request must be made exclusively with a `descriptor_url`.\n\n ```\n$ curl -X PUT https://api.bitbucket.org/2.0/addon \\\n -H \"Authorization: JWT \" \\\n --header \"Content-Type: application/json\" \\\n --data '{\"descriptor_url\": $NEW_URL}'\n```\n\nThe `descriptor_url` must exactly match the marketplace registration\nthat Atlassian has for the application. Contact your Atlassian\ndeveloper advocate to update this registration. Once the registration\nhas been updated you may call this resource for each installation.\n\nNote that the scopes of the application cannot be increased\nin the new descriptor nor reduced to none."
+ },
+ "parameters": []
+ },
+ "/addon/linkers": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Successful."
+ },
+ "401": {
+ "description": "Authentication must use app JWT",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "List linkers for an app",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Gets a list of all [linkers](/cloud/bitbucket/modules/linker/)\nfor the authenticated application."
+ },
+ "parameters": []
+ },
+ "/addon/linkers/{linker_key}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Successful."
+ },
+ "401": {
+ "description": "Authentication must use app JWT",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The linker does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "Get a linker for an app",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Gets a [linker](/cloud/bitbucket/modules/linker/) specified by `linker_key`\nfor the authenticated application."
+ },
+ "parameters": [
+ {
+ "name": "linker_key",
+ "in": "path",
+ "description": "The unique key of a [linker module](/cloud/bitbucket/modules/linker/)\nas defined in an application descriptor.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/addon/linkers/{linker_key}/values": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Successfully deleted the linker values."
+ },
+ "401": {
+ "description": "Authentication must use app JWT",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The linker does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "Delete all linker values",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Delete all [linker](/cloud/bitbucket/modules/linker/) values for the\nspecified linker of the authenticated application."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Successful."
+ },
+ "401": {
+ "description": "Authentication must use app JWT",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The linker does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "List linker values for a linker",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Gets a list of all [linker](/cloud/bitbucket/modules/linker/) values for the\nspecified linker of the authenticated application.\n\nA linker value lets applications supply values to modify its regular expression.\n\nThe base regular expression must use a Bitbucket-specific match group `(?K)`\nwhich will be translated to `([\\w\\-]+)`. A value must match this pattern.\n\n[Read more about linker values](/cloud/bitbucket/modules/linker/#usingthebitbucketapitosupplyvalues)"
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "Successfully created the linker value."
+ },
+ "401": {
+ "description": "Authentication must use app JWT",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The linker does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The linker already has the value being added.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "Create a linker value",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a [linker](/cloud/bitbucket/modules/linker/) value for the specified\nlinker of authenticated application.\n\nA linker value lets applications supply values to modify its regular expression.\n\nThe base regular expression must use a Bitbucket-specific match group `(?K)`\nwhich will be translated to `([\\w\\-]+)`. A value must match this pattern.\n\n[Read more about linker values](/cloud/bitbucket/modules/linker/#usingthebitbucketapitosupplyvalues)"
+ },
+ "put": {
+ "responses": {
+ "204": {
+ "description": "Successfully updated the linker values."
+ },
+ "400": {
+ "description": "Invalid input.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication must use app JWT",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The linker does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "Update a linker value",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Bulk update [linker](/cloud/bitbucket/modules/linker/) values for the specified\nlinker of the authenticated application.\n\nA linker value lets applications supply values to modify its regular expression.\n\nThe base regular expression must use a Bitbucket-specific match group `(?K)`\nwhich will be translated to `([\\w\\-]+)`. A value must match this pattern.\n\n[Read more about linker values](/cloud/bitbucket/modules/linker/#usingthebitbucketapitosupplyvalues)"
+ },
+ "parameters": [
+ {
+ "name": "linker_key",
+ "in": "path",
+ "description": "The unique key of a [linker module](/cloud/bitbucket/modules/linker/)\nas defined in an application descriptor.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/addon/linkers/{linker_key}/values/{value_id}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Successfully deleted the linker value."
+ },
+ "401": {
+ "description": "Authentication must use app JWT",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The linker value does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "Delete a linker value",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Delete a single [linker](/cloud/bitbucket/modules/linker/) value\nof the authenticated application."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Successful."
+ },
+ "401": {
+ "description": "Authentication must use app JWT",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The linker value does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Addon"],
+ "summary": "Get a linker value",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Get a single [linker](/cloud/bitbucket/modules/linker/) value\nof the authenticated application."
+ },
+ "parameters": [
+ {
+ "name": "linker_key",
+ "in": "path",
+ "description": "The unique key of a [linker module](/cloud/bitbucket/modules/linker/)\nas defined in an application descriptor.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "value_id",
+ "in": "path",
+ "description": "The numeric ID of the linker value.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ]
+ },
+ "/hook_events": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A mapping of resource/subject types pointing to their individual event types.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/subject_types"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Webhooks"],
+ "summary": "Get a webhook resource",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the webhook resource or subject types on which webhooks can\nbe registered.\n\nEach resource/subject type contains an `events` link that returns the\npaginated list of specific events each individual subject type can\nemit.\n\nThis endpoint is publicly accessible and does not require\nauthentication or scopes.\n\nExample:\n\n```\n$ curl https://api.bitbucket.org/2.0/hook_events\n\n{\n \"repository\": {\n \"links\": {\n \"events\": {\n \"href\": \"https://api.bitbucket.org/2.0/hook_events/repository\"\n }\n }\n },\n \"team\": {\n \"links\": {\n \"events\": {\n \"href\": \"https://api.bitbucket.org/2.0/hook_events/team\"\n }\n }\n },\n \"user\": {\n \"links\": {\n \"events\": {\n \"href\": \"https://api.bitbucket.org/2.0/hook_events/user\"\n }\n }\n }\n}\n```"
+ },
+ "parameters": []
+ },
+ "/hook_events/{subject_type}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of webhook types available to subscribe on.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_hook_events"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If an invalid `{subject_type}` value was specified.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Webhooks"],
+ "summary": "List subscribable webhook types",
+ "security": [
+ {
+ "oauth2": []
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of all valid webhook events for the\nspecified entity.\n**The team and user webhooks are deprecated, and you should use workspace instead.\nFor more information, see [the announcement](https://developer.atlassian.com/cloud/bitbucket/bitbucket-api-teams-deprecation/).**\n\nThis is public data that does not require any scopes or authentication.\n\nExample:\n\nNOTE: The following example is a truncated response object for the `workspace` `subject_type`.\nWe return the same structure for the other `subject_type` objects.\n\n```\n$ curl https://api.bitbucket.org/2.0/hook_events/workspace\n{\n \"page\": 1,\n \"pagelen\": 30,\n \"size\": 21,\n \"values\": [\n {\n \"category\": \"Repository\",\n \"description\": \"Whenever a repository push occurs\",\n \"event\": \"repo:push\",\n \"label\": \"Push\"\n },\n {\n \"category\": \"Repository\",\n \"description\": \"Whenever a repository fork occurs\",\n \"event\": \"repo:fork\",\n \"label\": \"Fork\"\n },\n {\n \"category\": \"Repository\",\n \"description\": \"Whenever a repository import occurs\",\n \"event\": \"repo:imported\",\n \"label\": \"Import\"\n },\n ...\n {\n \"category\":\"Pull Request\",\n \"label\":\"Approved\",\n \"description\":\"When someone has approved a pull request\",\n \"event\":\"pullrequest:approved\"\n },\n ]\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "subject_type",
+ "in": "path",
+ "description": "A resource or subject type.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "enum": ["workspace", "user", "repository", "team"]
+ }
+ }
+ ]
+ },
+ "/pullrequests/{selected_user}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "All pull requests authored by the specified user.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pullrequests"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified user does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "state",
+ "in": "query",
+ "description": "Only return pull requests that are in this state. This parameter can be repeated.",
+ "schema": {
+ "type": "string",
+ "enum": ["MERGED", "SUPERSEDED", "OPEN", "DECLINED"]
+ }
+ }
+ ],
+ "tags": ["Pullrequests"],
+ "summary": "List pull requests for a user",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns all pull requests authored by the specified user.\n\nBy default only open pull requests are returned. This can be controlled\nusing the `state` query parameter. To retrieve pull requests that are\nin one of multiple states, repeat the `state` parameter for each\nindividual state.\n\nThis endpoint also supports filtering and sorting of the results. See\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering) for more details."
+ },
+ "parameters": [
+ {
+ "name": "selected_user",
+ "in": "path",
+ "description": "This can either be the username of the pull request author, the author's UUID\nsurrounded by curly-braces, for example: `{account UUID}`, or the author's Atlassian ID.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "All public repositories.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_repositories"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "after",
+ "in": "query",
+ "description": "Filter the results to include only repositories created on or\nafter this [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601)\n timestamp. Example: `YYYY-MM-DDTHH:mm:ss.sssZ`",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "role",
+ "in": "query",
+ "description": "Filters the result based on the authenticated user's role on each repository.\n\n* **member**: returns repositories to which the user has explicit read access\n* **contributor**: returns repositories to which the user has explicit write access\n* **admin**: returns repositories to which the user has explicit administrator access\n* **owner**: returns all repositories owned by the current user\n",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": ["admin", "contributor", "member", "owner"]
+ }
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "description": "Query string to narrow down the response as per [filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n`role` parameter must also be specified.\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "Field by which the results should be sorted as per [filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Repositories"],
+ "summary": "List public repositories",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of all public repositories.\n\nThis endpoint also supports filtering and sorting of the results. See\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering) for more details."
+ },
+ "parameters": []
+ },
+ "/repositories/{workspace}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The repositories owned by the specified account.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_repositories"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified account does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "410": {
+ "description": "If the specified account marked as spam.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "role",
+ "in": "query",
+ "description": "\nFilters the result based on the authenticated user's role on each repository.\n\n* **member**: returns repositories to which the user has explicit read access\n* **contributor**: returns repositories to which the user has explicit write access\n* **admin**: returns repositories to which the user has explicit administrator access\n* **owner**: returns all repositories owned by the current user\n",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": ["admin", "contributor", "member", "owner"]
+ }
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "description": "\nQuery string to narrow down the response as per [filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "\nField by which the results should be sorted as per [filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n ",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Repositories"],
+ "summary": "List repositories in a workspace",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of all repositories owned by the specified\nworkspace.\n\nThe result can be narrowed down based on the authenticated user's role.\n\nE.g. with `?role=contributor`, only those repositories that the\nauthenticated user has write access to are returned (this includes any\nrepo the user is an admin on, as that implies write access).\n\nThis endpoint also supports filtering and sorting of the results. See\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering) for more details."
+ },
+ "parameters": [
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Indicates successful deletion."
+ },
+ "403": {
+ "description": "If the caller either does not have admin access to the repository, or the repository is set to read-only.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "redirect_to",
+ "in": "query",
+ "description": "If a repository has been moved to a new location, use this parameter to\nshow users a friendly message in the Bitbucket UI that the repository\nhas moved to a new location. However, a GET to this endpoint will still\nreturn a 404.\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Repositories"],
+ "summary": "Delete a repository",
+ "security": [
+ {
+ "oauth2": ["repository:delete"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes the repository. This is an irreversible operation.\n\nThis does not affect its forks."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The repository object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the repository is private and the authenticated user does not have access to it.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If no repository exists at this location.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "Get a repository",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the object describing this repository."
+ },
+ "post": {
+ "responses": {
+ "200": {
+ "description": "The newly created repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the input document was invalid, or if the caller lacks the privilege to create repositories under the targeted account.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository"
+ }
+ }
+ },
+ "description": "The repository that is to be created. Note that most object elements are optional. Elements \"owner\" and \"full_name\" are ignored as the URL implies them."
+ },
+ "tags": ["Repositories"],
+ "summary": "Create a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new repository.\n\nNote: In order to set the project for the newly created repository,\npass in either the project key or the project UUID as part of the\nrequest body as shown in the examples below:\n\n```\n$ curl -X POST -H \"Content-Type: application/json\" -d '{\n \"scm\": \"git\",\n \"project\": {\n \"key\": \"MARS\"\n }\n}' https://api.bitbucket.org/2.0/repositories/teamsinspace/hablanding\n```\n\nor\n\n```\n$ curl -X POST -H \"Content-Type: application/json\" -d '{\n \"scm\": \"git\",\n \"project\": {\n \"key\": \"{ba516952-992a-4c2d-acbd-17d502922f96}\"\n }\n}' https://api.bitbucket.org/2.0/repositories/teamsinspace/hablanding\n```\n\nThe project must be assigned for all repositories. If the project is not provided,\nthe repository is automatically assigned to the oldest project in the workspace.\n\nNote: In the examples above, the workspace ID `teamsinspace`,\nand/or the repository name `hablanding` can be replaced by UUIDs."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The existing repository has been updated",
+ "headers": {
+ "Location": {
+ "description": "The location of the repository. This header is only\nprovided when the repository's name is changed.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository"
+ }
+ }
+ }
+ },
+ "201": {
+ "description": "A new repository has been created",
+ "headers": {
+ "Location": {
+ "description": "The location of the newly created repository",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the input document was invalid, or if the caller lacks the privilege to create repositories under the targeted account.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository"
+ }
+ }
+ },
+ "description": "The repository that is to be updated.\n\nNote that the elements \"owner\" and \"full_name\" are ignored since the\nURL implies them.\n"
+ },
+ "tags": ["Repositories"],
+ "summary": "Update a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Since this endpoint can be used to both update and to create a\nrepository, the request body depends on the intent.\n\n#### Creation\n\nSee the POST documentation for the repository endpoint for an example\nof the request body.\n\n#### Update\n\nNote: Changing the `name` of the repository will cause the location to\nbe changed. This is because the URL of the repo is derived from the\nname (a process called slugification). In such a scenario, it is\npossible for the request to fail if the newly created slug conflicts\nwith an existing repository's slug. But if there is no conflict,\nthe new location will be returned in the `Location` header of the\nresponse."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/branch-restrictions": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of branch restrictions",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_branchrestrictions"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have admin access to the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "kind",
+ "in": "query",
+ "description": "Branch restrictions of this type",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "pattern",
+ "in": "query",
+ "description": "Branch restrictions applied to branches of this pattern",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Branch restrictions"],
+ "summary": "List branch restrictions",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of all branch restrictions on the\nrepository."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "A paginated list of branch restrictions",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branchrestriction"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have admin access to the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branchrestriction"
+ }
+ }
+ },
+ "description": "The new rule",
+ "required": true
+ },
+ "tags": ["Branch restrictions"],
+ "summary": "Create a branch restriction rule",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new branch restriction rule for a repository.\n\n`kind` describes what will be restricted. Allowed values include:\n`push`, `force`, `delete` and `restrict_merges`.\n\nDifferent kinds of branch restrictions have different requirements:\n\n* `push` and `restrict_merges` require `users` and `groups` to be\n specified. Empty lists are allowed, in which case permission is\n denied for everybody.\n\nThe restriction applies to all branches that match. There are\ntwo ways to match a branch. It is configured in `branch_match_kind`:\n\n1. `glob`: Matches a branch against the `pattern`. A `'*'` in\n `pattern` will expand to match zero or more characters, and every\n other character matches itself. For example, `'foo*'` will match\n `'foo'` and `'foobar'`, but not `'barfoo'`. `'*'` will match all\n branches.\n2. `branching_model`: Matches a branch against the repository's\n branching model. The `branch_type` controls the type of branch\n to match. Allowed values include: `production`, `development`,\n `bugfix`, `release`, `feature` and `hotfix`.\n\nThe combination of `kind` and match must be unique. This means that\ntwo `glob` restrictions in a repository cannot have the same `kind` and\n`pattern`. Additionally, two `branching_model` restrictions in a\nrepository cannot have the same `kind` and `branch_type`.\n\n`users` and `groups` are lists of users and groups that are except from\nthe restriction. They can only be configured in `push` and\n`restrict_merges` restrictions. The `push` restriction stops a user\npushing to matching branches unless that user is in `users` or is a\nmember of a group in `groups`. The `restrict_merges` stops a user\nmerging pull requests to matching branches unless that user is in\n`users` or is a member of a group in `groups`. Adding new users or\ngroups to an existing restriction should be done via `PUT`.\n\nNote that branch restrictions with overlapping matchers is allowed,\nbut the resulting behavior may be surprising."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/branch-restrictions/{id}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": ""
+ },
+ "401": {
+ "description": "If the request was not authenticated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have admin access to the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository or branch restriction id does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Branch restrictions"],
+ "summary": "Delete a branch restriction rule",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes an existing branch restriction rule."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The branch restriction rule",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branchrestriction"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have admin access to the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository or branch restriction id does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Branch restrictions"],
+ "summary": "Get a branch restriction rule",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a specific branch restriction rule."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The updated branch restriction rule",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branchrestriction"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have admin access to the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository or branch restriction id does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branchrestriction"
+ }
+ }
+ },
+ "description": "The new version of the existing rule",
+ "required": true
+ },
+ "tags": ["Branch restrictions"],
+ "summary": "Update a branch restriction rule",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Updates an existing branch restriction rule.\n\nFields not present in the request body are ignored.\n\nSee [`POST`](/cloud/bitbucket/rest/api-group-branch-restrictions/#api-repositories-workspace-repo-slug-branch-restrictions-post) for details."
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The restriction rule's id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/branching-model": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The branching model object",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branching_model"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have read access to the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Branching model"],
+ "summary": "Get the branching model for a repository",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Return the branching model as applied to the repository. This view is\nread-only. The branching model settings can be changed using the\n[settings](branching-model/settings#get) API.\n\nThe returned object:\n\n1. Always has a `development` property. `development.branch` contains\n the actual repository branch object that is considered to be the\n `development` branch. `development.branch` will not be present\n if it does not exist.\n2. Might have a `production` property. `production` will not\n be present when `production` is disabled.\n `production.branch` contains the actual branch object that is\n considered to be the `production` branch. `production.branch` will\n not be present if it does not exist.\n3. Always has a `branch_types` array which contains all enabled branch\n types.\n\nExample body:\n\n```\n{\n \"development\": {\n \"name\": \"master\",\n \"branch\": {\n \"type\": \"branch\",\n \"name\": \"master\",\n \"target\": {\n \"hash\": \"16dffcb0de1b22e249db6799532074cf32efe80f\"\n }\n },\n \"use_mainbranch\": true\n },\n \"production\": {\n \"name\": \"production\",\n \"branch\": {\n \"type\": \"branch\",\n \"name\": \"production\",\n \"target\": {\n \"hash\": \"16dffcb0de1b22e249db6799532074cf32efe80f\"\n }\n },\n \"use_mainbranch\": false\n },\n \"branch_types\": [\n {\n \"kind\": \"release\",\n \"prefix\": \"release/\"\n },\n {\n \"kind\": \"hotfix\",\n \"prefix\": \"hotfix/\"\n },\n {\n \"kind\": \"feature\",\n \"prefix\": \"feature/\"\n },\n {\n \"kind\": \"bugfix\",\n \"prefix\": \"bugfix/\"\n }\n ],\n \"type\": \"branching_model\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/.../branching-model\"\n }\n }\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/branching-model/settings": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The branching model configuration",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branching_model_settings"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have admin access to the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Branching model"],
+ "summary": "Get the branching model config for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Return the branching model configuration for a repository. The returned\nobject:\n\n1. Always has a `development` property for the development branch.\n2. Always a `production` property for the production branch. The\n production branch can be disabled.\n3. The `branch_types` contains all the branch types.\n\nThis is the raw configuration for the branching model. A client\nwishing to see the branching model with its actual current branches may\nfind the [active model API](/cloud/bitbucket/rest/api-group-branching-model/#api-repositories-workspace-repo-slug-branching-model-get) more useful.\n\nExample body:\n\n```\n{\n \"development\": {\n \"is_valid\": true,\n \"name\": null,\n \"use_mainbranch\": true\n },\n \"production\": {\n \"is_valid\": true,\n \"name\": \"production\",\n \"use_mainbranch\": false,\n \"enabled\": false\n },\n \"branch_types\": [\n {\n \"kind\": \"release\",\n \"enabled\": true,\n \"prefix\": \"release/\"\n },\n {\n \"kind\": \"hotfix\",\n \"enabled\": true,\n \"prefix\": \"hotfix/\"\n },\n {\n \"kind\": \"feature\",\n \"enabled\": true,\n \"prefix\": \"feature/\"\n },\n {\n \"kind\": \"bugfix\",\n \"enabled\": false,\n \"prefix\": \"bugfix/\"\n }\n ],\n \"type\": \"branching_model_settings\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/.../branching-model/settings\"\n }\n }\n}\n```"
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The updated branching model configuration",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branching_model_settings"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the request contains invalid branching model configuration",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have admin access to the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Branching model"],
+ "summary": "Update the branching model config for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Update the branching model configuration for a repository.\n\nThe `development` branch can be configured to a specific branch or to\ntrack the main branch. When set to a specific branch it must\ncurrently exist. Only the passed properties will be updated. The\nproperties not passed will be left unchanged. A request without a\n`development` property will leave the development branch unchanged.\n\nIt is possible for the `development` branch to be invalid. This\nhappens when it points at a specific branch that has been\ndeleted. This is indicated in the `is_valid` field for the branch. It is\nnot possible to update the settings for `development` if that\nwould leave the branch in an invalid state. Such a request will be\nrejected.\n\nThe `production` branch can be a specific branch, the main\nbranch or disabled. When set to a specific branch it must currently\nexist. The `enabled` property can be used to enable (`true`) or\ndisable (`false`) it. Only the passed properties will be updated. The\nproperties not passed will be left unchanged. A request without a\n`production` property will leave the production branch unchanged.\n\nIt is possible for the `production` branch to be invalid. This\nhappens when it points at a specific branch that has been\ndeleted. This is indicated in the `is_valid` field for the branch. A\nrequest that would leave `production` enabled and invalid will be\nrejected. It is possible to update `production` and make it invalid if\nit would also be left disabled.\n\nThe `branch_types` property contains the branch types to be updated.\nOnly the branch types passed will be updated. All updates will be\nrejected if it would leave the branching model in an invalid state.\nFor branch types this means that:\n\n1. The prefixes for all enabled branch types are valid. For example,\n it is not possible to use '*' inside a Git prefix.\n2. A prefix of an enabled branch type must not be a prefix of another\n enabled branch type. This is to ensure that a branch can be easily\n classified by its prefix unambiguously.\n\nIt is possible to store an invalid prefix if that branch type would be\nleft disabled. Only the passed properties will be updated. The\nproperties not passed will be left unchanged. Each branch type must\nhave a `kind` property to identify it.\n\nExample Body:\n\n```\n {\n \"development\": {\n \"use_mainbranch\": true\n },\n \"production\": {\n \"enabled\": true,\n \"use_mainbranch\": false,\n \"name\": \"production\"\n },\n \"branch_types\": [\n {\n \"kind\": \"bugfix\",\n \"enabled\": true,\n \"prefix\": \"bugfix/\"\n },\n {\n \"kind\": \"feature\",\n \"enabled\": true,\n \"prefix\": \"feature/\"\n },\n {\n \"kind\": \"hotfix\",\n \"prefix\": \"hotfix/\"\n },\n {\n \"kind\": \"release\",\n \"enabled\": false,\n }\n ]\n }\n```\n\nThere is currently a side effect when using this API endpoint. If the\nrepository is inheriting branching model settings from its project,\nupdating the branching model for this repository will disable the\nproject setting inheritance.\n\n\nWe have deprecated this side effect and will remove it on 1 August 2022."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The commit object",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commit"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified commit or repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "Get a commit",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified commit.\n\nExample:\n\n```\n$ curl https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/commit/f7591a1\n{\n \"rendered\": {\n \"message\": {\n \"raw\": \"Add a GEORDI_OUTPUT_DIR setting\",\n \"markup\": \"markdown\",\n \"html\": \"Add a GEORDI_OUTPUT_DIR setting
\",\n \"type\": \"rendered\"\n }\n },\n \"hash\": \"f7591a13eda445d9a9167f98eb870319f4b6c2d8\",\n \"repository\": {\n \"name\": \"geordi\",\n \"type\": \"repository\",\n \"full_name\": \"bitbucket/geordi\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/bitbucket/geordi\"\n },\n \"avatar\": {\n \"href\": \"https://bytebucket.org/ravatar/%7B85d08b4e-571d-44e9-a507-fa476535aa98%7D?ts=1730260\"\n }\n },\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/commit/f7591a13eda445d9a9167f98eb870319f4b6c2d8\"\n },\n \"comments\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/commit/f7591a13eda445d9a9167f98eb870319f4b6c2d8/comments\"\n },\n \"patch\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/patch/f7591a13eda445d9a9167f98eb870319f4b6c2d8\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/bitbucket/geordi/commits/f7591a13eda445d9a9167f98eb870319f4b6c2d8\"\n },\n \"diff\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/diff/f7591a13eda445d9a9167f98eb870319f4b6c2d8\"\n },\n \"approve\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/commit/f7591a13eda445d9a9167f98eb870319f4b6c2d8/approve\"\n },\n \"statuses\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/commit/f7591a13eda445d9a9167f98eb870319f4b6c2d8/statuses\"\n }\n },\n \"author\": {\n \"raw\": \"Brodie Rao \",\n \"type\": \"author\",\n \"user\": {\n \"display_name\": \"Brodie Rao\",\n \"uuid\": \"{9484702e-c663-4afd-aefb-c93a8cd31c28}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/users/%7B9484702e-c663-4afd-aefb-c93a8cd31c28%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B9484702e-c663-4afd-aefb-c93a8cd31c28%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/557058:3aae1e05-702a-41e5-81c8-f36f29afb6ca/613070db-28b0-421f-8dba-ae8a87e2a5c7/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"brodie\",\n \"account_id\": \"557058:3aae1e05-702a-41e5-81c8-f36f29afb6ca\"\n }\n },\n \"summary\": {\n \"raw\": \"Add a GEORDI_OUTPUT_DIR setting\",\n \"markup\": \"markdown\",\n \"html\": \"Add a GEORDI_OUTPUT_DIR setting
\",\n \"type\": \"rendered\"\n },\n \"participants\": [],\n \"parents\": [\n {\n \"type\": \"commit\",\n \"hash\": \"f06941fec4ef6bcb0c2456927a0cf258fa4f899b\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/commit/f06941fec4ef6bcb0c2456927a0cf258fa4f899b\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/bitbucket/geordi/commits/f06941fec4ef6bcb0c2456927a0cf258fa4f899b\"\n }\n }\n }\n ],\n \"date\": \"2012-07-16T19:37:54+00:00\",\n \"message\": \"Add a GEORDI_OUTPUT_DIR setting\",\n \"type\": \"commit\"\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "commit",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/approve": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "An empty response indicating the authenticated user's approval has been withdrawn."
+ },
+ "404": {
+ "description": "If the specified commit, or the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "Unapprove a commit",
+ "security": [
+ {
+ "oauth2": ["repository:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Redact the authenticated user's approval of the specified commit.\n\nThis operation is only available to users that have explicit access to\nthe repository. In contrast, just the fact that a repository is\npublicly accessible to users does not give them the ability to approve\ncommits."
+ },
+ "post": {
+ "responses": {
+ "200": {
+ "description": "The `participant` object recording that the authenticated user approved the commit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/participant"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified commit, or the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "Approve a commit",
+ "security": [
+ {
+ "oauth2": ["repository:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Approve the specified commit as the authenticated user.\n\nThis operation is only available to users that have explicit access to\nthe repository. In contrast, just the fact that a repository is\npublicly accessible to users does not give them the ability to approve\ncommits."
+ },
+ "parameters": [
+ {
+ "name": "commit",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/comments": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of commit comments.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_commit_comments"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "description": "Query string to narrow down the response as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "Field by which the results should be sorted as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Commits"],
+ "summary": "List a commit's comments",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the commit's comments.\n\nThis includes both global and inline comments.\n\nThe default sorting is oldest to newest and can be overridden with\nthe `sort` query parameter."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created comment.",
+ "headers": {
+ "Location": {
+ "description": "The location of the newly created comment.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the comment was detected as spam, or if the parent comment is not attached to the same node as the new comment"
+ },
+ "404": {
+ "description": "If a parent ID was passed in that cannot be found"
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commit_comment"
+ }
+ }
+ },
+ "description": "The specified comment.",
+ "required": true
+ },
+ "tags": ["Commits"],
+ "summary": "Create comment for a commit",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates new comment on the specified commit.\n\nTo post a reply to an existing comment, include the `parent.id` field:\n\n```\n$ curl https://api.bitbucket.org/2.0/repositories/atlassian/prlinks/commit/db9ba1e031d07a02603eae0e559a7adc010257fc/comments/ \\\n -X POST -u evzijst \\\n -H 'Content-Type: application/json' \\\n -d '{\"content\": {\"raw\": \"One more thing!\"},\n \"parent\": {\"id\": 5728901}}'\n```"
+ },
+ "parameters": [
+ {
+ "name": "commit",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/comments/{comment_id}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The commit comment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commit_comment"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "Get a commit comment",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified commit comment."
+ },
+ "parameters": [
+ {
+ "name": "comment_id",
+ "in": "path",
+ "description": "The id of the comment.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "commit",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/properties/{app_key}/{property_name}": {
+ "put": {
+ "responses": {
+ "204": {
+ "description": "An empty response."
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The commit.",
+ "in": "path",
+ "name": "commit",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "$ref": "#/components/requestBodies/application_property"
+ },
+ "tags": ["properties"],
+ "description": "Update an [application property](/cloud/bitbucket/application-properties/) value stored against a commit.",
+ "summary": "Update a commit application property",
+ "operationId": "updateCommitHostedPropertyValue"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "An empty response."
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The commit.",
+ "in": "path",
+ "name": "commit",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["properties"],
+ "description": "Delete an [application property](/cloud/bitbucket/application-properties/) value stored against a commit.",
+ "summary": "Delete a commit application property",
+ "operationId": "deleteCommitHostedPropertyValue"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The value of the property.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/application_property"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The commit.",
+ "in": "path",
+ "name": "commit",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["properties"],
+ "description": "Retrieve an [application property](/cloud/bitbucket/application-properties/) value stored against a commit.",
+ "summary": "Get a commit application property",
+ "operationId": "getCommitHostedPropertyValue"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/pullrequests": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The paginated list of pull requests.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pullrequests"
+ }
+ }
+ }
+ },
+ "202": {
+ "description": "The repository's pull requests are still being indexed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pullrequests"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Either the repository does not exist, or pull request commit links have not yet been indexed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository; either the UUID in curly braces, or the slug",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The SHA1 of the commit",
+ "in": "path",
+ "name": "commit",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Which page to retrieve",
+ "required": false,
+ "in": "query",
+ "name": "page",
+ "schema": {
+ "type": "integer",
+ "format": "int32",
+ "default": 1
+ }
+ },
+ {
+ "description": "How many pull requests to retrieve per page",
+ "required": false,
+ "in": "query",
+ "name": "pagelen",
+ "schema": {
+ "type": "integer",
+ "format": "int32",
+ "default": 30
+ }
+ }
+ ],
+ "tags": ["Pullrequests"],
+ "summary": "List pull requests that contain a commit",
+ "operationId": "getPullrequestsForCommit",
+ "description": "Returns a paginated list of all pull requests as part of which this commit was reviewed. Pull Request Commit Links app must be installed first before using this API; installation automatically occurs when 'Go to pull request' is clicked from the web interface for a commit's details."
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/reports": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_reports"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit for which to retrieve reports.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Reports", "Commits"],
+ "summary": "List reports",
+ "operationId": "getReportsForCommit",
+ "description": "Returns a paginated list of Reports linked to this commit."
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/reports/{reportId}": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/report"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The provided Report object is malformed or incomplete.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit the report belongs to.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the report.",
+ "required": true,
+ "name": "reportId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/report"
+ }
+ }
+ },
+ "description": "The report to create or update",
+ "required": true
+ },
+ "tags": ["Reports", "Commits"],
+ "summary": "Create or update a report",
+ "operationId": "createOrUpdateReport",
+ "description": "Creates or updates a report for the specified commit.\nTo upload a report, make sure to generate an ID that is unique across all reports for that commit. If you want to use an existing id from your own system, we recommend prefixing it with your system's name to avoid collisions, for example, mySystem-001.\n\n### Sample cURL request:\n```\ncurl --request PUT 'https://api.bitbucket.org/2.0/repositories///commit//reports/mysystem-001' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"title\": \"Security scan report\",\n \"details\": \"This pull request introduces 10 new dependency vulnerabilities.\",\n \"report_type\": \"SECURITY\",\n \"reporter\": \"mySystem\",\n \"link\": \"http://www.mysystem.com/reports/001\",\n \"result\": \"FAILED\",\n \"data\": [\n {\n \"title\": \"Duration (seconds)\",\n \"type\": \"DURATION\",\n \"value\": 14\n },\n {\n \"title\": \"Safe to merge?\",\n \"type\": \"BOOLEAN\",\n \"value\": false\n }\n ]\n}'\n```\n\n### Possible field values:\nreport_type: SECURITY, COVERAGE, TEST, BUG\nresult: PASSED, FAILED, PENDING\ndata.type: BOOLEAN, DATE, DURATION, LINK, NUMBER, PERCENTAGE, TEXT\n\n#### Data field formats\n| Type Field | Value Field Type | Value Field Display |\n|:--------------|:------------------|:--------------------|\n| None/ Omitted | Number, String or Boolean (not an array or object) | Plain text |\n| BOOLEAN\t| Boolean | The value will be read as a JSON boolean and displayed as 'Yes' or 'No'. |\n| DATE | Number | The value will be read as a JSON number in the form of a Unix timestamp (milliseconds) and will be displayed as a relative date if the date is less than one week ago, otherwise it will be displayed as an absolute date. |\n| DURATION | Number | The value will be read as a JSON number in milliseconds and will be displayed in a human readable duration format. |\n| LINK | Object: `{\"text\": \"Link text here\", \"href\": \"https://link.to.annotation/in/external/tool\"}` | The value will be read as a JSON object containing the fields \"text\" and \"href\" and will be displayed as a clickable link on the report. |\n| NUMBER | Number | The value will be read as a JSON number and large numbers will be displayed in a human readable format (e.g. 14.3k). |\n| PERCENTAGE | Number (between 0 and 100) | The value will be read as a JSON number between 0 and 100 and will be displayed with a percentage sign. |\n| TEXT | String | The value will be read as a JSON string and will be displayed as-is |\n\nPlease refer to the [Code Insights documentation](https://confluence.atlassian.com/bitbucket/code-insights-994316785.html) for more information.\n"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/report"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The report with the given ID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit the report belongs to.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the report.",
+ "required": true,
+ "name": "reportId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Reports", "Commits"],
+ "summary": "Get a report",
+ "operationId": "getReport",
+ "description": "Returns a single Report matching the provided ID."
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "No content"
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit the report belongs to.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the report.",
+ "required": true,
+ "name": "reportId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Reports", "Commits"],
+ "summary": "Delete a report",
+ "operationId": "deleteReport",
+ "description": "Deletes a single Report matching the provided ID."
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/reports/{reportId}/annotations": {
+ "post": {
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/report_annotation"
+ },
+ "type": "array"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit for which to retrieve reports.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Uuid or external-if of the report for which to get annotations for.",
+ "required": true,
+ "name": "reportId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "minItems": 1,
+ "items": {
+ "$ref": "#/components/schemas/report_annotation"
+ },
+ "type": "array",
+ "maxItems": 100
+ }
+ }
+ },
+ "description": "The annotations to create or update",
+ "required": true
+ },
+ "tags": ["Reports", "Commits"],
+ "summary": "Bulk create or update annotations",
+ "operationId": "bulkCreateOrUpdateAnnotations",
+ "description": "Bulk upload of annotations.\nAnnotations are individual findings that have been identified as part of a report, for example, a line of code that represents a vulnerability. These annotations can be attached to a specific file and even a specific line in that file, however, that is optional. Annotations are not mandatory and a report can contain up to 1000 annotations.\n\nAdd the annotations you want to upload as objects in a JSON array and make sure each annotation has the external_id field set to a unique value. If you want to use an existing id from your own system, we recommend prefixing it with your system's name to avoid collisions, for example, mySystem-annotation001. The external id can later be used to identify the report as an alternative to the generated [UUID](https://developer.atlassian.com/bitbucket/api/2/reference/meta/uri-uuid#uuid). You can upload up to 100 annotations per POST request.\n\n### Sample cURL request:\n```\ncurl --location 'https://api.bitbucket.org/2.0/repositories///commit//reports/mysystem-001/annotations' \\\n--header 'Content-Type: application/json' \\\n--data-raw '[\n {\n \"external_id\": \"mysystem-annotation001\",\n \"title\": \"Security scan report\",\n \"annotation_type\": \"VULNERABILITY\",\n \"summary\": \"This line represents a security threat.\",\n \"severity\": \"HIGH\",\n \"path\": \"my-service/src/main/java/com/myCompany/mysystem/logic/Main.java\",\n \"line\": 42\n },\n {\n \"external_id\": \"mySystem-annotation002\",\n \"title\": \"Bug report\",\n \"annotation_type\": \"BUG\",\n \"result\": \"FAILED\",\n \"summary\": \"This line might introduce a bug.\",\n \"severity\": \"MEDIUM\",\n \"path\": \"my-service/src/main/java/com/myCompany/mysystem/logic/Helper.java\",\n \"line\": 13\n }\n]'\n```\n\n### Possible field values:\nannotation_type: VULNERABILITY, CODE_SMELL, BUG\nresult: PASSED, FAILED, IGNORED, SKIPPED\nseverity: HIGH, MEDIUM, LOW, CRITICAL\n\nPlease refer to the [Code Insights documentation](https://confluence.atlassian.com/bitbucket/code-insights-994316785.html) for more information.\n"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_annotations"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit for which to retrieve reports.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Uuid or external-if of the report for which to get annotations for.",
+ "required": true,
+ "name": "reportId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Reports", "Commits"],
+ "summary": "List annotations",
+ "operationId": "getAnnotationsForReport",
+ "description": "Returns a paginated list of Annotations for a specified report."
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/reports/{reportId}/annotations/{annotationId}": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/report_annotation"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The provided Annotation object is malformed or incomplete.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit the report belongs to.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the report.",
+ "required": true,
+ "name": "reportId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the annotation.",
+ "required": true,
+ "name": "annotationId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/report_annotation"
+ }
+ }
+ },
+ "description": "The annotation to create or update",
+ "required": true
+ },
+ "tags": ["Reports", "Commits"],
+ "summary": "Create or update an annotation",
+ "operationId": "createOrUpdateAnnotation",
+ "description": "Creates or updates an individual annotation for the specified report.\nAnnotations are individual findings that have been identified as part of a report, for example, a line of code that represents a vulnerability. These annotations can be attached to a specific file and even a specific line in that file, however, that is optional. Annotations are not mandatory and a report can contain up to 1000 annotations.\n\nJust as reports, annotation needs to be uploaded with a unique ID that can later be used to identify the report as an alternative to the generated [UUID](https://developer.atlassian.com/bitbucket/api/2/reference/meta/uri-uuid#uuid). If you want to use an existing id from your own system, we recommend prefixing it with your system's name to avoid collisions, for example, mySystem-annotation001.\n\n### Sample cURL request:\n```\ncurl --request PUT 'https://api.bitbucket.org/2.0/repositories///commit//reports/mySystem-001/annotations/mysystem-annotation001' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"title\": \"Security scan report\",\n \"annotation_type\": \"VULNERABILITY\",\n \"summary\": \"This line represents a security thread.\",\n \"severity\": \"HIGH\",\n \"path\": \"my-service/src/main/java/com/myCompany/mysystem/logic/Main.java\",\n \"line\": 42\n}'\n```\n\n### Possible field values:\nannotation_type: VULNERABILITY, CODE_SMELL, BUG\nresult: PASSED, FAILED, IGNORED, SKIPPED\nseverity: HIGH, MEDIUM, LOW, CRITICAL\n\nPlease refer to the [Code Insights documentation](https://confluence.atlassian.com/bitbucket/code-insights-994316785.html) for more information.\n"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/report_annotation"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The annotation with the given ID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit the report belongs to.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the report.",
+ "required": true,
+ "name": "reportId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the annotation.",
+ "required": true,
+ "name": "annotationId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Reports", "Commits"],
+ "summary": "Get an annotation",
+ "operationId": "getAnnotation",
+ "description": "Returns a single Annotation matching the provided ID."
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "No content"
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The commit the annotation belongs to.",
+ "required": true,
+ "name": "commit",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the annotation.",
+ "required": true,
+ "name": "reportId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Either the uuid or external-id of the annotation.",
+ "required": true,
+ "name": "annotationId",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Reports", "Commits"],
+ "summary": "Delete an annotation",
+ "operationId": "deleteAnnotation",
+ "description": "Deletes a single Annotation matching the provided ID."
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/statuses": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of all commit statuses for this commit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_commitstatuses"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the repository or commit does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "description": "Query string to narrow down the response as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "Field by which the results should be sorted as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\nDefaults to `created_on`.\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Commit statuses"],
+ "summary": "List commit statuses for a commit",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns all statuses (e.g. build results) for a specific commit."
+ },
+ "parameters": [
+ {
+ "name": "commit",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/statuses/build": {
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created build status object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commitstatus"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the repository, commit, or build status key does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commitstatus"
+ }
+ }
+ },
+ "description": "The new commit status object."
+ },
+ "tags": ["Commit statuses"],
+ "summary": "Create a build status for a commit",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new build status against the specified commit.\n\nIf the specified key already exists, the existing status object will\nbe overwritten.\n\nExample:\n\n```\ncurl https://api.bitbucket.org/2.0/repositories/my-workspace/my-repo/commit/e10dae226959c2194f2b07b077c07762d93821cf/statuses/build/ -X POST -u jdoe -H 'Content-Type: application/json' -d '{\n \"key\": \"MY-BUILD\",\n \"state\": \"SUCCESSFUL\",\n \"description\": \"42 tests passed\",\n \"url\": \"https://www.example.org/my-build-result\"\n }'\n```\n\nWhen creating a new commit status, you can use a URI template for the URL.\nTemplates are URLs that contain variable names that Bitbucket will\nevaluate at runtime whenever the URL is displayed anywhere similar to\nparameter substitution in\n[Bitbucket Connect](https://developer.atlassian.com/bitbucket/concepts/context-parameters.html).\nFor example, one could use `https://foo.com/builds/{repository.full_name}`\nwhich Bitbucket will turn into `https://foo.com/builds/foo/bar` at render time.\nThe context variables available are `repository` and `commit`."
+ },
+ "parameters": [
+ {
+ "name": "commit",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commit/{commit}/statuses/build/{key}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The build status object with the specified key.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commitstatus"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the repository, commit, or build status key does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commit statuses"],
+ "summary": "Get a build status for a commit",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified build status for a commit."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The updated build status object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commitstatus"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the repository or build does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commitstatus"
+ }
+ }
+ },
+ "description": "The updated build status object"
+ },
+ "tags": ["Commit statuses"],
+ "summary": "Update a build status for a commit",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Used to update the current status of a build status object on the\nspecific commit.\n\nThis operation can also be used to change other properties of the\nbuild status:\n\n* `state`\n* `name`\n* `description`\n* `url`\n* `refname`\n\nThe `key` cannot be changed."
+ },
+ "parameters": [
+ {
+ "name": "commit",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "key",
+ "in": "path",
+ "description": "The build status' unique key",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commits": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of commits",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_changeset"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "List commits",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "These are the repository's commits. They are paginated and returned\nin reverse chronological order, similar to the output of `git log`.\nLike these tools, the DAG can be filtered.\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/\n\nReturns all commits in the repo in topological order (newest commit\nfirst). All branches and tags are included (similar to\n`git log --all`).\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/?exclude=master\n\nReturns all commits in the repo that are not on master\n(similar to `git log --all ^master`).\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/?include=foo&include=bar&exclude=fu&exclude=fubar\n\nReturns all commits that are on refs `foo` or `bar`, but not on `fu` or\n`fubar` (similar to `git log foo bar ^fu ^fubar`).\n\nAn optional `path` parameter can be specified that will limit the\nresults to commits that affect that path. `path` can either be a file\nor a directory. If a directory is specified, commits are returned that\nhave modified any file in the directory tree rooted by `path`. It is\nimportant to note that if the `path` parameter is specified, the commits\nreturned by this endpoint may no longer be a DAG, parent commits that\ndo not modify the path will be omitted from the response.\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/?path=README.md&include=foo&include=bar&exclude=master\n\nReturns all commits that are on refs `foo` or `bar`, but not on `master`\nthat changed the file README.md.\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/?path=src/&include=foo&include=bar&exclude=master\n\nReturns all commits that are on refs `foo` or `bar`, but not on `master`\nthat changed to a file in any file in the directory src or its children.\n\nBecause the response could include a very large number of commits, it\nis paginated. Follow the 'next' link in the response to navigate to the\nnext page of commits. As with other paginated resources, do not\nconstruct your own links.\n\nWhen the include and exclude parameters are more than can fit in a\nquery string, clients can use a `x-www-form-urlencoded` POST instead."
+ },
+ "post": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of commits",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_changeset"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "List commits with include/exclude",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Identical to `GET /repositories/{workspace}/{repo_slug}/commits`,\nexcept that POST allows clients to place the include and exclude\nparameters in the request body to avoid URL length issues.\n\n**Note that this resource does NOT support new commit creation.**"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/commits/{revision}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of commits",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_changeset"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified revision does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "List commits for revision",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "These are the repository's commits. They are paginated and returned\nin reverse chronological order, similar to the output of `git log`.\nLike these tools, the DAG can be filtered.\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/master\n\nReturns all commits on rev `master` (similar to `git log master`).\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/dev?include=foo&exclude=master\n\nReturns all commits on ref `dev` or `foo`, except those that are reachable on\n`master` (similar to `git log dev foo ^master`).\n\nAn optional `path` parameter can be specified that will limit the\nresults to commits that affect that path. `path` can either be a file\nor a directory. If a directory is specified, commits are returned that\nhave modified any file in the directory tree rooted by `path`. It is\nimportant to note that if the `path` parameter is specified, the commits\nreturned by this endpoint may no longer be a DAG, parent commits that\ndo not modify the path will be omitted from the response.\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/dev?path=README.md&include=foo&include=bar&exclude=master\n\nReturns all commits that are on refs `dev` or `foo` or `bar`, but not on `master`\nthat changed the file README.md.\n\n#### GET /repositories/{workspace}/{repo_slug}/commits/dev?path=src/&include=foo&exclude=master\n\nReturns all commits that are on refs `dev` or `foo`, but not on `master`\nthat changed to a file in any file in the directory src or its children.\n\nBecause the response could include a very large number of commits, it\nis paginated. Follow the 'next' link in the response to navigate to the\nnext page of commits. As with other paginated resources, do not\nconstruct your own links.\n\nWhen the include and exclude parameters are more than can fit in a\nquery string, clients can use a `x-www-form-urlencoded` POST instead."
+ },
+ "post": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of commits",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_changeset"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified revision does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "List commits for revision using include/exclude",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Identical to `GET /repositories/{workspace}/{repo_slug}/commits/{revision}`,\nexcept that POST allows clients to place the include and exclude\nparameters in the request body to avoid URL length issues.\n\n**Note that this resource does NOT support new commit creation.**"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "revision",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/components": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The components that have been defined in the issue tracker.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_components"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "List components",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the components that have been defined in the issue tracker.\n\nThis resource is only available on repositories that have the issue\ntracker enabled."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/components/{component_id}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The specified component object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/component"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or component does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Get a component for issues",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified issue tracker component object."
+ },
+ "parameters": [
+ {
+ "name": "component_id",
+ "in": "path",
+ "description": "The component's id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/default-reviewers": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The paginated list of default reviewers"
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to view the default reviewers",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "List default reviewers",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the repository's default reviewers.\n\nThese are the users that are automatically added as reviewers on every\nnew pull request that is created."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/default-reviewers/{target_username}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The specified user successfully removed from the default reviewers"
+ },
+ "403": {
+ "description": "If the authenticated user does not have access modify the default reviewers",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified user does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Remove a user from the default reviewers",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Removes a default reviewer from the repository."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The specified user is a default reviewer"
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to check if the specified user is a default reviewer",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified user does not exist or is not a default reviewer",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Get a default reviewer",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified reviewer.\n\nThis can be used to test whether a user is among the repository's\ndefault reviewers list. A 404 indicates that that specified user is not\na default reviewer."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The specified user was successfully added to the default reviewers"
+ },
+ "400": {
+ "description": "If the authenticated user tried to add a team, bot user, or user without access to the repository to the default reviewers",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have permission to modify the default reviewers",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the specified user does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Add a user to the default reviewers",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Adds the specified user to the repository's list of default\nreviewers.\n\nThis method is idempotent. Adding a user a second time has no effect."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "target_username",
+ "in": "path",
+ "description": "This can either be the username or the UUID of the default reviewer,\nsurrounded by curly-braces, for example: `{account UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/deploy-keys": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Deploy keys matching the repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_deploy_keys"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the specified user or repository is not accessible to the current user"
+ },
+ "404": {
+ "description": "If the specified user or repository does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Deployments"],
+ "summary": "List deploy keys",
+ "security": [
+ {
+ "oauth2": ["repository", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns all deploy-keys belonging to a repository.\n\nExample:\n```\n$ curl -H \"Authorization \" \\\nhttps://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys\n\nOutput:\n{\n \"pagelen\": 10,\n \"values\": [\n {\n \"id\": 123,\n \"key\": \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAK/b1cHHDr/TEV1JGQl+WjCwStKG6Bhrv0rFpEsYlyTBm1fzN0VOJJYn4ZOPCPJwqse6fGbXntEs+BbXiptR+++HycVgl65TMR0b5ul5AgwrVdZdT7qjCOCgaSV74/9xlHDK8oqgGnfA7ZoBBU+qpVyaloSjBdJfLtPY/xqj4yHnXKYzrtn/uFc4Kp9Tb7PUg9Io3qohSTGJGVHnsVblq/rToJG7L5xIo0OxK0SJSQ5vuId93ZuFZrCNMXj8JDHZeSEtjJzpRCBEXHxpOPhAcbm4MzULgkFHhAVgp4JbkrT99/wpvZ7r9AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5\",\n \"label\": \"mykey\",\n \"type\": \"deploy_key\",\n \"created_on\": \"2018-08-15T23:50:59.993890+00:00\",\n \"repository\": {\n \"full_name\": \"mleu/test\",\n \"name\": \"test\",\n \"type\": \"repository\",\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"links\":{\n \"self\":{\n \"href\": \"https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/123\"\n }\n }\n \"last_used\": null,\n \"comment\": \"mleu@C02W454JHTD8\"\n }\n ],\n \"page\": 1,\n \"size\": 1\n}\n```"
+ },
+ "post": {
+ "responses": {
+ "200": {
+ "description": "The deploy key that was created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deploy_key"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid deploy key inputs"
+ },
+ "403": {
+ "description": "If the specified user or repository is not accessible to the current user"
+ },
+ "404": {
+ "description": "If the specified user or repository does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Deployments"],
+ "summary": "Add a deploy key",
+ "security": [
+ {
+ "oauth2": ["repository", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Create a new deploy key in a repository. Note: If authenticating a deploy key\nwith an OAuth consumer, any changes to the OAuth consumer will subsequently\ninvalidate the deploy key.\n\n\nExample:\n```\n$ curl -XPOST \\\n-H \"Authorization \" \\\n-H \"Content-type: application/json\" \\\nhttps://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys -d \\\n'{\n \"key\": \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAK/b1cHHDr/TEV1JGQl+WjCwStKG6Bhrv0rFpEsYlyTBm1fzN0VOJJYn4ZOPCPJwqse6fGbXntEs+BbXiptR+++HycVgl65TMR0b5ul5AgwrVdZdT7qjCOCgaSV74/9xlHDK8oqgGnfA7ZoBBU+qpVyaloSjBdJfLtPY/xqj4yHnXKYzrtn/uFc4Kp9Tb7PUg9Io3qohSTGJGVHnsVblq/rToJG7L5xIo0OxK0SJSQ5vuId93ZuFZrCNMXj8JDHZeSEtjJzpRCBEXHxpOPhAcbm4MzULgkFHhAVgp4JbkrT99/wpvZ7r9AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5 mleu@C02W454JHTD8\",\n \"label\": \"mydeploykey\"\n}'\n\nOutput:\n{\n \"id\": 123,\n \"key\": \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAK/b1cHHDr/TEV1JGQl+WjCwStKG6Bhrv0rFpEsYlyTBm1fzN0VOJJYn4ZOPCPJwqse6fGbXntEs+BbXiptR+++HycVgl65TMR0b5ul5AgwrVdZdT7qjCOCgaSV74/9xlHDK8oqgGnfA7ZoBBU+qpVyaloSjBdJfLtPY/xqj4yHnXKYzrtn/uFc4Kp9Tb7PUg9Io3qohSTGJGVHnsVblq/rToJG7L5xIo0OxK0SJSQ5vuId93ZuFZrCNMXj8JDHZeSEtjJzpRCBEXHxpOPhAcbm4MzULgkFHhAVgp4JbkrT99/wpvZ7r9AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5\",\n \"label\": \"mydeploykey\",\n \"type\": \"deploy_key\",\n \"created_on\": \"2018-08-15T23:50:59.993890+00:00\",\n \"repository\": {\n \"full_name\": \"mleu/test\",\n \"name\": \"test\",\n \"type\": \"repository\",\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"links\":{\n \"self\":{\n \"href\": \"https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/123\"\n }\n }\n \"last_used\": null,\n \"comment\": \"mleu@C02W454JHTD8\"\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/deploy-keys/{key_id}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The key has been deleted"
+ },
+ "403": {
+ "description": "If the current user does not have permission to delete a key for the specified user"
+ },
+ "404": {
+ "description": "If the specified user, repository, or deploy key does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Deployments"],
+ "summary": "Delete a deploy key",
+ "security": [
+ {
+ "oauth2": ["repository", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "This deletes a deploy key from a repository.\n\nExample:\n```\n$ curl -XDELETE \\\n-H \"Authorization \" \\\nhttps://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/1234\n```"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Deploy key matching the key ID",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deploy_key"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the specified user or repository is not accessible to the current user"
+ },
+ "404": {
+ "description": "If the specified user or repository does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Deployments"],
+ "summary": "Get a deploy key",
+ "security": [
+ {
+ "oauth2": ["repository", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the deploy key belonging to a specific key.\n\nExample:\n```\n$ curl -H \"Authorization \" \\\nhttps://api.bitbucket.org/2.0/repositories/mleu/test/deploy-key/1234\n\nOutput:\n{\n \"comment\": \"mleu@C02W454JHTD8\",\n \"last_used\": null,\n \"links\": {\n \"self\": {\n \"href\": https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-key/1234\"\n }\n },\n \"repository\": {\n \"full_name\": \"mleu/test\",\n \"name\": \"test\",\n \"type\": \"repository\",\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"label\": \"mykey\",\n \"created_on\": \"2018-08-15T23:50:59.993890+00:00\",\n \"key\": \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAK/b1cHHDr/TEV1JGQl+WjCwStKG6Bhrv0rFpEsYlyTBm1fzN0VOJJYn4ZOPCPJwqse6fGbXntEs+BbXiptR+++HycVgl65TMR0b5ul5AgwrVdZdT7qjCOCgaSV74/9xlHDK8oqgGnfA7ZoBBU+qpVyaloSjBdJfLtPY/xqj4yHnXKYzrtn/uFc4Kp9Tb7PUg9Io3qohSTGJGVHnsVblq/rToJG7L5xIo0OxK0SJSQ5vuId93ZuFZrCNMXj8JDHZeSEtjJzpRCBEXHxpOPhAcbm4MzULgkFHhAVgp4JbkrT99/wpvZ7r9AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5\",\n \"id\": 1234,\n \"type\": \"deploy_key\"\n}\n```"
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The newly updated deploy key.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deploy_key"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the submitted key or related value is invalid",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the current user does not have permission to add a key for the specified user"
+ },
+ "404": {
+ "description": "If the specified user, repository, or deploy key does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Deployments"],
+ "summary": "Update a deploy key",
+ "security": [
+ {
+ "oauth2": ["repository", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Create a new deploy key in a repository.\n\nThe same key needs to be passed in but the comment and label can change.\n\nExample:\n```\n$ curl -XPUT \\\n-H \"Authorization \" \\\n-H \"Content-type: application/json\" \\\nhttps://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/1234 -d \\\n'{\n \"label\": \"newlabel\",\n \"key\": \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAK/b1cHHDr/TEV1JGQl+WjCwStKG6Bhrv0rFpEsYlyTBm1fzN0VOJJYn4ZOPCPJwqse6fGbXntEs+BbXiptR+++HycVgl65TMR0b5ul5AgwrVdZdT7qjCOCgaSV74/9xlHDK8oqgGnfA7ZoBBU+qpVyaloSjBdJfLtPY/xqj4yHnXKYzrtn/uFc4Kp9Tb7PUg9Io3qohSTGJGVHnsVblq/rToJG7L5xIo0OxK0SJSQ5vuId93ZuFZrCNMXj8JDHZeSEtjJzpRCBEXHxpOPhAcbm4MzULgkFHhAVgp4JbkrT99/wpvZ7r9AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5 newcomment\",\n}'\n\nOutput:\n{\n \"comment\": \"newcomment\",\n \"last_used\": null,\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/1234\"\n }\n },\n \"repository\": {\n \"full_name\": \"mleu/test\",\n \"name\": \"test\",\n \"type\": \"repository\",\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"label\": \"newlabel\",\n \"created_on\": \"2018-08-15T23:50:59.993890+00:00\",\n \"key\": \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAK/b1cHHDr/TEV1JGQl+WjCwStKG6Bhrv0rFpEsYlyTBm1fzN0VOJJYn4ZOPCPJwqse6fGbXntEs+BbXiptR+++HycVgl65TMR0b5ul5AgwrVdZdT7qjCOCgaSV74/9xlHDK8oqgGnfA7ZoBBU+qpVyaloSjBdJfLtPY/xqj4yHnXKYzrtn/uFc4Kp9Tb7PUg9Io3qohSTGJGVHnsVblq/rToJG7L5xIo0OxK0SJSQ5vuId93ZuFZrCNMXj8JDHZeSEtjJzpRCBEXHxpOPhAcbm4MzULgkFHhAVgp4JbkrT99/wpvZ7r9AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5\",\n \"id\": 1234,\n \"type\": \"deploy_key\"\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "key_id",
+ "in": "path",
+ "description": "The key ID matching the deploy key.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/deployments/": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The matching deployments.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_deployments"
+ }
+ }
+ }
+ }
+ },
+ "description": "Find deployments",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Deployments"],
+ "summary": "List deployments",
+ "operationId": "getDeploymentsForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/deployments/{deployment_uuid}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The deployment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deployment"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No account, repository or deployment with the UUID provided exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve a deployment",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The deployment UUID.",
+ "required": true,
+ "name": "deployment_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Deployments"],
+ "summary": "Get a deployment",
+ "operationId": "getDeploymentForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/deployments_config/environments/{environment_uuid}/variables": {
+ "post": {
+ "responses": {
+ "201": {
+ "headers": {
+ "Location": {
+ "description": "The URL of the newly created variable.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": "The variable was created.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deployment_variable"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository, environment or variable with the given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "A variable with the provided key already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Create a deployment environment level variable.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The environment.",
+ "required": true,
+ "name": "environment_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deployment_variable"
+ }
+ }
+ },
+ "description": "The variable to create",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Create a variable for an environment",
+ "operationId": "createDeploymentVariable"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The retrieved deployment variables.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_deployment_variable"
+ }
+ }
+ }
+ }
+ },
+ "description": "Find deployment environment level variables.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The environment.",
+ "required": true,
+ "name": "environment_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "List variables for an environment",
+ "operationId": "getDeploymentVariables"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/deployments_config/environments/{environment_uuid}/variables/{variable_uuid}": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The deployment variable was updated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deployment_variable"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository, environment or variable with the given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Update a deployment environment level variable.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The environment.",
+ "required": true,
+ "name": "environment_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the variable to update.",
+ "required": true,
+ "name": "variable_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deployment_variable"
+ }
+ }
+ },
+ "description": "The updated deployment variable.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Update a variable for an environment",
+ "operationId": "updateDeploymentVariable"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The variable was deleted."
+ },
+ "404": {
+ "description": "The account, repository, environment or variable with given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Delete a deployment environment level variable.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The environment.",
+ "required": true,
+ "name": "environment_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the variable to delete.",
+ "required": true,
+ "name": "variable_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Delete a variable for an environment",
+ "operationId": "deleteDeploymentVariable"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/diff/{spec}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The raw diff"
+ },
+ "555": {
+ "description": "If the diff was too large and timed out.\n\nSince this endpoint does not employ any form of pagination, but\ninstead returns the diff as a single document, it can run into\ntrouble on very large diffs. If Bitbucket times out in cases\nlike these, a 555 status code is returned.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "context",
+ "in": "query",
+ "description": "Generate diffs with lines of context instead of the usual three.",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "path",
+ "in": "query",
+ "description": "Limit the diff to a particular file (this parameter\ncan be repeated for multiple paths).",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "ignore_whitespace",
+ "in": "query",
+ "description": "Generate diffs that ignore whitespace.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "binary",
+ "in": "query",
+ "description": "Generate diffs that include binary files, true if omitted.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "renames",
+ "in": "query",
+ "description": "Whether to perform rename detection, true if omitted.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "merge",
+ "in": "query",
+ "description": "This parameter is deprecated and will be removed at the end\nof 2022. The 'topic' parameter should be used instead. The\n'merge' and 'topic' parameters cannot be both used at the same\ntime.\n\nIf true, the source commit is merged into the\ndestination commit, and then a diff from the\ndestination to the merge result is returned. If false,\na simple 'two dot' diff between the source and\ndestination is returned. True if omitted.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "topic",
+ "in": "query",
+ "description": "If true, returns 2-way 'three-dot' diff.\nThis is a diff between the source commit and the merge base\nof the source commit and the destination commit.\nIf false, a simple 'two dot' diff between the source and\ndestination is returned.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "tags": ["Commits"],
+ "summary": "Compare two commits",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Produces a raw git-style diff.\n\n#### Single commit spec\n\nIf the `spec` argument to this API is a single commit, the diff is\nproduced against the first parent of the specified commit.\n\n#### Two commit spec\n\nTwo commits separated by `..` may be provided as the `spec`, e.g.,\n`3a8b42..9ff173`. When two commits are provided and the `topic` query\nparameter is true or absent, this API produces a 2-way three dot diff.\nThis is the diff between source commit and the merge base of the source\ncommit and the destination commit. When the `topic` query param is false,\na simple git-style diff is produced.\n\nThe two commits are interpreted as follows:\n\n* First commit: the commit containing the changes we wish to preview\n* Second commit: the commit representing the state to which we want to\n compare the first commit\n* **Note**: This is the opposite of the order used in `git diff`.\n\n#### Comparison to patches\n\nWhile similar to patches, diffs:\n\n* Don't have a commit header (username, commit message, etc)\n* Support the optional `path=foo/bar.py` query param to filter\n the diff to just that one file diff\n\n#### Response\n\nThe raw diff is returned as-is, in whatever encoding the files in the\nrepository use. It is not decoded into unicode. As such, the\ncontent-type is `text/plain`."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "spec",
+ "in": "path",
+ "description": "A commit SHA (e.g. `3a8b42`) or a commit range using double dot\nnotation (e.g. `3a8b42..9ff173`).\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/diffstat/{spec}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The diff stats",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_diffstats"
+ }
+ }
+ }
+ },
+ "555": {
+ "description": "If generating the diffstat timed out.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "Compare two commit diff stats",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Produces a response in JSON format with a record for every path\nmodified, including information on the type of the change and the\nnumber of lines added and removed.\n\n#### Single commit spec\n\nIf the `spec` argument to this API is a single commit, the diff is\nproduced against the first parent of the specified commit.\n\n#### Two commit spec\n\nTwo commits separated by `..` may be provided as the `spec`, e.g.,\n`3a8b42..9ff173`. When two commits are provided and the `topic` query\nparameter is true or absent, this API produces a 2-way three dot diff.\nThis is the diff between source commit and the merge base of the source\ncommit and the destination commit. When the `topic` query param is false,\na simple git-style diff is produced.\n\nThe two commits are interpreted as follows:\n\n* First commit: the commit containing the changes we wish to preview\n* Second commit: the commit representing the state to which we want to\n compare the first commit\n* **Note**: This is the opposite of the order used in `git diff`.\n\n#### Sample output\n```\ncurl https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/diffstat/d222fa2..e174964\n{\n \"pagelen\": 500,\n \"values\": [\n {\n \"type\": \"diffstat\",\n \"status\": \"modified\",\n \"lines_removed\": 1,\n \"lines_added\": 2,\n \"old\": {\n \"path\": \"setup.py\",\n \"escaped_path\": \"setup.py\",\n \"type\": \"commit_file\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/src/e1749643d655d7c7014001a6c0f58abaf42ad850/setup.py\"\n }\n }\n },\n \"new\": {\n \"path\": \"setup.py\",\n \"escaped_path\": \"setup.py\",\n \"type\": \"commit_file\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/bitbucket/geordi/src/d222fa235229c55dad20b190b0b571adf737d5a6/setup.py\"\n }\n }\n }\n }\n ],\n \"page\": 1,\n \"size\": 1\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "ignore_whitespace",
+ "in": "query",
+ "description": "Generate diffs that ignore whitespace",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "merge",
+ "in": "query",
+ "description": "This parameter is deprecated and will be removed at the end\nof 2022. The 'topic' parameter should be used instead. The\n'merge' and 'topic' parameters cannot be both used at the same\ntime.\n\nIf true, the source commit is merged into the\ndestination commit, and then a diffstat from the\ndestination to the merge result is returned. If false,\na simple 'two dot' diffstat between the source and\ndestination is returned. True if omitted.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "path",
+ "in": "query",
+ "description": "Limit the diffstat to a particular file (this parameter\ncan be repeated for multiple paths).",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "renames",
+ "in": "query",
+ "description": "Whether to perform rename detection, true if omitted.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "spec",
+ "in": "path",
+ "description": "A commit SHA (e.g. `3a8b42`) or a commit range using double dot\nnotation (e.g. `3a8b42..9ff173`).\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "topic",
+ "in": "query",
+ "description": "If true, returns 2-way 'three-dot' diff.\nThis is a diff between the source commit and the merge base\nof the source commit and the destination commit.\nIf false, a simple 'two dot' diff between the source and\ndestination is returned.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/downloads": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Returns a paginated list of the downloads associated with the repository."
+ },
+ "403": {
+ "description": "User is not authorized to read from the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Downloads"],
+ "summary": "List download artifacts",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a list of download links associated with the repository."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The artifact was uploaded sucessfully."
+ },
+ "400": {
+ "description": "Bad Request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "User is not authorized to write to the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "406": {
+ "description": "Unsupported Content-Type. Use multiplart/form-data.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Downloads"],
+ "summary": "Upload a download artifact",
+ "security": [
+ {
+ "oauth2": ["repository:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Upload new download artifacts.\n\nTo upload files, perform a `multipart/form-data` POST containing one\nor more `files` fields:\n\n $ echo Hello World > hello.txt\n $ curl -s -u evzijst -X POST https://api.bitbucket.org/2.0/repositories/evzijst/git-tests/downloads -F files=@hello.txt\n\nWhen a file is uploaded with the same name as an existing artifact,\nthen the existing file will be replaced."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/downloads/{filename}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The specified download artifact was deleted."
+ },
+ "403": {
+ "description": "User is not authorized to write to the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified download does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Downloads"],
+ "summary": "Delete a download artifact",
+ "security": [
+ {
+ "oauth2": ["repository:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes the specified download artifact from the repository."
+ },
+ "get": {
+ "responses": {
+ "302": {
+ "description": "Redirects to the url of the specified download artifact."
+ },
+ "403": {
+ "description": "User is not authorized to read from the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified download artifact does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Downloads"],
+ "summary": "Get a download artifact link",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Return a redirect to the contents of a download artifact.\n\nThis endpoint returns the actual file contents and not the artifact's\nmetadata.\n\n $ curl -s -L https://api.bitbucket.org/2.0/repositories/evzijst/git-tests/downloads/hello.txt\n Hello World"
+ },
+ "parameters": [
+ {
+ "name": "filename",
+ "in": "path",
+ "description": "Name of the file.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/environments/": {
+ "post": {
+ "responses": {
+ "201": {
+ "headers": {
+ "Location": {
+ "description": "The URL of the newly created environment.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": "The environment was created.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deployment_environment"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "An environment host with the provided name already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Create an environment.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deployment_environment"
+ }
+ }
+ },
+ "description": "The environment to create.",
+ "required": true
+ },
+ "tags": ["Deployments"],
+ "summary": "Create an environment",
+ "operationId": "createEnvironment"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The matching environments.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_environments"
+ }
+ }
+ }
+ }
+ },
+ "description": "Find environments",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Deployments"],
+ "summary": "List environments",
+ "operationId": "getEnvironmentsForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/environments/{environment_uuid}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The environment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/deployment_environment"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No account, repository or environment with the UUID provided exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve an environment",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The environment UUID.",
+ "required": true,
+ "name": "environment_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Deployments"],
+ "summary": "Get an environment",
+ "operationId": "getEnvironmentForRepository"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The environment was deleted."
+ },
+ "404": {
+ "description": "No account or repository with the UUID provided exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Delete an environment",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The environment UUID.",
+ "required": true,
+ "name": "environment_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Deployments"],
+ "summary": "Delete an environment",
+ "operationId": "deleteEnvironmentForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/environments/{environment_uuid}/changes/": {
+ "post": {
+ "responses": {
+ "202": {
+ "description": "The environment update request was accepted."
+ },
+ "404": {
+ "description": "No account, repository or environment with the UUID provided exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Update an environment",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The environment UUID.",
+ "required": true,
+ "name": "environment_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Deployments"],
+ "summary": "Update an environment",
+ "operationId": "updateEnvironmentForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/filehistory/{commit}/{path}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of commits that modified the specified file",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_files"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "renames",
+ "in": "query",
+ "description": "\nWhen `true`, Bitbucket will follow the history of the file across\nrenames (this is the default behavior). This can be turned off by\nspecifying `false`.",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "description": "\nQuery string to narrow down the response as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "\nName of a response property sort the result by as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#sorting-query-results).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Source", "Repositories"],
+ "summary": "List commits that modified a file",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of commits that modified the specified file.\n\nCommits are returned in reverse chronological order. This is roughly\nequivalent to the following commands:\n\n $ git log --follow --date-order \n\nBy default, Bitbucket will follow renames and the path name in the\nreturned entries reflects that. This can be turned off using the\n`?renames=false` query parameter.\n\nResults are returned in descending chronological order by default, and\nlike most endpoints you can\n[filter and sort](/cloud/bitbucket/rest/intro/#filtering) the response to\nonly provide exactly the data you want.\n\nFor example, if you wanted to find commits made before 2011-05-18\nagainst a file named `README.rst`, but you only wanted the path and\ndate, your query would look like this:\n\n```\n$ curl 'https://api.bitbucket.org/2.0/repositories/evzijst/dogslow/filehistory/master/README.rst'\\\n '?fields=values.next,values.path,values.commit.date&q=commit.date<=2011-05-18'\n{\n \"values\": [\n {\n \"commit\": {\n \"date\": \"2011-05-17T07:32:09+00:00\"\n },\n \"path\": \"README.rst\"\n },\n {\n \"commit\": {\n \"date\": \"2011-05-16T06:33:28+00:00\"\n },\n \"path\": \"README.txt\"\n },\n {\n \"commit\": {\n \"date\": \"2011-05-16T06:15:39+00:00\"\n },\n \"path\": \"README.txt\"\n }\n ]\n}\n```\n\nIn the response you can see that the file was renamed to `README.rst`\nby the commit made on 2011-05-16, and was previously named `README.txt`."
+ },
+ "parameters": [
+ {
+ "name": "commit",
+ "in": "path",
+ "description": "The commit's SHA1.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "path",
+ "in": "path",
+ "description": "Path to the file.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/forks": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "All forks.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_repositories"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "role",
+ "in": "query",
+ "description": "Filters the result based on the authenticated user's role on each repository.\n\n* **member**: returns repositories to which the user has explicit read access\n* **contributor**: returns repositories to which the user has explicit write access\n* **admin**: returns repositories to which the user has explicit administrator access\n* **owner**: returns all repositories owned by the current user\n",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": ["admin", "contributor", "member", "owner"]
+ }
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "description": "Query string to narrow down the response as per [filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "Field by which the results should be sorted as per [filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Repositories"],
+ "summary": "List repository forks",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of all the forks of the specified\nrepository."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created fork.",
+ "headers": {
+ "Location": {
+ "description": "The URL of the newly created fork",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository"
+ }
+ }
+ },
+ "description": "A repository object. This can be left blank."
+ },
+ "tags": ["Repositories"],
+ "summary": "Fork a repository",
+ "security": [
+ {
+ "oauth2": ["repository:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new fork of the specified repository.\n\n#### Forking a repository\n\nTo create a fork, specify the workspace explicitly as part of the\nrequest body:\n\n```\n$ curl -X POST -u jdoe https://api.bitbucket.org/2.0/repositories/atlassian/bbql/forks \\\n -H 'Content-Type: application/json' -d '{\n \"name\": \"bbql_fork\",\n \"workspace\": {\n \"slug\": \"atlassian\"\n }\n}'\n```\n\nTo fork a repository into the same workspace, also specify a new `name`.\n\nWhen you specify a value for `name`, it will also affect the `slug`.\nThe `slug` is reflected in the repository URL of the new fork. It is\nderived from `name` by substituting non-ASCII characters, removes\nwhitespace, and changes characters to lower case. For example,\n`My repo` would turn into `my_repo`.\n\nYou need contributor access to create new forks within a workspace.\n\n\n#### Change the properties of a new fork\n\nBy default the fork inherits most of its properties from the parent.\nHowever, since the optional POST body document follows the normal\n`repository` JSON schema and you can override the new fork's\nproperties.\n\nProperties that can be overridden include:\n\n* description\n* fork_policy\n* language\n* mainbranch\n* is_private (note that a private repo's fork_policy might prohibit\n the creation of public forks, in which `is_private=False` would fail)\n* has_issues (to initialize or disable the new repo's issue tracker --\n note that the actual contents of the parent repository's issue\n tracker are not copied during forking)\n* has_wiki (to initialize or disable the new repo's wiki --\n note that the actual contents of the parent repository's wiki are not\n copied during forking)\n* project (when forking into a private project, the fork's `is_private`\n must be `true`)\n\nProperties that cannot be modified include:\n\n* scm\n* parent\n* full_name"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/hooks": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The paginated list of installed webhooks.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_webhook_subscriptions"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have permission to access the webhooks.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories", "Webhooks"],
+ "summary": "List webhooks for a repository",
+ "security": [
+ {
+ "oauth2": ["webhook"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of webhooks installed on this repository."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "If the webhook was registered successfully.",
+ "headers": {
+ "Location": {
+ "description": "The URL of new newly created webhook.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/webhook_subscription"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have permission to install webhooks on the specified repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories", "Webhooks"],
+ "summary": "Create a webhook for a repository",
+ "security": [
+ {
+ "oauth2": ["webhook"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new webhook on the specified repository.\n\nExample:\n\n```\n$ curl -X POST -u credentials -H 'Content-Type: application/json'\n https://api.bitbucket.org/2.0/repositories/my-workspace/my-repo-slug/hooks\n -d '\n {\n \"description\": \"Webhook Description\",\n \"url\": \"https://example.com/\",\n \"active\": true,\n \"events\": [\n \"repo:push\",\n \"issue:created\",\n \"issue:updated\"\n ]\n }'\n```\n\nNote that this call requires the webhook scope, as well as any scope\nthat applies to the events that the webhook subscribes to. In the\nexample above that means: `webhook`, `repository` and `issue`.\n\nAlso note that the `url` must properly resolve and cannot be an\ninternal, non-routed address."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/hooks/{uid}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "When the webhook was deleted successfully"
+ },
+ "403": {
+ "description": "If the authenticated user does not have permission to delete the webhook.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the webhook or repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories", "Webhooks"],
+ "summary": "Delete a webhook for a repository",
+ "security": [
+ {
+ "oauth2": ["webhook"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes the specified webhook subscription from the given\nrepository."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The webhook subscription object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/webhook_subscription"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the webhook or repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories", "Webhooks"],
+ "summary": "Get a webhook for a repository",
+ "security": [
+ {
+ "oauth2": ["webhook"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the webhook with the specified id installed on the specified\nrepository."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The webhook subscription object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/webhook_subscription"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have permission to update the webhook.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the webhook or repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories", "Webhooks"],
+ "summary": "Update a webhook for a repository",
+ "security": [
+ {
+ "oauth2": ["webhook"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Updates the specified webhook subscription.\n\nThe following properties can be mutated:\n\n* `description`\n* `url`\n* `active`\n* `events`"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "uid",
+ "in": "path",
+ "description": "Installed webhook's ID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of the issues matching any filter criteria that were provided.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_issues"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "List issues",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the issues in the issue tracker."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created issue.",
+ "headers": {
+ "Location": {
+ "description": "The (absolute) URL of the newly created issue.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "When the request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user isn't authorized to create the issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue"
+ }
+ }
+ },
+ "description": "The new issue. The only required element is `title`. All other elements can be omitted from the body.",
+ "required": true
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Create an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new issue.\n\nThis call requires authentication. Private repositories or private\nissue trackers require the caller to authenticate with an account that\nhas appropriate authorization.\n\nThe authenticated user is used for the issue's `reporter` field."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/export": {
+ "post": {
+ "responses": {
+ "202": {
+ "description": "The export job has been accepted"
+ },
+ "401": {
+ "description": "The request wasn't authenticated properly",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user does not have admin permission on the repo",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The repo does not exist or does not have an issue tracker",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/export_options"
+ }
+ }
+ },
+ "description": "The options to apply to the export. Available options include `project_key` and `project_name` which, if specified, are used as the project key and name in the exported Jira json format. Option `send_email` specifies whether an email should be sent upon export result. Option `include_attachments` specifies whether attachments are included in the export."
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Export issues",
+ "security": [
+ {
+ "oauth2": ["issue", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "A POST request to this endpoint initiates a new background celery task that archives the repo's issues.\n\nFor example, you can run:\n\ncurl -u -X POST http://api.bitbucket.org/2.0/repositories///\nissues/export\n\nWhen the job has been accepted, it will return a 202 (Accepted) along with a unique url to this job in the\n'Location' response header. This url is the endpoint for where the user can obtain their zip files.\""
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/export/{repo_name}-issues-{task_id}.zip": {
+ "get": {
+ "responses": {
+ "202": {
+ "description": "Export job accepted",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_job_status"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The request wasn't authenticated properly",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user does not have admin permission on the repo",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No export job has begun",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Check issue export status",
+ "security": [
+ {
+ "oauth2": ["issue", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "This endpoint is used to poll for the progress of an issue export\njob and return the zip file after the job is complete.\nAs long as the job is running, this will return a 200 response\nwith in the response body a description of the current status.\n\nAfter the job has been scheduled, but before it starts executing, this\nendpoint's response is:\n\n{\n \"type\": \"issue_job_status\",\n \"status\": \"ACCEPTED\",\n \"phase\": \"Initializing\",\n \"total\": 0,\n \"count\": 0,\n \"pct\": 0\n}\n\n\nThen once it starts running, it becomes:\n\n{\n \"type\": \"issue_job_status\",\n \"status\": \"STARTED\",\n \"phase\": \"Attachments\",\n \"total\": 15,\n \"count\": 11,\n \"pct\": 73\n}\n\nOnce the job has successfully completed, it returns a stream of the zip file."
+ },
+ "parameters": [
+ {
+ "name": "repo_name",
+ "in": "path",
+ "description": "The name of the repo",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "task_id",
+ "in": "path",
+ "description": "The ID of the export task",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/import": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Import job complete with either FAILURE or SUCCESS status",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_job_status"
+ }
+ }
+ }
+ },
+ "202": {
+ "description": "Import job started",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_job_status"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The request wasn't authenticated properly",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user does not have admin permission on the repo",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No export job has begun",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Check issue import status",
+ "security": [
+ {
+ "oauth2": ["issue:write", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "When using GET, this endpoint reports the status of the current import task. Request example:\n\n```\n$ curl -u -X GET https://api.bitbucket.org/2.0/repositories///issues/import\n```\n\nAfter the job has been scheduled, but before it starts executing, this endpoint's response is:\n\n```\n< HTTP/1.1 202 Accepted\n{\n \"type\": \"issue_job_status\",\n \"status\": \"PENDING\",\n \"phase\": \"Attachments\",\n \"total\": 15,\n \"count\": 0,\n \"percent\": 0\n}\n```\n\nOnce it starts running, it is a 202 response with status STARTED and progress filled.\n\nAfter it is finished, it becomes a 200 response with status SUCCESS or FAILURE."
+ },
+ "post": {
+ "responses": {
+ "202": {
+ "description": "Import job accepted",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_job_status"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The request wasn't authenticated properly",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user does not have admin permission on the repo",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No export job has begun",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Import already running",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Import issues",
+ "security": [
+ {
+ "oauth2": ["issue:write", "repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "A POST request to this endpoint will import the zip file given by the archive parameter into the repository. All\nexisting issues will be deleted and replaced by the contents of the imported zip file.\n\nImports are done through a multipart/form-data POST. There is one valid and required form field, with the name\n\"archive,\" which needs to be a file field:\n\n```\n$ curl -u -X POST -F archive=@/path/to/file.zip https://api.bitbucket.org/2.0/repositories///issues/import\n```\n\nWhen the import job is accepted, here is example output:\n\n```\n< HTTP/1.1 202 Accepted\n\n{\n \"type\": \"issue_job_status\",\n \"status\": \"ACCEPTED\",\n \"phase\": \"Attachments\",\n \"total\": 15,\n \"count\": 0,\n \"percent\": 0\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}": {
+ "delete": {
+ "responses": {
+ "200": {
+ "description": "The issue object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user isn't authorized to delete the issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Delete an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes the specified issue. This requires write access to the\nrepository."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The issue object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user isn't authorized to access the issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "410": {
+ "description": "The specified issue is unavailable.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Get an issue",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified issue."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The updated issue object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user isn't authorized to access the issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Update an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Modifies the issue.\n\n```\n$ curl https://api.bitbucket.org/2.0/repostories/evzijst/dogslow/issues/123 \\\n -u evzijst -s -X PUT -H 'Content-Type: application/json' \\\n -d '{\n \"title\": \"Updated title\",\n \"assignee\": {\n \"username\": \"evzijst\"\n },\n \"priority\": \"minor\",\n \"version\": {\n \"name\": \"1.0\"\n },\n \"component\": null\n}'\n```\n\nThis example changes the `title`, `assignee`, `priority` and the\n`version`. It also removes the value of the `component` from the issue\nby setting the field to `null`. Any field not present keeps its existing\nvalue.\n\nEach time an issue is edited in the UI or through the API, an immutable\nchange record is created under the `/issues/123/changes` endpoint. It\nalso has a comment associated with the change."
+ },
+ "parameters": [
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}/attachments": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of all attachments for this issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_issue_attachments"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the issue tracker is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "List attachments for an issue",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns all attachments for this issue.\n\nThis returns the files' meta data. This does not return the files'\nactual contents.\n\nThe files are always ordered by their upload date."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "An empty response document.",
+ "headers": {
+ "Location": {
+ "description": "The URL to the issue's collection of attachments.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If no files were uploaded, or if the wrong `Content-Type` was used."
+ },
+ "401": {
+ "description": "If the issue tracker is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Upload an attachment to an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Upload new issue attachments.\n\nTo upload files, perform a `multipart/form-data` POST containing one\nor more file fields.\n\nWhen a file is uploaded with the same name as an existing attachment,\nthen the existing file will be replaced."
+ },
+ "parameters": [
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}/attachments/{path}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Indicates that the deletion was successful"
+ },
+ "401": {
+ "description": "If the issue tracker is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Delete an attachment for an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes an attachment."
+ },
+ "get": {
+ "responses": {
+ "302": {
+ "description": "A redirect to the file's contents",
+ "headers": {
+ "Location": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the issue tracker is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Get attachment for an issue",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the contents of the specified file attachment.\n\nNote that this endpoint does not return a JSON response, but instead\nreturns a redirect pointing to the actual file that in turn will return\nthe raw contents.\n\nThe redirect URL contains a one-time token that has a limited lifetime.\nAs a result, the link should not be persisted, stored, or shared."
+ },
+ "parameters": [
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "path",
+ "in": "path",
+ "description": "Path to the file.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}/changes": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Returns all the issue changes that were made on the specified issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_log_entries"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "description": "\nQuery string to narrow down the response. See\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering) for details.",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "\nName of a response property to sort results. See\n[filtering and sorting](/cloud/bitbucket/rest/intro/#sorting-query-results)\nfor details.\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Issue tracker"],
+ "summary": "List changes on an issue",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the list of all changes that have been made to the specified\nissue. Changes are returned in chronological order with the oldest\nchange first.\n\nEach time an issue is edited in the UI or through the API, an immutable\nchange record is created under the `/issues/123/changes` endpoint. It\nalso has a comment associated with the change.\n\nNote that this operation is changing significantly, due to privacy changes.\nSee the [announcement](https://developer.atlassian.com/cloud/bitbucket/bitbucket-api-changes-gdpr/#changes-to-the-issue-changes-api)\nfor details.\n\n```\n$ curl -s https://api.bitbucket.org/2.0/repositories/evzijst/dogslow/issues/1/changes - | jq .\n\n{\n \"pagelen\": 20,\n \"values\": [\n {\n \"changes\": {\n \"priority\": {\n \"new\": \"trivial\",\n \"old\": \"major\"\n },\n \"assignee\": {\n \"new\": \"\",\n \"old\": \"evzijst\"\n },\n \"assignee_account_id\": {\n \"new\": \"\",\n \"old\": \"557058:c0b72ad0-1cb5-4018-9cdc-0cde8492c443\"\n },\n \"kind\": {\n \"new\": \"enhancement\",\n \"old\": \"bug\"\n }\n },\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/evzijst/dogslow/issues/1/changes/2\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/evzijst/dogslow/issues/1#comment-2\"\n }\n },\n \"issue\": {\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/evzijst/dogslow/issues/1\"\n }\n },\n \"type\": \"issue\",\n \"id\": 1,\n \"repository\": {\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/evzijst/dogslow\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/evzijst/dogslow\"\n },\n \"avatar\": {\n \"href\": \"https://bitbucket.org/evzijst/dogslow/avatar/32/\"\n }\n },\n \"type\": \"repository\",\n \"name\": \"dogslow\",\n \"full_name\": \"evzijst/dogslow\",\n \"uuid\": \"{988b17c6-1a47-4e70-84ee-854d5f012bf6}\"\n },\n \"title\": \"Updated title\"\n },\n \"created_on\": \"2018-03-03T00:35:28.353630+00:00\",\n \"user\": {\n \"username\": \"evzijst\",\n \"nickname\": \"evzijst\",\n \"display_name\": \"evzijst\",\n \"type\": \"user\",\n \"uuid\": \"{aaa7972b-38af-4fb1-802d-6e3854c95778}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/users/evzijst\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/evzijst/\"\n },\n \"avatar\": {\n \"href\": \"https://bitbucket.org/account/evzijst/avatar/32/\"\n }\n }\n },\n \"message\": {\n \"raw\": \"Removed assignee, changed kind and priority.\",\n \"markup\": \"markdown\",\n \"html\": \"Removed assignee, changed kind and priority.
\",\n \"type\": \"rendered\"\n },\n \"type\": \"issue_change\",\n \"id\": 2\n }\n ],\n \"page\": 1\n}\n```\n\nChanges support [filtering and sorting](/cloud/bitbucket/rest/intro/#filtering) that\ncan be used to search for specific changes. For instance, to see\nwhen an issue transitioned to \"resolved\":\n\n```\n$ curl -s https://api.bitbucket.org/2.0/repositories/site/master/issues/1/changes \\\n -G --data-urlencode='q=changes.state.new = \"resolved\"'\n```\n\nThis resource is only available on repositories that have the issue\ntracker enabled.\n\nN.B.\n\nThe `changes.assignee` and `changes.assignee_account_id` fields are not\na `user` object. Instead, they contain the raw `username` and\n`account_id` of the user. This is to protect the integrity of the audit\nlog even after a user account gets deleted.\n\nThe `changes.assignee` field is deprecated will disappear in the\nfuture. Use `changes.assignee_account_id` instead."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created issue change.",
+ "headers": {
+ "Location": {
+ "description": "The (absolute) URL of the newly created issue change.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_change"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "When the request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "When the authenticated user isn't authorized to modify the issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_change"
+ }
+ }
+ },
+ "description": "The new issue state change. The only required elements are `changes.[].new`. All other elements can be omitted from the body.",
+ "required": true
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Modify the state of an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Makes a change to the specified issue.\n\nFor example, to change an issue's state and assignee, create a new\nchange object that modifies these fields:\n\n```\ncurl https://api.bitbucket.org/2.0/site/master/issues/1234/changes \\\n -s -u evzijst -X POST -H \"Content-Type: application/json\" \\\n -d '{\n \"changes\": {\n \"assignee_account_id\": {\n \"new\": \"557058:c0b72ad0-1cb5-4018-9cdc-0cde8492c443\"\n },\n \"state\": {\n \"new\": 'resolved\"\n }\n }\n \"message\": {\n \"raw\": \"This is now resolved.\"\n }\n }'\n```\n\nThe above example also includes a custom comment to go alongside the\nchange. This comment will also be visible on the issue page in the UI.\n\nThe fields of the `changes` object are strings, not objects. This\nallows for immutable change log records, even after user accounts,\nmilestones, or other objects recorded in a change entry, get renamed or\ndeleted.\n\nThe `assignee_account_id` field stores the account id. When POSTing a\nnew change and changing the assignee, the client should therefore use\nthe user's account_id in the `changes.assignee_account_id.new` field.\n\nThis call requires authentication. Private repositories or private\nissue trackers require the caller to authenticate with an account that\nhas appropriate authorization."
+ },
+ "parameters": [
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}/changes/{change_id}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The specified issue change object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_change"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or issue change does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Get issue change object",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified issue change object.\n\nThis resource is only available on repositories that have the issue\ntracker enabled."
+ },
+ "parameters": [
+ {
+ "name": "change_id",
+ "in": "path",
+ "description": "The issue change id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}/comments": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of issue comments.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_issue_comments"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "description": "\nQuery string to narrow down the response as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Issue tracker"],
+ "summary": "List comments on an issue",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of all comments that were made on the\nspecified issue.\n\nThe default sorting is oldest to newest and can be overridden with\nthe `sort` query parameter.\n\nThis endpoint also supports filtering and sorting of the results. See\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering) for more details."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created comment.",
+ "headers": {
+ "Location": {
+ "description": "The location of the newly issue comment.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the input was invalid, or if the comment being created is detected as spam ",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_comment"
+ }
+ }
+ },
+ "description": "The new issue comment object.",
+ "required": true
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Create a comment on an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new issue comment.\n\n```\n$ curl https://api.bitbucket.org/2.0/repositories/atlassian/prlinks/issues/42/comments/ \\\n -X POST -u evzijst \\\n -H 'Content-Type: application/json' \\\n -d '{\"content\": {\"raw\": \"Lorem ipsum.\"}}'\n```"
+ },
+ "parameters": [
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}/comments/{comment_id}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Indicates successful deletion."
+ }
+ },
+ "requestBody": {
+ "$ref": "#/components/requestBodies/issue_comment"
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Delete a comment on an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes the specified comment."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The issue comment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_comment"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Get a comment on an issue",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified issue comment object."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The updated issue comment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/issue_comment"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the input was invalid, or if the update to the comment is detected as spam ",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "$ref": "#/components/requestBodies/issue_comment"
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Update a comment on an issue",
+ "security": [
+ {
+ "oauth2": ["issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Updates the content of the specified issue comment. Note that only\nthe `content.raw` field can be modified.\n\n```\n$ curl https://api.bitbucket.org/2.0/repositories/atlassian/prlinks/issues/42/comments/5728901 \\\n -X PUT -u evzijst \\\n -H 'Content-Type: application/json' \\\n -d '{\"content\": {\"raw\": \"Lorem ipsum.\"}'\n```"
+ },
+ "parameters": [
+ {
+ "name": "comment_id",
+ "in": "path",
+ "description": "The id of the comment.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}/vote": {
+ "delete": {
+ "responses": {
+ "default": {
+ "description": "Unexpected error.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Remove vote for an issue",
+ "security": [
+ {
+ "oauth2": ["account:write", "issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Retract your vote."
+ },
+ "get": {
+ "responses": {
+ "204": {
+ "description": "If the authenticated user has not voted for this issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "When the request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the authenticated user has not voted for this issue, or when the repo does not exist, or does not have an issue tracker.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Check if current user voted for an issue",
+ "security": [
+ {
+ "oauth2": ["account", "issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Check whether the authenticated user has voted for this issue.\nA 204 status code indicates that the user has voted, while a 404\nimplies they haven't."
+ },
+ "put": {
+ "responses": {
+ "204": {
+ "description": "Indicating the authenticated user has cast their vote successfully.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "When the request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Vote for an issue",
+ "security": [
+ {
+ "oauth2": ["account:write", "issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Vote for this issue.\n\nTo cast your vote, do an empty PUT. The 204 status code indicates that\nthe operation was successful."
+ },
+ "parameters": [
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/issues/{issue_id}/watch": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Indicates that the authenticated user successfully stopped watching this issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "When the request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or issue does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Stop watching an issue",
+ "security": [
+ {
+ "oauth2": ["account:write", "issue:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Stop watching this issue."
+ },
+ "get": {
+ "responses": {
+ "204": {
+ "description": "If the authenticated user is watching this issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "When the request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the authenticated user is not watching this issue, or when the repo does not exist, or does not have an issue tracker.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Check if current user is watching a issue",
+ "security": [
+ {
+ "oauth2": ["account", "issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Indicated whether or not the authenticated user is watching this\nissue."
+ },
+ "put": {
+ "responses": {
+ "204": {
+ "description": "Indicates that the authenticated user successfully started watching this issue.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "When the request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the authenticated user is not watching this issue, or when the repo does not exist, or does not have an issue tracker.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Watch an issue",
+ "security": [
+ {
+ "oauth2": ["account:write", "issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Start watching this issue.\n\nTo start watching this issue, do an empty PUT. The 204 status code\nindicates that the operation was successful."
+ },
+ "parameters": [
+ {
+ "name": "issue_id",
+ "in": "path",
+ "description": "The issue id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/merge-base/{revspec}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The merge base of the provided spec.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/commit"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to any of the repositories specified.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository or ref in the spec does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "Get the common ancestor between two commits",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the best common ancestor between two commits, specified in a revspec\nof 2 commits (e.g. 3a8b42..9ff173).\n\nIf more than one best common ancestor exists, only one will be returned. It is\nunspecified which will be returned."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "revspec",
+ "in": "path",
+ "description": "A commit range using double dot notation (e.g. `3a8b42..9ff173`).\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/milestones": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The milestones that have been defined in the issue tracker.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_milestones"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "List milestones",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the milestones that have been defined in the issue tracker.\n\nThis resource is only available on repositories that have the issue\ntracker enabled."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/milestones/{milestone_id}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The specified milestone object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/milestone"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or milestone does not exist or does not have the issue tracker enabled.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Issue tracker"],
+ "summary": "Get a milestone",
+ "security": [
+ {
+ "oauth2": ["issue"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified issue tracker milestone object."
+ },
+ "parameters": [
+ {
+ "name": "milestone_id",
+ "in": "path",
+ "description": "The milestone's id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/patch/{spec}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The raw patches"
+ },
+ "555": {
+ "description": "If the diff was too large and timed out.\n\nSince this endpoint does not employ any form of pagination, but\ninstead returns the diff as a single document, it can run into\ntrouble on very large diffs. If Bitbucket times out in cases\nlike these, a 555 status code is returned.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Commits"],
+ "summary": "Get a patch for two commits",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Produces a raw patch for a single commit (diffed against its first\nparent), or a patch-series for a revspec of 2 commits (e.g.\n`3a8b42..9ff173` where the first commit represents the source and the\nsecond commit the destination).\n\nIn case of the latter (diffing a revspec), a patch series is returned\nfor the commits on the source branch (`3a8b42` and its ancestors in\nour example).\n\nWhile similar to diffs, patches:\n\n* Have a commit header (username, commit message, etc)\n* Do not support the `path=foo/bar.py` query parameter\n\nThe raw patch is returned as-is, in whatever encoding the files in the\nrepository use. It is not decoded into unicode. As such, the\ncontent-type is `text/plain`."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "spec",
+ "in": "path",
+ "description": "A commit SHA (e.g. `3a8b42`) or a commit range using double dot\nnotation (e.g. `3a8b42..9ff173`).\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/permissions-config/groups": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Paginated of explicit group permissions on the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_repository_group_permissions"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The user couldn't be authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "The requesting user isn't an admin of the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "One or both of the workspace and repository doesn't exist for the given identifiers.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "List explicit group permissions for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of explicit group permissions for the given repository.\nThis endpoint does not support BBQL features.\n\nExample:\n\n```\n$ curl https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/groups\n\nHTTP/1.1 200\nLocation: https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/groups\n\n{\n \"pagelen\": 10,\n \"values\": [\n {\n \"type\": \"repository_group_permission\",\n \"group\": {\n \"type\": \"group\",\n \"name\": \"Administrators\",\n \"slug\": \"administrators\"\n },\n \"permission\": \"admin\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/\n geordi/permissions-config/groups/administrators\"\n }\n }\n },\n {\n \"type\": \"repository_group_permission\",\n \"group\": {\n \"type\": \"group\",\n \"name\": \"Developers\",\n \"slug\": \"developers\"\n },\n \"permission\": \"read\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/\n geordi/permissions-config/groups/developers\"\n }\n }\n }\n ],\n \"page\": 1,\n \"size\": 2\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/permissions-config/groups/{group_slug}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Group permission deleted"
+ },
+ "401": {
+ "description": "The user couldn't be authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "The requesting user isn't an admin of the repository, or the authentication method was not via app password.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The workspace does not exist, the repository does not exist,or the group does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "Delete an explicit group permission for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes the repository group permission between the requested repository and group, if one exists.\n\nOnly users with admin permission for the repository may access this resource.\n\nExample:\n\n$ curl -X DELETE https://api.bitbucket.org/2.0/repositories/atlassian_tutorial\n/geordi/permissions-config/groups/developers\n\n\nHTTP/1.1 204"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Group permission for group slug and repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository_group_permission"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The user couldn't be authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "The requesting user isn't an admin of the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The given user, workspace, and/or repository could not be found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "Get an explicit group permission for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the group permission for a given group slug and repository\n\nOnly users with admin permission for the repository may access this resource.\n\nPermissions can be:\n\n* `admin`\n* `write`\n* `read`\n* `none`\n\nExample:\n\n```\n$ curl https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/groups/developers\n\nHTTP/1.1 200\nLocation:\nhttps://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/groups/developers\n\n{\n \"type\": \"repository_group_permission\",\n \"group\": {\n \"type\": \"group\",\n \"name\": \"Developers\",\n \"slug\": \"developers\"\n },\n \"repository\": {\n \"type\": \"repository\",\n \"name\": \"geordi\",\n \"full_name\": \"atlassian_tutorial/geordi\",\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"permission\": \"read\",\n \"links\": {\n \"self\": {\n \"href\":\n \"https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/groups/developers\"\n }\n }\n}\n```"
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "Group permission updated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository_group_permission"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "No permission value was provided or the value is invalid(not one of read, write, or admin)",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The user couldn't be authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "The requesting user isn't an admin of the repository, or the authentication method was not via app password.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The workspace does not exist, the repository does not exist,or the group does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "Update an explicit group permission for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Updates the group permission if it exists.\n\nOnly users with admin permission for the repository may access this resource.\n\nThe only authentication method supported for this endpoint is via app passwords.\n\nPermissions can be:\n\n* `admin`\n* `write`\n* `read`\n\nExample:\n```\n$ curl -X PUT -H \"Content-Type: application/json\"\nhttps://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/groups/developers\n-d\n'{\n \"permission\": \"write\"\n}'\n\nHTTP/1.1 200\nLocation:\nhttps://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/groups/developers\n\n{\n \"type\": \"repository_group_permission\",\n \"group\": {\n \"type\": \"group\",\n \"name\": \"Developers\",\n \"slug\": \"developers\"\n },\n \"repository\": {\n \"type\": \"repository\",\n \"name\": \"geordi\",\n \"full_name\": \"atlassian_tutorial/geordi\",\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"permission\": \"write\",\n \"links\": {\n \"self\": {\n \"href\":\n \"https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/groups/developers\"\n }\n }\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "group_slug",
+ "in": "path",
+ "description": "Slug of the requested group.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/permissions-config/users": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Paginated of explicit user permissions on the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_repository_user_permissions"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The user couldn't be authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "The requesting user isn't an admin of the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No repository exists for the given repo slug and workspace.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "List explicit user permissions for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of explicit user permissions for the given repository.\n\nExample:\n\n```\n$ curl https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/permissions-config/users\n\n{\n \"pagelen\": 10,\n \"values\": [\n {\n \"type\": \"repository_user_permission\",\n \"user\": {\n \"type\": \"user\",\n \"display_name\": \"Colin Cameron\",\n \"uuid\": \"{d301aafa-d676-4ee0-88be-962be7417567}\",\n \"account_id\": \"557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a\"\n },\n \"permission\": \"admin\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/\n permissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a\"\n }\n }\n },\n {\n \"type\": \"repository_user_permission\",\n \"user\": {\n \"type\": \"user\",\n \"display_name\": \"Sean Conaty\",\n \"uuid\": \"{504c3b62-8120-4f0c-a7bc-87800b9d6f70}\",\n \"account_id\": \"557058:ba8948b2-49da-43a9-9e8b-e7249b8e324c\"\n },\n \"permission\": \"write\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0//repositories/atlassian_tutorial/geordi/\n permissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324c\"\n }\n }\n }\n ],\n \"page\": 1,\n \"size\": 2\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/permissions-config/users/{selected_user_id}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The repository user permission was deleted and no content returned."
+ },
+ "401": {
+ "description": "The user couldn't be authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "The requesting user isn't an admin of the repository, or the authentication method was not via app password.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "One or more of the workspace, repository, and user doesn't exist for the given identifiers.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "Delete an explicit user permission for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes the repository user permission between the requested repository and user, if one exists.\n\nOnly users with admin permission for the repository may access this resource.\n\nThe only authentication method for this endpoint is via app passwords.\n\n```\n$ curl -X DELETE https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/\npermissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a\n\n\nHTTP/1.1 204\n```"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Explicit user permission for user and repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository_user_permission"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The user couldn't be authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "The requesting user isn't an admin of the repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "One or both of the workspace and repository doesn't exist for the given identifiers.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "Get an explicit user permission for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the explicit user permission for a given user and repository.\n\nOnly users with admin permission for the repository may access this resource.\n\nPermissions can be:\n\n* `admin`\n* `write`\n* `read`\n* `none`\n\nExample:\n\n```\n$ curl 'https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/\n permissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a'\n\nHTTP/1.1 200\nLocation: 'https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/\n permissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a'\n\n{\n \"type\": \"repository_user_permission\",\n \"user\": {\n \"type\": \"user\",\n \"display_name\": \"Colin Cameron\",\n \"uuid\": \"{d301aafa-d676-4ee0-88be-962be7417567}\",\n \"account_id\": \"557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a\"\n },\n \"repository\": {\n \"type\": \"repository\",\n \"name\": \"geordi\",\n \"full_name\": \"atlassian_tutorial/geordi\",\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"permission\": \"admin\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/\n permissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a\"\n }\n }\n}\n```"
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "Explicit user permission updated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/repository_user_permission"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "No permission value was provided or the value is invalid (not one of read, write, or admin), or the selected user is not a valid user to update.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The user couldn't be authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "The requesting user isn't an admin of the repository, or the authentication method was not via app password.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "One or more of the workspace, repo, and selected user doesn't exist for the given identifiers.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Repositories"],
+ "summary": "Update an explicit user permission for a repository",
+ "security": [
+ {
+ "oauth2": ["repository:admin"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Updates the explicit user permission for a given user and repository. The selected user must be a member of\nthe workspace, and cannot be the workspace owner.\nOnly users with admin permission for the repository may access this resource.\n\nThe only authentication method for this endpoint is via app passwords.\n\nPermissions can be:\n\n* `admin`\n* `write`\n* `read`\n\nExample:\n\n```\n$ curl -X PUT -H \"Content-Type: application/json\" 'https://api.bitbucket.org/2.0/repositories/\natlassian_tutorial/geordi/permissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a'\n-d '{\n \"permission\": \"write\"\n}'\n\nHTTP/1.1 200\nLocation: 'https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/\npermissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a'\n\n\n{\n \"type\": \"repository_user_permission\",\n \"user\": {\n \"type\": \"user\",\n \"display_name\": \"Colin Cameron\",\n \"uuid\": \"{d301aafa-d676-4ee0-88be-962be7417567}\",\n \"account_id\": \"557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a\"\n },\n \"repository\": {\n \"type\": \"repository\",\n \"name\": \"geordi\",\n \"full_name\": \"atlassian_tutorial/geordi\",\n \"uuid\": \"{85d08b4e-571d-44e9-a507-fa476535aa98}\"\n },\n \"permission\": \"write\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian_tutorial/geordi/\n permissions-config/users/557058:ba8948b2-49da-43a9-9e8b-e7249b8e324a\"\n }\n }\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "selected_user_id",
+ "in": "path",
+ "description": "This can either be the UUID of the account, surrounded by curly-braces, for\nexample: `{account UUID}`, OR an Atlassian Account ID.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines-config/caches/": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The list of caches for the given repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pipeline_caches"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve the repository pipelines caches.",
+ "parameters": [
+ {
+ "description": "The account.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "List caches",
+ "operationId": "getRepositoryPipelineCaches"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines-config/caches/{cache_uuid}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The cache was deleted."
+ },
+ "404": {
+ "description": "The workspace, repository or cache_uuid with given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Delete a repository cache.",
+ "parameters": [
+ {
+ "description": "The account.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the cache to delete.",
+ "required": true,
+ "name": "cache_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Delete a cache",
+ "operationId": "deleteRepositoryPipelineCache"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines-config/caches/{cache_uuid}/content-uri": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The cache content uri.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_cache_content_uri"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The workspace, repository or cache_uuid with given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve the URI of the content of the specified cache.",
+ "parameters": [
+ {
+ "description": "The account.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the cache.",
+ "required": true,
+ "name": "cache_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get cache content URI",
+ "operationId": "getRepositoryPipelineCacheContentURI"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/": {
+ "post": {
+ "responses": {
+ "201": {
+ "headers": {
+ "Location": {
+ "description": "The URL of the newly created pipeline.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": "The initiated pipeline.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The account or repository is not enabled, the yml file does not exist in the repository for the given revision, or the request body contained invalid properties.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Endpoint to create and initiate a pipeline.\nThere are a couple of different options to initiate a pipeline, where the payload of the request will determine which type of pipeline will be instantiated.\n# Trigger a Pipeline for a branch\nOne way to trigger pipelines is by specifying the branch for which you want to trigger a pipeline.\nThe specified branch will be used to determine which pipeline definition from the `bitbucket-pipelines.yml` file will be applied to initiate the pipeline. The pipeline will then do a clone of the repository and checkout the latest revision of the specified branch.\n\n### Example\n\n```\n$ curl -X POST -is -u username:password \\\n -H 'Content-Type: application/json' \\\n https://api.bitbucket.org/2.0/repositories/jeroendr/meat-demo2/pipelines/ \\\n -d '\n {\n \"target\": {\n \"ref_type\": \"branch\",\n \"type\": \"pipeline_ref_target\",\n \"ref_name\": \"master\"\n }\n }'\n```\n# Trigger a Pipeline for a commit on a branch or tag\nYou can initiate a pipeline for a specific commit and in the context of a specified reference (e.g. a branch, tag or bookmark).\nThe specified reference will be used to determine which pipeline definition from the bitbucket-pipelines.yml file will be applied to initiate the pipeline. The pipeline will clone the repository and then do a checkout the specified reference.\n\nThe following reference types are supported:\n\n* `branch`\n* `named_branch`\n* `bookmark`\n * `tag`\n\n### Example\n\n```\n$ curl -X POST -is -u username:password \\\n -H 'Content-Type: application/json' \\\n https://api.bitbucket.org/2.0/repositories/jeroendr/meat-demo2/pipelines/ \\\n -d '\n {\n \"target\": {\n \"commit\": {\n \"type\": \"commit\",\n \"hash\": \"ce5b7431602f7cbba007062eeb55225c6e18e956\"\n },\n \"ref_type\": \"branch\",\n \"type\": \"pipeline_ref_target\",\n \"ref_name\": \"master\"\n }\n }'\n```\n# Trigger a specific pipeline definition for a commit\nYou can trigger a specific pipeline that is defined in your `bitbucket-pipelines.yml` file for a specific commit.\nIn addition to the commit revision, you specify the type and pattern of the selector that identifies the pipeline definition. The resulting pipeline will then clone the repository and checkout the specified revision.\n\n### Example\n\n```\n$ curl -X POST -is -u username:password \\\n -H 'Content-Type: application/json' \\\n https://api.bitbucket.org/2.0/repositories/jeroendr/meat-demo2/pipelines/ \\\n -d '\n {\n \"target\": {\n \"commit\": {\n \"hash\":\"a3c4e02c9a3755eccdc3764e6ea13facdf30f923\",\n \"type\":\"commit\"\n },\n \"selector\": {\n \"type\":\"custom\",\n \"pattern\":\"Deploy to production\"\n },\n \"type\":\"pipeline_commit_target\"\n }\n }'\n```\n# Trigger a specific pipeline definition for a commit on a branch or tag\nYou can trigger a specific pipeline that is defined in your `bitbucket-pipelines.yml` file for a specific commit in the context of a specified reference.\nIn addition to the commit revision, you specify the type and pattern of the selector that identifies the pipeline definition, as well as the reference information. The resulting pipeline will then clone the repository a checkout the specified reference.\n\n### Example\n\n```\n$ curl -X POST -is -u username:password \\\n -H 'Content-Type: application/json' \\\n https://api.bitbucket.org/2.0/repositories/jeroendr/meat-demo2/pipelines/ \\\n -d '\n {\n \"target\": {\n \"commit\": {\n \"hash\":\"a3c4e02c9a3755eccdc3764e6ea13facdf30f923\",\n \"type\":\"commit\"\n },\n \"selector\": {\n \"type\": \"custom\",\n \"pattern\": \"Deploy to production\"\n },\n \"type\": \"pipeline_ref_target\",\n \"ref_name\": \"master\",\n \"ref_type\": \"branch\"\n }\n }'\n```\n\n\n# Trigger a custom pipeline with variables\nIn addition to triggering a custom pipeline that is defined in your `bitbucket-pipelines.yml` file as shown in the examples above, you can specify variables that will be available for your build. In the request, provide a list of variables, specifying the following for each variable: key, value, and whether it should be secured or not (this field is optional and defaults to not secured).\n\n### Example\n\n```\n$ curl -X POST -is -u username:password \\\n -H 'Content-Type: application/json' \\\n https://api.bitbucket.org/2.0/repositories/{workspace}/{repo_slug}/pipelines/ \\\n -d '\n {\n \"target\": {\n \"type\": \"pipeline_ref_target\",\n \"ref_type\": \"branch\",\n \"ref_name\": \"master\",\n \"selector\": {\n \"type\": \"custom\",\n \"pattern\": \"Deploy to production\"\n }\n },\n \"variables\": [\n {\n \"key\": \"var1key\",\n \"value\": \"var1value\",\n \"secured\": true\n },\n {\n \"key\": \"var2key\",\n \"value\": \"var2value\"\n }\n ]\n }'\n```\n\n# Trigger a pull request pipeline\n\nYou can also initiate a pipeline for a specific pull request.\n\n### Example\n\n```\n$ curl -X POST -is -u username:password \\\n -H 'Content-Type: application/json' \\\n https://api.bitbucket.org/2.0/repositories/{workspace}/{repo_slug}/pipelines/ \\\n -d '\n {\n\t\"target\": {\n \"type\": \"pipeline_pullrequest_target\",\n\t \"source\": \"pull-request-branch\",\n \"destination\": \"master\",\n \"destination_commit\": {\n \t \"hash\" : \"9f848b7\"\n },\n \"commit\": {\n \t\"hash\" : \"1a372fc\"\n },\n \"pullrequest\" : {\n \t\"id\" : \"3\"\n },\n\t \"selector\": {\n \"type\": \"pull-requests\",\n \"pattern\": \"**\"\n }\n }\n }'\n```\n",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline"
+ }
+ }
+ },
+ "description": "The pipeline to initiate.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Run a pipeline",
+ "operationId": "createPipelineForRepository"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The matching pipelines.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pipelines"
+ }
+ }
+ }
+ }
+ },
+ "description": "Find pipelines",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "List pipelines",
+ "operationId": "getPipelinesForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The pipeline.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No account, repository or pipeline with the UUID provided exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve a specified pipeline",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The pipeline UUID.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get a pipeline",
+ "operationId": "getPipelineForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}/steps/": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The steps.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pipeline_steps"
+ }
+ }
+ }
+ }
+ },
+ "description": "Find steps for the given pipeline.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the pipeline.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "List steps for a pipeline",
+ "operationId": "getPipelineStepsForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}/steps/{step_uuid}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The step.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_step"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No account, repository, pipeline or step with the UUID provided exists for the pipeline with the UUID provided.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve a given step of a pipeline.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the pipeline.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the step.",
+ "required": true,
+ "name": "step_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get a step of a pipeline",
+ "operationId": "getPipelineStepForRepository"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}/steps/{step_uuid}/log": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The raw log file for this pipeline step."
+ },
+ "304": {
+ "description": "The log has the same etag as the provided If-None-Match header.",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "A pipeline with the given UUID does not exist, a step with the given UUID does not exist in the pipeline or a log file does not exist for the given step.",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "416": {
+ "description": "The requested range does not exist for requests that specified the [HTTP Range header](https://tools.ietf.org/html/rfc7233#section-3.1).",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the pipeline.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the step.",
+ "required": true,
+ "name": "step_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get log file for a step",
+ "operationId": "getPipelineStepLogForRepository",
+ "description": "Retrieve the log file for a given step of a pipeline.\n\nThis endpoint supports (and encourages!) the use of [HTTP Range requests](https://tools.ietf.org/html/rfc7233) to deal with potentially very large log files."
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}/steps/{step_uuid}/logs/{log_uuid}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The raw log file for the build container or service container."
+ },
+ "404": {
+ "description": "No account, repository, pipeline, step or log exist for the provided path.",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the pipeline.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the step.",
+ "required": true,
+ "name": "step_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "For the main build container specify the step UUID; for a service container specify the service container UUID",
+ "required": true,
+ "name": "log_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get the logs for the build container or a service container for a given step of a pipeline.",
+ "operationId": "getPipelineContainerLog",
+ "description": "Retrieve the log file for a build container or service container.\n\nThis endpoint supports (and encourages!) the use of [HTTP Range requests](https://tools.ietf.org/html/rfc7233) to deal with potentially very large log files."
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}/steps/{step_uuid}/test_reports": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A summary of test reports for this pipeline step."
+ },
+ "404": {
+ "description": "No account, repository, pipeline, step or test reports exist for the provided path.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the pipeline.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the step.",
+ "required": true,
+ "name": "step_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get a summary of test reports for a given step of a pipeline.",
+ "operationId": "getPipelineTestReports"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}/steps/{step_uuid}/test_reports/test_cases": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Test cases for this pipeline step."
+ },
+ "404": {
+ "description": "No account, repository, pipeline, step or test reports exist for the provided path.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the pipeline.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the step.",
+ "required": true,
+ "name": "step_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get test cases for a given step of a pipeline.",
+ "operationId": "getPipelineTestReportTestCases"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}/steps/{step_uuid}/test_reports/test_cases/{test_case_uuid}/test_case_reasons": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Test case reasons (output)."
+ },
+ "404": {
+ "description": "No account, repository, pipeline, step or test case with the UUID provided exists for the pipeline with the UUID provided.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the pipeline.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the step.",
+ "required": true,
+ "name": "step_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the test case.",
+ "required": true,
+ "name": "test_case_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get test case reasons (output) for a given test case in a step of a pipeline.",
+ "operationId": "getPipelineTestReportTestCaseReasons"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines/{pipeline_uuid}/stopPipeline": {
+ "post": {
+ "responses": {
+ "204": {
+ "description": "The pipeline has been signaled to stop."
+ },
+ "400": {
+ "description": "The specified pipeline has already completed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Either the account, repository or pipeline with the given UUID does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Signal the stop of a pipeline and all of its steps that not have completed yet.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the pipeline.",
+ "required": true,
+ "name": "pipeline_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Stop a pipeline",
+ "operationId": "stopPipeline"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The repository pipelines configuration was updated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipelines_config"
+ }
+ }
+ }
+ }
+ },
+ "description": "Update the pipelines configuration for a repository.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipelines_config"
+ }
+ }
+ },
+ "description": "The updated repository pipelines configuration.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Update configuration",
+ "operationId": "updateRepositoryPipelineConfig"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The repository pipelines configuration.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipelines_config"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve the repository pipelines configuration.",
+ "parameters": [
+ {
+ "description": "The account.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get configuration",
+ "operationId": "getRepositoryPipelineConfig"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/build_number": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The build number has been configured.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_build_number"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The update failed because the next number was invalid (it should be higher than the current number).",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Update the next build number that should be assigned to a pipeline. The next build number that will be configured has to be strictly higher than the current latest build number for this repository.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_build_number"
+ }
+ }
+ },
+ "description": "The build number to update.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Update the next build number",
+ "operationId": "updateRepositoryBuildNumber"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/schedules/": {
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The created schedule.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_schedule"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "There were errors validating the request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The maximum limit of schedules for this repository was reached.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Create a schedule for the given repository.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_schedule"
+ }
+ }
+ },
+ "description": "The schedule to create.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Create a schedule",
+ "operationId": "createRepositoryPipelineSchedule"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The list of schedules.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pipeline_schedules"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve the configured schedules for the given repository.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "List schedules",
+ "operationId": "getRepositoryPipelineSchedules"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/schedules/{schedule_uuid}": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The schedule is updated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_schedule"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository or schedule was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Update a schedule.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The uuid of the schedule.",
+ "required": true,
+ "name": "schedule_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_schedule"
+ }
+ }
+ },
+ "description": "The schedule to update.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Update a schedule",
+ "operationId": "updateRepositoryPipelineSchedule"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The requested schedule.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_schedule"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository or schedule was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve a schedule by its UUID.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The uuid of the schedule.",
+ "required": true,
+ "name": "schedule_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get a schedule",
+ "operationId": "getRepositoryPipelineSchedule"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The schedule was deleted."
+ },
+ "404": {
+ "description": "The account, repository or schedule was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Delete a schedule.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The uuid of the schedule.",
+ "required": true,
+ "name": "schedule_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Delete a schedule",
+ "operationId": "deleteRepositoryPipelineSchedule"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/schedules/{schedule_uuid}/executions/": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The list of executions of a schedule.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pipeline_schedule_executions"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve the executions of a given schedule.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The uuid of the schedule.",
+ "required": true,
+ "name": "schedule_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "List executions of a schedule",
+ "operationId": "getRepositoryPipelineScheduleExecutions"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/ssh/key_pair": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The SSH key pair was created or updated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_ssh_key_pair"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository or SSH key pair was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Create or update the repository SSH key pair. The private key will be set as a default SSH identity in your build container.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_ssh_key_pair"
+ }
+ }
+ },
+ "description": "The created or updated SSH key pair.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Update SSH key pair",
+ "operationId": "updateRepositoryPipelineKeyPair"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The SSH key pair.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_ssh_key_pair"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository or SSH key pair was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve the repository SSH key pair excluding the SSH private key. The private key is a write only field and will never be exposed in the logs or the REST API.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get SSH key pair",
+ "operationId": "getRepositoryPipelineSshKeyPair"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The SSH key pair was deleted."
+ },
+ "404": {
+ "description": "The account, repository or SSH key pair was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Delete the repository SSH key pair.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Delete SSH key pair",
+ "operationId": "deleteRepositoryPipelineKeyPair"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/ssh/known_hosts/": {
+ "post": {
+ "responses": {
+ "201": {
+ "headers": {
+ "Location": {
+ "description": "The URL of the newly created pipeline known host.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": "The known host was created.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_known_host"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "A known host with the provided hostname already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Create a repository level known host.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_known_host"
+ }
+ }
+ },
+ "description": "The known host to create.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Create a known host",
+ "operationId": "createRepositoryPipelineKnownHost"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The retrieved known hosts.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pipeline_known_hosts"
+ }
+ }
+ }
+ }
+ },
+ "description": "Find repository level known hosts.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "List known hosts",
+ "operationId": "getRepositoryPipelineKnownHosts"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/ssh/known_hosts/{known_host_uuid}": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The known host was updated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_known_host"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository or known host with the given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Update a repository level known host.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the known host to update.",
+ "required": true,
+ "name": "known_host_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_known_host"
+ }
+ }
+ },
+ "description": "The updated known host.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Update a known host",
+ "operationId": "updateRepositoryPipelineKnownHost"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The known host.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_known_host"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository or known host with the specified UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve a repository level known host.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the known host to retrieve.",
+ "required": true,
+ "name": "known_host_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get a known host",
+ "operationId": "getRepositoryPipelineKnownHost"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The known host was deleted."
+ },
+ "404": {
+ "description": "The account, repository or known host with given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Delete a repository level known host.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the known host to delete.",
+ "required": true,
+ "name": "known_host_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Delete a known host",
+ "operationId": "deleteRepositoryPipelineKnownHost"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/variables/": {
+ "post": {
+ "responses": {
+ "201": {
+ "headers": {
+ "Location": {
+ "description": "The URL of the newly created pipeline variable.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": "The variable was created.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_variable"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account or repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "A variable with the provided key already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Create a repository level variable.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_variable"
+ }
+ }
+ },
+ "description": "The variable to create.",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Create a variable for a repository",
+ "operationId": "createRepositoryPipelineVariable"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The retrieved variables.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pipeline_variables"
+ }
+ }
+ }
+ }
+ },
+ "description": "Find repository level variables.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "List variables for a repository",
+ "operationId": "getRepositoryPipelineVariables"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pipelines_config/variables/{variable_uuid}": {
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The variable was updated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_variable"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository or variable with the given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Update a repository level variable.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the variable to update.",
+ "required": true,
+ "name": "variable_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_variable"
+ }
+ }
+ },
+ "description": "The updated variable",
+ "required": true
+ },
+ "tags": ["Pipelines"],
+ "summary": "Update a variable for a repository",
+ "operationId": "updateRepositoryPipelineVariable"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The variable.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pipeline_variable"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The account, repository or variable with the specified UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieve a repository level variable.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the variable to retrieve.",
+ "required": true,
+ "name": "variable_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Get a variable for a repository",
+ "operationId": "getRepositoryPipelineVariable"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "The variable was deleted."
+ },
+ "404": {
+ "description": "The account, repository or variable with given UUID was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "description": "Delete a repository level variable.",
+ "parameters": [
+ {
+ "description": "This can either be the workspace ID (slug) or the workspace UUID surrounded by curly-braces, for example `{workspace UUID}`.",
+ "required": true,
+ "name": "workspace",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The repository.",
+ "required": true,
+ "name": "repo_slug",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The UUID of the variable to delete.",
+ "required": true,
+ "name": "variable_uuid",
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pipelines"],
+ "summary": "Delete a variable for a repository",
+ "operationId": "deleteRepositoryPipelineVariable"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/properties/{app_key}/{property_name}": {
+ "put": {
+ "responses": {
+ "204": {
+ "description": "An empty response."
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "$ref": "#/components/requestBodies/application_property"
+ },
+ "tags": ["properties"],
+ "description": "Update an [application property](/cloud/bitbucket/application-properties/) value stored against a repository.",
+ "summary": "Update a repository application property",
+ "operationId": "updateRepositoryHostedPropertyValue"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "An empty response."
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["properties"],
+ "description": "Delete an [application property](/cloud/bitbucket/application-properties/) value stored against a repository.",
+ "summary": "Delete a repository application property",
+ "operationId": "deleteRepositoryHostedPropertyValue"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The value of the property.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/application_property"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["properties"],
+ "description": "Retrieve an [application property](/cloud/bitbucket/application-properties/) value stored against a repository.",
+ "summary": "Get a repository application property",
+ "operationId": "getRepositoryHostedPropertyValue"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "All pull requests on the specified repository.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pullrequests"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the specified repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "state",
+ "in": "query",
+ "description": "Only return pull requests that are in this state. This parameter can be repeated.",
+ "schema": {
+ "type": "string",
+ "enum": ["MERGED", "SUPERSEDED", "OPEN", "DECLINED"]
+ }
+ }
+ ],
+ "tags": ["Pullrequests"],
+ "summary": "List pull requests",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns all pull requests on the specified repository.\n\nBy default only open pull requests are returned. This can be controlled\nusing the `state` query parameter. To retrieve pull requests that are\nin one of multiple states, repeat the `state` parameter for each\nindividual state.\n\nThis endpoint also supports filtering and sorting of the results. See\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering) for more details."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created pull request.",
+ "headers": {
+ "Location": {
+ "description": "The URL of new newly created pull request.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the input document was invalid, or if the caller lacks the privilege to create repositories under the targeted account.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest"
+ }
+ }
+ },
+ "description": "The new pull request.\n\nThe request URL you POST to becomes the destination repository URL. For this reason, you must specify an explicit source repository in the request object if you want to pull from a different repository (fork).\n\nSince not all elements are required or even mutable, you only need to include the elements you want to initialize, such as the source branch and the title."
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Create a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new pull request where the destination repository is\nthis repository and the author is the authenticated user.\n\nThe minimum required fields to create a pull request are `title` and\n`source`, specified by a branch name.\n\n```\ncurl https://api.bitbucket.org/2.0/repositories/my-workspace/my-repository/pullrequests \\\n -u my-username:my-password \\\n --request POST \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"title\": \"My Title\",\n \"source\": {\n \"branch\": {\n \"name\": \"staging\"\n }\n }\n }'\n```\n\nIf the pull request's `destination` is not specified, it will default\nto the `repository.mainbranch`. To open a pull request to a\ndifferent branch, say from a feature branch to a staging branch,\nspecify a `destination` (same format as the `source`):\n\n```\n{\n \"title\": \"My Title\",\n \"source\": {\n \"branch\": {\n \"name\": \"my-feature-branch\"\n }\n },\n \"destination\": {\n \"branch\": {\n \"name\": \"staging\"\n }\n }\n}\n```\n\nReviewers can be specified by adding an array of user objects as the\n`reviewers` property.\n\n```\n{\n \"title\": \"My Title\",\n \"source\": {\n \"branch\": {\n \"name\": \"my-feature-branch\"\n }\n },\n \"reviewers\": [\n {\n \"uuid\": \"{504c3b62-8120-4f0c-a7bc-87800b9d6f70}\"\n }\n ]\n}\n```\n\nOther fields:\n\n* `description` - a string\n* `close_source_branch` - boolean that specifies if the source branch should be closed upon merging"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/activity": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The pull request activity log"
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the specified repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "List a pull request activity log",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of the pull request's activity log.\n\nThis handler serves both a v20 and internal endpoint. The v20 endpoint\nreturns reviewer comments, updates, approvals and request changes. The internal\nendpoint includes those plus tasks and attachments.\n\nComments created on a file or a line of code have an inline property.\n\nComment example:\n```\n{\n \"pagelen\": 20,\n \"values\": [\n {\n \"comment\": {\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695/comments/118571088\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695/_/diff#comment-118571088\"\n }\n },\n \"deleted\": false,\n \"pullrequest\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n },\n \"content\": {\n \"raw\": \"inline with to a dn from lines\",\n \"markup\": \"markdown\",\n \"html\": \"inline with to a dn from lines
\",\n \"type\": \"rendered\"\n },\n \"created_on\": \"2019-09-27T00:33:46.039178+00:00\",\n \"user\": {\n \"display_name\": \"Name Lastname\",\n \"uuid\": \"{}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/users/%7B%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/:/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"Name\",\n \"account_id\": \"\"\n },\n \"created_on\": \"2019-09-27T00:33:46.039178+00:00\",\n \"user\": {\n \"display_name\": \"Name Lastname\",\n \"uuid\": \"{}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/users/%7B%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/:/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"Name\",\n \"account_id\": \"\"\n },\n \"updated_on\": \"2019-09-27T00:33:46.055384+00:00\",\n \"inline\": {\n \"context_lines\": \"\",\n \"to\": null,\n \"path\": \"\",\n \"outdated\": false,\n \"from\": 211\n },\n \"type\": \"pullrequest_comment\",\n \"id\": 118571088\n },\n \"pull_request\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n }\n }\n ]\n}\n```\n\nUpdates include a state property of OPEN, MERGED, or DECLINED.\n\nUpdate example:\n```\n{\n \"pagelen\": 20,\n \"values\": [\n {\n \"update\": {\n \"description\": \"\",\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\",\n \"destination\": {\n \"commit\": {\n \"type\": \"commit\",\n \"hash\": \"6a2c16e4a152\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/commit/6a2c16e4a152\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/commits/6a2c16e4a152\"\n }\n }\n },\n \"branch\": {\n \"name\": \"master\"\n },\n \"repository\": {\n \"name\": \"Atlaskit-MK-2\",\n \"type\": \"repository\",\n \"full_name\": \"atlassian/atlaskit-mk-2\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2\"\n },\n \"avatar\": {\n \"href\": \"https://bytebucket.org/ravatar/%7B%7D?ts=js\"\n }\n },\n \"uuid\": \"{}\"\n }\n },\n \"reason\": \"\",\n \"source\": {\n \"commit\": {\n \"type\": \"commit\",\n \"hash\": \"728c8bad1813\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/commit/728c8bad1813\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/commits/728c8bad1813\"\n }\n }\n },\n \"branch\": {\n \"name\": \"username/NONE-add-onClick-prop-for-accessibility\"\n },\n \"repository\": {\n \"name\": \"Atlaskit-MK-2\",\n \"type\": \"repository\",\n \"full_name\": \"atlassian/atlaskit-mk-2\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2\"\n },\n \"avatar\": {\n \"href\": \"https://bytebucket.org/ravatar/%7B%7D?ts=js\"\n }\n },\n \"uuid\": \"{}\"\n }\n },\n \"state\": \"OPEN\",\n \"author\": {\n \"display_name\": \"Name Lastname\",\n \"uuid\": \"{}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/users/%7B%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/:/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"Name\",\n \"account_id\": \"\"\n },\n \"date\": \"2019-05-10T06:48:25.305565+00:00\"\n },\n \"pull_request\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n }\n }\n ]\n}\n```\n\nApproval example:\n```\n{\n \"pagelen\": 20,\n \"values\": [\n {\n \"approval\": {\n \"date\": \"2019-09-27T00:37:19.849534+00:00\",\n \"pullrequest\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n },\n \"user\": {\n \"display_name\": \"Name Lastname\",\n \"uuid\": \"{}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/users/%7B%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/:/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"Name\",\n \"account_id\": \"\"\n }\n },\n \"pull_request\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n }\n }\n ]\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The pull request object",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the repository or pull request does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Get a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the specified pull request."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The updated pull request",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "If the input document was invalid.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the request was not authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the repository or pull request id does not exist",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest"
+ }
+ }
+ },
+ "description": "The pull request that is to be updated."
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Update a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Mutates the specified pull request.\n\nThis can be used to change the pull request's branches or description.\n\nOnly open pull requests can be mutated."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/activity": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The pull request activity log"
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the specified repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "List a pull request activity log",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of the pull request's activity log.\n\nThis handler serves both a v20 and internal endpoint. The v20 endpoint\nreturns reviewer comments, updates, approvals and request changes. The internal\nendpoint includes those plus tasks and attachments.\n\nComments created on a file or a line of code have an inline property.\n\nComment example:\n```\n{\n \"pagelen\": 20,\n \"values\": [\n {\n \"comment\": {\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695/comments/118571088\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695/_/diff#comment-118571088\"\n }\n },\n \"deleted\": false,\n \"pullrequest\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n },\n \"content\": {\n \"raw\": \"inline with to a dn from lines\",\n \"markup\": \"markdown\",\n \"html\": \"inline with to a dn from lines
\",\n \"type\": \"rendered\"\n },\n \"created_on\": \"2019-09-27T00:33:46.039178+00:00\",\n \"user\": {\n \"display_name\": \"Name Lastname\",\n \"uuid\": \"{}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/users/%7B%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/:/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"Name\",\n \"account_id\": \"\"\n },\n \"created_on\": \"2019-09-27T00:33:46.039178+00:00\",\n \"user\": {\n \"display_name\": \"Name Lastname\",\n \"uuid\": \"{}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/users/%7B%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/:/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"Name\",\n \"account_id\": \"\"\n },\n \"updated_on\": \"2019-09-27T00:33:46.055384+00:00\",\n \"inline\": {\n \"context_lines\": \"\",\n \"to\": null,\n \"path\": \"\",\n \"outdated\": false,\n \"from\": 211\n },\n \"type\": \"pullrequest_comment\",\n \"id\": 118571088\n },\n \"pull_request\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n }\n }\n ]\n}\n```\n\nUpdates include a state property of OPEN, MERGED, or DECLINED.\n\nUpdate example:\n```\n{\n \"pagelen\": 20,\n \"values\": [\n {\n \"update\": {\n \"description\": \"\",\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\",\n \"destination\": {\n \"commit\": {\n \"type\": \"commit\",\n \"hash\": \"6a2c16e4a152\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/commit/6a2c16e4a152\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/commits/6a2c16e4a152\"\n }\n }\n },\n \"branch\": {\n \"name\": \"master\"\n },\n \"repository\": {\n \"name\": \"Atlaskit-MK-2\",\n \"type\": \"repository\",\n \"full_name\": \"atlassian/atlaskit-mk-2\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2\"\n },\n \"avatar\": {\n \"href\": \"https://bytebucket.org/ravatar/%7B%7D?ts=js\"\n }\n },\n \"uuid\": \"{}\"\n }\n },\n \"reason\": \"\",\n \"source\": {\n \"commit\": {\n \"type\": \"commit\",\n \"hash\": \"728c8bad1813\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/commit/728c8bad1813\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/commits/728c8bad1813\"\n }\n }\n },\n \"branch\": {\n \"name\": \"username/NONE-add-onClick-prop-for-accessibility\"\n },\n \"repository\": {\n \"name\": \"Atlaskit-MK-2\",\n \"type\": \"repository\",\n \"full_name\": \"atlassian/atlaskit-mk-2\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2\"\n },\n \"avatar\": {\n \"href\": \"https://bytebucket.org/ravatar/%7B%7D?ts=js\"\n }\n },\n \"uuid\": \"{}\"\n }\n },\n \"state\": \"OPEN\",\n \"author\": {\n \"display_name\": \"Name Lastname\",\n \"uuid\": \"{}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/users/%7B%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/:/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"Name\",\n \"account_id\": \"\"\n },\n \"date\": \"2019-05-10T06:48:25.305565+00:00\"\n },\n \"pull_request\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n }\n }\n ]\n}\n```\n\nApproval example:\n```\n{\n \"pagelen\": 20,\n \"values\": [\n {\n \"approval\": {\n \"date\": \"2019-09-27T00:37:19.849534+00:00\",\n \"pullrequest\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n },\n \"user\": {\n \"display_name\": \"Name Lastname\",\n \"uuid\": \"{}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/users/%7B%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/:/128\"\n }\n },\n \"type\": \"user\",\n \"nickname\": \"Name\",\n \"account_id\": \"\"\n }\n },\n \"pull_request\": {\n \"type\": \"pullrequest\",\n \"id\": 5695,\n \"links\": {\n \"self\": {\n \"href\": \"https://bitbucket.org/!api/2.0/repositories/atlassian/atlaskit-mk-2/pullrequests/5695\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/atlaskit-mk-2/pull-requests/5695\"\n }\n },\n \"title\": \"username/NONE: small change from onFocus to onClick to handle tabbing through the page and not expand the editor unless a click event triggers it\"\n }\n }\n ]\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/approve": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "An empty response indicating the authenticated user's approval has been withdrawn."
+ },
+ "401": {
+ "description": "The request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified pull request or the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Unapprove a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Redact the authenticated user's approval of the specified pull\nrequest."
+ },
+ "post": {
+ "responses": {
+ "200": {
+ "description": "The `participant` object recording that the authenticated user approved the pull request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/participant"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified pull request or the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Approve a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Approve the specified pull request as the authenticated user."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/comments": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of comments made on the given pull request, in chronological order.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_pullrequest_comments"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to the pull request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the pull request does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "List comments on a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of the pull request's comments.\n\nThis includes both global, inline comments and replies.\n\nThe default sorting is oldest to newest and can be overridden with\nthe `sort` query parameter.\n\nThis endpoint also supports filtering and sorting of the results. See\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering) for more\ndetails."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created comment.",
+ "headers": {
+ "Location": {
+ "description": "The URL of the new comment",
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest_comment"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to the pull request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the pull request does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest_comment"
+ }
+ }
+ },
+ "description": "The comment object.",
+ "required": true
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Create a comment on a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new pull request comment.\n\nReturns the newly created pull request comment."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/comments/{comment_id}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Successful deletion."
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to delete the comment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the comment does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Delete a comment on a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Deletes a specific pull request comment."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The comment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest_comment"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to the pull request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the comment does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Get a comment on a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a specific pull request comment."
+ },
+ "put": {
+ "responses": {
+ "200": {
+ "description": "The updated comment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest_comment"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to the comment.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the comment does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest_comment"
+ }
+ }
+ },
+ "description": "The contents of the updated comment.",
+ "required": true
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Update a comment on a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Updates a specific pull request comment."
+ },
+ "parameters": [
+ {
+ "name": "comment_id",
+ "in": "path",
+ "description": "The id of the comment.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/commits": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of commits made on the given pull request, in chronological order. This list will be empty if the source branch no longer exists."
+ },
+ "403": {
+ "description": "If the authenticated user does not have access to the pull request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "If the pull request does not exist or the source branch is from a forked repository which no longer exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "List commits on a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a paginated list of the pull request's commits.\n\nThese are the commits that are being merged into the destination\nbranch when the pull requests gets accepted."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/decline": {
+ "post": {
+ "responses": {
+ "200": {
+ "description": "The pull request was successfully declined.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest"
+ }
+ }
+ }
+ },
+ "555": {
+ "description": "If the decline took too long and timed out.\nIn this case the caller should retry the request later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Decline a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Declines the pull request."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/diff": {
+ "get": {
+ "responses": {
+ "302": {
+ "description": "Redirects to the [repository diff](/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-diff-spec-get) with the\nrevspec that corresponds to the pull request.\n"
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "List changes in a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Redirects to the [repository diff](/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-diff-spec-get)\nwith the revspec that corresponds to the pull request."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/diffstat": {
+ "get": {
+ "responses": {
+ "302": {
+ "description": "Redirects to the [repository diffstat](/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-diffstat-spec-get) with\nthe revspec that corresponds to pull request.\n"
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Get the diff stat for a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Redirects to the [repository diffstat](/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-diffstat-spec-get)\nwith the revspec that corresponds to the pull request."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/merge": {
+ "post": {
+ "responses": {
+ "200": {
+ "description": "The pull request object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest"
+ }
+ }
+ }
+ },
+ "202": {
+ "description": "In the Location header, the URL to poll for the pull request merge status"
+ },
+ "555": {
+ "description": "If the merge took too long and timed out.\nIn this case the caller should retry the request later",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "async",
+ "in": "query",
+ "description": "Default value is false.\n\n\nWhen set to true, runs merge asynchronously and\nimmediately returns a 202 with polling link to\nthe task-status API in the Location header.\n\n\nWhen set to false, runs merge and waits for it to\ncomplete, returning 200 when it succeeds. If the\nduration of the merge exceeds a timeout threshold,\nthe API returns a 202 with polling link to the\ntask-status API in the Location header.",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pullrequest_merge_parameters"
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Merge a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Merges the pull request."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/merge/task-status/{task_id}": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Returns a task status if the merge is either pending or successful, and if it is successful, a pull request"
+ },
+ "400": {
+ "description": "If the provided task ID does not relate to this pull request, or if something went wrong during the merge operation"
+ },
+ "403": {
+ "description": "The user making the request does not have permission to the repo and is different from the user who queued the task"
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Get the merge task status for a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "When merging a pull request takes too long, the client receives a\ntask ID along with a 202 status code. The task ID can be used in a call\nto this endpoint to check the status of a merge task.\n\n```\ncurl -X GET https://api.bitbucket.org/2.0/repositories/atlassian/bitbucket/pullrequests/2286/merge/task-status/\n```\n\nIf the merge task is not yet finished, a PENDING status will be returned.\n\n```\nHTTP/2 200\n{\n \"task_status\": \"PENDING\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/bitbucket/pullrequests/2286/merge/task-status/\"\n }\n }\n}\n```\n\nIf the merge was successful, a SUCCESS status will be returned.\n\n```\nHTTP/2 200\n{\n \"task_status\": \"SUCCESS\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/bitbucket/pullrequests/2286/merge/task-status/\"\n }\n },\n \"merge_result\": \n}\n```\n\nIf the merge task failed, an error will be returned.\n\n```\n{\n \"type\": \"error\",\n \"error\": {\n \"message\": \"\"\n }\n}\n```"
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "task_id",
+ "in": "path",
+ "description": "ID of the merge task",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/patch": {
+ "get": {
+ "responses": {
+ "302": {
+ "description": "Redirects to the [repository patch](/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-patch-spec-get) with\nthe revspec that corresponds to pull request.\n"
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Get the patch for a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Redirects to the [repository patch](/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-patch-spec-get)\nwith the revspec that corresponds to pull request."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/request-changes": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "An empty response indicating the authenticated user's request for change has been withdrawn."
+ },
+ "401": {
+ "description": "The request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified pull request or the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Remove change request for a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": ""
+ },
+ "post": {
+ "responses": {
+ "200": {
+ "description": "The `participant` object recording that the authenticated user requested changes on the pull request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/participant"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "The request wasn't authenticated.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified pull request or the repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Pullrequests"],
+ "summary": "Request changes for a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": ""
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/statuses": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of all commit statuses for this pull request.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_commitstatuses"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "If the repository is private and the request was not authenticated."
+ },
+ "404": {
+ "description": "If the specified repository or pull request does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "description": "Query string to narrow down the response as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "Field by which the results should be sorted as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).\nDefaults to `created_on`.\n",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Pullrequests", "Commit statuses"],
+ "summary": "List commit statuses for a pull request",
+ "security": [
+ {
+ "oauth2": ["pullrequest"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns all statuses (e.g. build results) for the given pull\nrequest."
+ },
+ "parameters": [
+ {
+ "name": "pull_request_id",
+ "in": "path",
+ "description": "The id of the pull request.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/pullrequests/{pullrequest_id}/properties/{app_key}/{property_name}": {
+ "put": {
+ "responses": {
+ "204": {
+ "description": "An empty response."
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The pull request ID.",
+ "in": "path",
+ "name": "pullrequest_id",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "$ref": "#/components/requestBodies/application_property"
+ },
+ "tags": ["properties"],
+ "description": "Update an [application property](/cloud/bitbucket/application-properties/) value stored against a pull request.",
+ "summary": "Update a pull request application property",
+ "operationId": "updatePullRequestHostedPropertyValue"
+ },
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "An empty response."
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The pull request ID.",
+ "in": "path",
+ "name": "pullrequest_id",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["properties"],
+ "description": "Delete an [application property](/cloud/bitbucket/application-properties/) value stored against a pull request.",
+ "summary": "Delete a pull request application property",
+ "operationId": "deletePullRequestHostedPropertyValue"
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The value of the property.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/application_property"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "required": true,
+ "description": "The repository container; either the workspace slug or the UUID in curly braces.",
+ "in": "path",
+ "name": "workspace",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The repository.",
+ "in": "path",
+ "name": "repo_slug",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The pull request ID.",
+ "in": "path",
+ "name": "pullrequest_id",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The key of the Connect app.",
+ "in": "path",
+ "name": "app_key",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "required": true,
+ "description": "The name of the property.",
+ "in": "path",
+ "name": "property_name",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["properties"],
+ "description": "Retrieve an [application property](/cloud/bitbucket/application-properties/) value stored against a pull request.",
+ "summary": "Get a pull request application property",
+ "operationId": "getPullRequestHostedPropertyValue"
+ }
+ },
+ "/repositories/{workspace}/{repo_slug}/refs": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of refs matching any filter criteria that were provided.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_refs"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the repository is private and the authenticated user does not have\naccess to it.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "description": "\nQuery string to narrow down the response as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "\nField by which the results should be sorted as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering). The `name`\nfield is handled specially for refs in that, if specified as the sort field, it\nuses a natural sort order instead of the default lexicographical sort order. For example,\nit will return ['1.1', '1.2', '1.10'] instead of ['1.1', '1.10', '1.2'].",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Refs"],
+ "summary": "List branches and tags",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns the branches and tags in the repository.\n\nBy default, results will be in the order the underlying source control system returns them and identical to\nthe ordering one sees when running \"$ git show-ref\". Note that this follows simple\nlexical ordering of the ref names.\n\nThis can be undesirable as it does apply any natural sorting semantics, meaning for instance that refs are\nsorted [\"branch1\", \"branch10\", \"branch2\", \"v10\", \"v11\", \"v9\"] instead of [\"branch1\", \"branch2\",\n\"branch10\", \"v9\", \"v10\", \"v11\"].\n\nSorting can be changed using the ?sort= query parameter. When using ?sort=name to explicitly sort on ref name,\nBitbucket will apply natural sorting and interpret numerical values as numbers instead of strings."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/refs/branches": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "A paginated list of branches matching any filter criteria that were provided.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/paginated_branches"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the repository is private and the authenticated user does not have\naccess to it.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "description": "\nQuery string to narrow down the response as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "description": "\nField by which the results should be sorted as per\n[filtering and sorting](/cloud/bitbucket/rest/intro/#filtering). The `name`\nfield is handled specially for branches in that, if specified as the sort field, it\nuses a natural sort order instead of the default lexicographical sort order. For example,\nit will return ['branch1', 'branch2', 'branch10'] instead of ['branch1', 'branch10', 'branch2'].",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "tags": ["Refs"],
+ "summary": "List open branches",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a list of all open branches within the specified repository.\n Results will be in the order the source control manager returns them.\n\n ```\n $ curl -s https://api.bitbucket.org/2.0/repositories/atlassian/aui/refs/branches?pagelen=1 | jq .\n {\n \"pagelen\": 1,\n \"size\": 187,\n \"values\": [\n {\n \"name\": \"issue-9.3/AUI-5343-assistive-class\",\n \"links\": {\n \"commits\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commits/issue-9.3/AUI-5343-assistive-class\"\n },\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/refs/branches/issue-9.3/AUI-5343-assistive-class\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/aui/branch/issue-9.3/AUI-5343-assistive-class\"\n }\n },\n \"default_merge_strategy\": \"squash\",\n \"merge_strategies\": [\n \"merge_commit\",\n \"squash\",\n \"fast_forward\"\n ],\n \"type\": \"branch\",\n \"target\": {\n \"hash\": \"e5d1cde9069fcb9f0af90403a4de2150c125a148\",\n \"repository\": {\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/aui\"\n },\n \"avatar\": {\n \"href\": \"https://bytebucket.org/ravatar/%7B585074de-7b60-4fd1-81ed-e0bc7fafbda5%7D?ts=86317\"\n }\n },\n \"type\": \"repository\",\n \"name\": \"aui\",\n \"full_name\": \"atlassian/aui\",\n \"uuid\": \"{585074de-7b60-4fd1-81ed-e0bc7fafbda5}\"\n },\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/e5d1cde9069fcb9f0af90403a4de2150c125a148\"\n },\n \"comments\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/e5d1cde9069fcb9f0af90403a4de2150c125a148/comments\"\n },\n \"patch\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/patch/e5d1cde9069fcb9f0af90403a4de2150c125a148\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/aui/commits/e5d1cde9069fcb9f0af90403a4de2150c125a148\"\n },\n \"diff\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/diff/e5d1cde9069fcb9f0af90403a4de2150c125a148\"\n },\n \"approve\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/e5d1cde9069fcb9f0af90403a4de2150c125a148/approve\"\n },\n \"statuses\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/e5d1cde9069fcb9f0af90403a4de2150c125a148/statuses\"\n }\n },\n \"author\": {\n \"raw\": \"Marcin Konopka \",\n \"type\": \"author\",\n \"user\": {\n \"display_name\": \"Marcin Konopka\",\n \"uuid\": \"{47cc24f4-2a05-4420-88fe-0417535a110a}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/users/%7B47cc24f4-2a05-4420-88fe-0417535a110a%7D\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/%7B47cc24f4-2a05-4420-88fe-0417535a110a%7D/\"\n },\n \"avatar\": {\n \"href\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/initials/MK-1.png\"\n }\n },\n \"nickname\": \"Marcin Konopka\",\n \"type\": \"user\",\n \"account_id\": \"60113d2b47a9540069f4de03\"\n }\n },\n \"parents\": [\n {\n \"hash\": \"87f7fc92b00464ae47b13ef65c91884e4ac9be51\",\n \"type\": \"commit\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/87f7fc92b00464ae47b13ef65c91884e4ac9be51\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/aui/commits/87f7fc92b00464ae47b13ef65c91884e4ac9be51\"\n }\n }\n }\n ],\n \"date\": \"2021-04-13T13:44:49+00:00\",\n \"message\": \"wip\n\",\n \"type\": \"commit\"\n }\n }\n ],\n \"page\": 1,\n \"next\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/refs/branches?pagelen=1&page=2\"\n }\n ```\n\n Branches support [filtering and sorting](/cloud/bitbucket/rest/intro/#filtering)\n that can be used to search for specific branches. For instance, to find\n all branches that have \"stab\" in their name:\n\n ```\n curl -s https://api.bitbucket.org/2.0/repositories/atlassian/aui/refs/branches -G --data-urlencode 'q=name ~ \"stab\"'\n ```\n\n By default, results will be in the order the underlying source control system returns them and identical to\n the ordering one sees when running \"$ git branch --list\". Note that this follows simple\n lexical ordering of the ref names.\n\n This can be undesirable as it does apply any natural sorting semantics, meaning for instance that tags are\n sorted [\"v10\", \"v11\", \"v9\"] instead of [\"v9\", \"v10\", \"v11\"].\n\n Sorting can be changed using the ?q= query parameter. When using ?q=name to explicitly sort on ref name,\n Bitbucket will apply natural sorting and interpret numerical values as numbers instead of strings."
+ },
+ "post": {
+ "responses": {
+ "201": {
+ "description": "The newly created branch object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branch"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the repository is private and the authenticated user does not have\naccess to it.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or branch does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Refs"],
+ "summary": "Create a branch",
+ "security": [
+ {
+ "oauth2": ["repository:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Creates a new branch in the specified repository.\n\nThe payload of the POST should consist of a JSON document that\ncontains the name of the tag and the target hash.\n\n```\ncurl https://api.bitbucket.org/2.0/repositories/seanfarley/hg/refs/branches \\\n-s -u seanfarley -X POST -H \"Content-Type: application/json\" \\\n-d '{\n \"name\" : \"smf/create-feature\",\n \"target\" : {\n \"hash\" : \"default\",\n }\n}'\n```\n\nThis call requires authentication. Private repositories require the\ncaller to authenticate with an account that has appropriate\nauthorization.\n\nThe branch name should not include any prefixes (e.g.\nrefs/heads). This endpoint does support using short hash prefixes for\nthe commit hash, but it may return a 400 response if the provided\nprefix is ambiguous. Using a full commit hash is the preferred\napproach."
+ },
+ "parameters": [
+ {
+ "name": "repo_slug",
+ "in": "path",
+ "description": "This can either be the repository slug or the UUID of the repository,\nsurrounded by curly-braces, for example: `{repository UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "workspace",
+ "in": "path",
+ "description": "This can either be the workspace ID (slug) or the workspace UUID\nsurrounded by curly-braces, for example: `{workspace UUID}`.\n",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "/repositories/{workspace}/{repo_slug}/refs/branches/{name}": {
+ "delete": {
+ "responses": {
+ "204": {
+ "description": "Indicates that the specified branch was successfully deleted."
+ },
+ "403": {
+ "description": "If the repository is private and the authenticated user does not have\naccess to it.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or branch does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Refs"],
+ "summary": "Delete a branch",
+ "security": [
+ {
+ "oauth2": ["repository:write"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Delete a branch in the specified repository.\n\nThe main branch is not allowed to be deleted and will return a 400\nresponse.\n\nThe branch name should not include any prefixes (e.g.\nrefs/heads)."
+ },
+ "get": {
+ "responses": {
+ "200": {
+ "description": "The branch object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/branch"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "If the repository is private and the authenticated user does not have\naccess to it.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The specified repository or branch does not exist.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error"
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Refs"],
+ "summary": "Get a branch",
+ "security": [
+ {
+ "oauth2": ["repository"]
+ },
+ {
+ "basic": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "description": "Returns a branch object within the specified repository.\n\n ```\n $ curl -s https://api.bitbucket.org/2.0/repositories/atlassian/aui/refs/branches/master | jq .\n {\n \"name\": \"master\",\n \"links\": {\n \"commits\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commits/master\"\n },\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/refs/branches/master\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/aui/branch/master\"\n }\n },\n \"default_merge_strategy\": \"squash\",\n \"merge_strategies\": [\n \"merge_commit\",\n \"squash\",\n \"fast_forward\"\n ],\n \"type\": \"branch\",\n \"target\": {\n \"hash\": \"e7d158ff7ed5538c28f94cd97a9ad569680fc94e\",\n \"repository\": {\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/aui\"\n },\n \"avatar\": {\n \"href\": \"https://bytebucket.org/ravatar/%7B585074de-7b60-4fd1-81ed-e0bc7fafbda5%7D?ts=86317\"\n }\n },\n \"type\": \"repository\",\n \"name\": \"aui\",\n \"full_name\": \"atlassian/aui\",\n \"uuid\": \"{585074de-7b60-4fd1-81ed-e0bc7fafbda5}\"\n },\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/e7d158ff7ed5538c28f94cd97a9ad569680fc94e\"\n },\n \"comments\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/e7d158ff7ed5538c28f94cd97a9ad569680fc94e/comments\"\n },\n \"patch\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/patch/e7d158ff7ed5538c28f94cd97a9ad569680fc94e\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/atlassian/aui/commits/e7d158ff7ed5538c28f94cd97a9ad569680fc94e\"\n },\n \"diff\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/diff/e7d158ff7ed5538c28f94cd97a9ad569680fc94e\"\n },\n \"approve\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/e7d158ff7ed5538c28f94cd97a9ad569680fc94e/approve\"\n },\n \"statuses\": {\n \"href\": \"https://api.bitbucket.org/2.0/repositories/atlassian/aui/commit/e7d158ff7ed5538c28f94cd97a9ad569680fc94e/statuses\"\n }\n },\n \"author\": {\n \"raw\": \"psre-renovate-bot