Merge remote-tracking branch 'upstream/master' into airbrake-backend

# Conflicts:
#	packages/backend/package.json
This commit is contained in:
Karan Shah
2022-02-04 14:08:30 +00:00
350 changed files with 4312 additions and 2050 deletions
@@ -1,6 +0,0 @@
---
'@backstage/core-components': patch
'@backstage/plugin-catalog-react': patch
---
The `<Link />` component now accepts a `noTrack` prop, which prevents the `click` event from being captured by the Analytics API. This can be used if tracking is explicitly not warranted, or in order to use custom link tracking in specific situations.
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/plugin-analytics-module-ga': patch
---
Added the ability to capture and set user IDs from Backstage's `identityApi`. For full instructions on how to
set this up, see [the User ID section of its README](https://github.com/backstage/backstage/tree/master/plugins/analytics-module-ga#user-ids)
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-code-coverage': patch
---
Fixed a bug in the FileExplorer component which made it impossible to navigate upwards to a containing folder by clicking on the folder breadcrumb.
-27
View File
@@ -1,27 +0,0 @@
---
'@backstage/plugin-auth-backend': minor
---
**BREAKING** Added `tokenManager` as a required property for the auth-backend `createRouter` function. This dependency is used to issue server tokens that are used by the `CatalogIdentityClient` when looking up users and their group membership during authentication.
These changes are **required** to `packages/backend/src/plugins/auth.ts`:
```diff
export default async function createPlugin({
logger,
database,
config,
discovery,
+ tokenManager,
}: PluginEnvironment): Promise<Router> {
return await createRouter({
logger,
config,
database,
discovery,
+ tokenManager,
});
}
```
**BREAKING** The `CatalogIdentityClient` constructor now expects a `TokenManager` instead of a `TokenIssuer`. The `TokenManager` interface is used to generate a server token when [resolving a user's identity and membership through the catalog](https://backstage.io/docs/auth/identity-resolver). Using server tokens for these requests allows the auth-backend to bypass authorization checks when permissions are enabled for Backstage. This change will break apps that rely on the user tokens that were previously used by the client. Refer to the ["Backend-to-backend Authentication" tutorial](https://backstage.io/docs/tutorials/backend-to-backend-auth) for more information on server token usage.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': patch
---
chore: bump `ansi-regex` from `5.0.1` to `6.0.1`
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-common': patch
---
Adds new `catalogEntityCreatePermission` which can be imported and used when authoring a permission policy to restrict/grant a user's access to the catalog import plugin. (And the "Register Existing Component" button which navigates there).
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-rollbar-backend': patch
---
chore(deps): bump `camelcase-keys` from 6.2.2 to 7.0.1
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-auth-backend': patch
---
chore(deps): bump `passport` from 0.4.1 to 0.5.2
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend': patch
---
chore(deps): bump `prom-client` from 13.2.0 to 14.0.1
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/create-app': patch
---
Apply the fix from `0.4.16`, which is part of the `v0.65.1` release of Backstage.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/core-components': patch
---
Change subtitle of Header style to use palette.bursts.fontColor
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-scaffolder': patch
---
Permission the Register Existing Component button
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/core-components': patch
---
Fix an issue where changes related to the `MobileSidebar` prevented scrolling pages. Additionally improve the menu of the `MobileSidebar` to not overlay the `BottomNavigation`.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Migrate from deprecated package @octokit/rest to octokit
-10
View File
@@ -1,10 +0,0 @@
---
'@backstage/plugin-catalog-react': patch
---
Fix bug: previously the filter would be set to "all" on page load, even if the
`initiallySelectedFilter` on the `DefaultCatalogPage` was set to something else,
or a different query parameter was supplied. Now, the prop and query parameters
control the filter as expected. Additionally, after this change any filters
which match 0 items will be disabled, and the filter will be reverted to 'all'
if they're set on page load.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-org': patch
---
Added `relations.memberof` filter to the catalog api call in `MemberListCard` to avoid fetching all the User entity kinds from catalog-backend.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/create-app': patch
---
Update backend-to-backend auth link in configuration file comment
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-search': patch
---
Modify modal search to clamp result length to 5 rows.
-150
View File
@@ -1,150 +0,0 @@
{
"mode": "pre",
"tag": "next",
"initialVersions": {
"example-app": "0.2.62",
"@backstage/app-defaults": "0.1.5",
"example-backend": "0.2.62",
"@backstage/backend-common": "0.10.5",
"@backstage/backend-tasks": "0.1.4",
"@backstage/backend-test-utils": "0.1.15",
"@backstage/catalog-client": "0.5.5",
"@backstage/catalog-model": "0.9.10",
"@backstage/cli": "0.13.0",
"@backstage/cli-common": "0.1.6",
"@backstage/codemods": "0.1.31",
"@backstage/config": "0.1.13",
"@backstage/config-loader": "0.9.3",
"@backstage/core-app-api": "0.5.1",
"@backstage/core-components": "0.8.6",
"@backstage/core-plugin-api": "0.6.0",
"@backstage/create-app": "0.4.15",
"@backstage/dev-utils": "0.2.19",
"e2e-test": "0.2.0",
"embedded-techdocs-app": "0.2.61",
"@backstage/errors": "0.2.0",
"@backstage/integration": "0.7.2",
"@backstage/integration-react": "0.1.19",
"@backstage/search-common": "0.2.2",
"@techdocs/cli": "0.8.11",
"@backstage/techdocs-common": "0.11.5",
"@backstage/test-utils": "0.2.3",
"@backstage/theme": "0.2.14",
"@backstage/types": "0.1.1",
"@backstage/version-bridge": "0.1.1",
"@backstage/plugin-airbrake": "0.1.1",
"@backstage/plugin-allure": "0.1.12",
"@backstage/plugin-analytics-module-ga": "0.1.7",
"@backstage/plugin-apache-airflow": "0.1.4",
"@backstage/plugin-api-docs": "0.7.0",
"@backstage/plugin-app-backend": "0.3.22",
"@backstage/plugin-auth-backend": "0.8.0",
"@backstage/plugin-azure-devops": "0.1.12",
"@backstage/plugin-azure-devops-backend": "0.3.1",
"@backstage/plugin-azure-devops-common": "0.2.0",
"@backstage/plugin-badges": "0.2.20",
"@backstage/plugin-badges-backend": "0.1.16",
"@backstage/plugin-bazaar": "0.1.11",
"@backstage/plugin-bazaar-backend": "0.1.7",
"@backstage/plugin-bitrise": "0.1.23",
"@backstage/plugin-catalog": "0.7.10",
"@backstage/plugin-catalog-backend": "0.21.1",
"@backstage/plugin-catalog-backend-module-ldap": "0.3.10",
"@backstage/plugin-catalog-backend-module-msgraph": "0.2.13",
"@backstage/plugin-catalog-common": "0.1.1",
"@backstage/plugin-catalog-graph": "0.2.8",
"@backstage/plugin-catalog-graphql": "0.3.1",
"@backstage/plugin-catalog-import": "0.7.10",
"@backstage/plugin-catalog-react": "0.6.12",
"@backstage/plugin-circleci": "0.2.35",
"@backstage/plugin-cloudbuild": "0.2.33",
"@backstage/plugin-code-coverage": "0.1.23",
"@backstage/plugin-code-coverage-backend": "0.1.20",
"@backstage/plugin-config-schema": "0.1.19",
"@backstage/plugin-cost-insights": "0.11.18",
"@backstage/plugin-explore": "0.3.27",
"@backstage/plugin-explore-react": "0.0.11",
"@backstage/plugin-firehydrant": "0.1.13",
"@backstage/plugin-fossa": "0.2.28",
"@backstage/plugin-gcp-projects": "0.3.15",
"@backstage/plugin-git-release-manager": "0.3.9",
"@backstage/plugin-github-actions": "0.4.33",
"@backstage/plugin-github-deployments": "0.1.27",
"@backstage/plugin-gitops-profiles": "0.3.14",
"@backstage/plugin-gocd": "0.1.2",
"@backstage/plugin-graphiql": "0.2.28",
"@backstage/plugin-graphql-backend": "0.1.12",
"@backstage/plugin-home": "0.4.12",
"@backstage/plugin-ilert": "0.1.22",
"@backstage/plugin-jenkins": "0.5.18",
"@backstage/plugin-jenkins-backend": "0.1.11",
"@backstage/plugin-kafka": "0.2.26",
"@backstage/plugin-kafka-backend": "0.2.15",
"@backstage/plugin-kubernetes": "0.5.5",
"@backstage/plugin-kubernetes-backend": "0.4.5",
"@backstage/plugin-kubernetes-common": "0.2.2",
"@backstage/plugin-lighthouse": "0.2.35",
"@backstage/plugin-newrelic": "0.3.14",
"@backstage/plugin-newrelic-dashboard": "0.1.4",
"@backstage/plugin-org": "0.4.0",
"@backstage/plugin-pagerduty": "0.3.23",
"@backstage/plugin-permission-backend": "0.4.1",
"@backstage/plugin-permission-common": "0.4.0",
"@backstage/plugin-permission-node": "0.4.1",
"@backstage/plugin-permission-react": "0.3.0",
"@backstage/plugin-proxy-backend": "0.2.16",
"@backstage/plugin-rollbar": "0.3.24",
"@backstage/plugin-rollbar-backend": "0.1.19",
"@backstage/plugin-scaffolder": "0.12.0",
"@backstage/plugin-scaffolder-backend": "0.15.22",
"@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.1.9",
"@backstage/plugin-scaffolder-backend-module-rails": "0.2.4",
"@backstage/plugin-scaffolder-backend-module-yeoman": "0.1.3",
"@backstage/plugin-scaffolder-common": "0.1.3",
"@backstage/plugin-search": "0.6.0",
"@backstage/plugin-search-backend": "0.4.0",
"@backstage/plugin-search-backend-module-elasticsearch": "0.0.8",
"@backstage/plugin-search-backend-module-pg": "0.2.4",
"@backstage/plugin-search-backend-node": "0.4.5",
"@backstage/plugin-sentry": "0.3.34",
"@backstage/plugin-shortcuts": "0.1.20",
"@backstage/plugin-sonarqube": "0.2.14",
"@backstage/plugin-splunk-on-call": "0.3.20",
"@backstage/plugin-tech-insights": "0.1.6",
"@backstage/plugin-tech-insights-backend": "0.2.2",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.6",
"@backstage/plugin-tech-insights-common": "0.2.1",
"@backstage/plugin-tech-insights-node": "0.2.0",
"@backstage/plugin-tech-radar": "0.5.3",
"@backstage/plugin-techdocs": "0.13.1",
"@backstage/plugin-techdocs-backend": "0.13.1",
"@backstage/plugin-todo": "0.1.20",
"@backstage/plugin-todo-backend": "0.1.19",
"@backstage/plugin-user-settings": "0.3.17",
"@backstage/plugin-xcmetrics": "0.2.16"
},
"changesets": [
"analytics-station-eleven",
"bright-buttons-rescue",
"dependabot-2f11dff",
"dependabot-9ec400d",
"dependabot-f969614",
"early-cooks-brake",
"flat-cars-begin",
"gold-queens-clap",
"grumpy-teachers-remain",
"nasty-pets-glow",
"neat-mangos-study",
"purple-steaks-design",
"quick-jars-wait",
"sharp-dragons-divide",
"sour-chairs-double",
"tall-rats-lie",
"tame-ads-exercise",
"techdocs-lets-call-the-whole-thing-off",
"thirty-houses-juggle",
"tiny-buses-compete",
"witty-lamps-laugh",
"witty-lizards-nail"
]
}
-18
View File
@@ -1,18 +0,0 @@
---
'@backstage/create-app': patch
---
Adds missing `/catalog-graph` route to `<CatalogGraphPage/>`.
To fix this problem for a recently created app please update your `app/src/App.tsx`
```diff
+ import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';
... omitted ...
</Route>
<Route path="/settings" element={<UserSettingsPage />} />
+ <Route path="/catalog-graph" element={<CatalogGraphPage />} />
</FlatRoutes>
```
-26
View File
@@ -1,26 +0,0 @@
---
'@backstage/plugin-proxy-backend': patch
---
Adds a new option `skipInvalidTargets` for the proxy `createRouter` which allows the proxy backend to be started with an invalid proxy configuration. If configured, it will simply skip the failed proxy and mount the other valid proxies.
To configure it to pass by failing proxies:
```
const router = await createRouter({
config,
logger,
discovery,
skipInvalidProxies: true,
});
```
If you would like it to fail if a proxy is configured badly:
```
const router = await createRouter({
config,
logger,
discovery,
});
```
-11
View File
@@ -1,11 +0,0 @@
---
'@backstage/backend-common': patch
---
Added a `Context` type for the backend, that can propagate an abort signal, a
deadline, and contextual values through the call stack. The main entrypoint is
the `Contexts` utility class that provides a root context creator and commonly
used decorators.
These are marked as `@alpha` for now, and are therefore only accessible via
`@backstage/backend-common/alpha`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-splunk-on-call': patch
---
Correct spelling of 'Acknowledge' in tooltip.
-5
View File
@@ -1,5 +0,0 @@
---
'@techdocs/cli': patch
---
Use a local file dependency for embedded-techdocs-app, to ensure that it's always pulled out of the workspace
-25
View File
@@ -1,25 +0,0 @@
---
'@backstage/create-app': patch
---
Permission the `catalog-import` route
The following changes are **required** if you intend to add permissions to your existing app.
Use the `PermissionedRoute` for `CatalogImportPage` instead of the normal `Route`:
```diff
// packages/app/src/App.tsx
...
+ import { PermissionedRoute } from '@backstage/plugin-permission-react';
+ import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
...
- <Route path="/catalog-import" element={<CatalogImportPage />} />
+ <PermissionedRoute
+ path="/catalog-import"
+ permission={catalogEntityCreatePermission}
+ element={<CatalogImportPage />}
+ />
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder': patch
---
The ScaffolderPage can be passed an optional `TaskPageComponent` with a `loadingText` string. It will replace the Loading text in the scaffolder task page.
-25
View File
@@ -1,25 +0,0 @@
---
'@backstage/create-app': patch
---
Added `tokenManager` as a required property for the auth-backend `createRouter` function. This dependency is used to issue server tokens that are used by the `CatalogIdentityClient` when looking up users and their group membership during authentication.
These changes are **required** to `packages/backend/src/plugins/auth.ts`:
```diff
export default async function createPlugin({
logger,
database,
config,
discovery,
+ tokenManager,
}: PluginEnvironment): Promise<Router> {
return await createRouter({
logger,
config,
database,
discovery,
+ tokenManager,
});
}
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-pagerduty': patch
---
Fix change events tab error when change events exist
-34
View File
@@ -1,34 +0,0 @@
---
'@backstage/plugin-catalog-import': minor
---
Make filename, branch name and examples URLs used in catalog import customizable.
Catalog backend ingestion loop can be already configured to fetch targets with custom catalog filename (other than `catalog-info.yaml`). It's now possible to customize said filename and branch name used in pull requests created by catalog import flow too. This allows organizations to further customize Backstage experience and to better reflect their branding.
Filename (default: `catalog-info.yaml`) and branch name (default: `backstage-integration`) used in pull requests can be configured in `app-config.yaml` as follows:
```yaml
// app-config.yaml
catalog:
import:
entityFilename: anvil.yaml
pullRequestBranchName: anvil-integration
```
Following React components have also been updated to accept optional props for providing example entity and repository paths:
```tsx
<StepInitAnalyzeUrl
...
exampleLocationUrl="https://github.com/acme-corp/our-awesome-api/blob/main/anvil.yaml"
/>
```
```tsx
<ImportInfoCard
exampleLocationUrl="https://github.com/acme-corp/our-awesome-api/blob/main/anvil.yaml"
exampleRepositoryUrl="https://github.com/acme-corp/our-awesome-api"
/>
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-techdocs': patch
---
Fixed a bug where links to files within a TechDocs site that use the `download` attribute would result in a 404 in cases where the TechDocs backend and Backstage frontend application are on the same host.
@@ -1,5 +0,0 @@
---
'@backstage/plugin-techdocs': patch
---
Added support for documentation using the raw `<source>` tag to point to relative resources like audio or video files.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend': patch
---
Pass authorization token to location service inside location api routes
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/core-components': patch
'@backstage/plugin-scaffolder': patch
---
Make linkTarget configurable for MarkdownContent component
-13
View File
@@ -1,13 +0,0 @@
---
'@backstage/create-app': patch
---
Switched the `app` dependency in the backend to use a file target rather than version.
To apply this change to an existing app, make the following change to `packages/backend/package.json`:
```diff
"dependencies": {
- "app": "0.0.0",
+ "app": "file:../app",
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/cli': patch
---
Log warning if unable to parse yarn.lock
+1 -1
View File
@@ -34,9 +34,9 @@
/tech-insights-backend-module-jsonfc @backstage/reviewers @xantier @iain-b
/tech-insights-tech-insights-common @backstage/reviewers @xantier @iain-b
/tech-insights-tech-insights-node @backstage/reviewers @xantier @iain-b
/packages/embedded-techdocs-app @backstage/techdocs-core
/packages/search-common @backstage/techdocs-core
/packages/techdocs-cli @backstage/techdocs-core
/packages/techdocs-cli-embedded-app @backstage/techdocs-core
/packages/techdocs-common @backstage/techdocs-core
/.changeset/cost-insights-* @backstage/reviewers @backstage/silver-lining
/.changeset/search-* @backstage/techdocs-core
+3 -1
View File
@@ -28,6 +28,7 @@ Blackbox
bool
boolean
builtins
callout
Chai
changeset
changesets
@@ -315,6 +316,7 @@ unbreak
Unconference
unmanaged
unregister
unregistering
unregistration
untracked
upsert
@@ -338,4 +340,4 @@ Zalando
Zhou
zoomable
zsh
Alef
Alef
+91 -88
View File
@@ -1,88 +1,91 @@
| Organization | Contact | Description of Use |
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Spotify](https://www.spotify.com) | [@leemills83](https://github.com/leemills83) | Main interface towards all of Spotify's infrastructure and technical documentation. |
| [bol.com](https://www.bol.com) | [@sagacity](https://github.com/sagacity) | Initial work being done to unify platform tooling. |
| [DFDS](https://www.dfds.com) | [@carlsendk](https://github.com/carlsendk) | V2 self-service platform. |
| [Roadie](https://roadie.io) | [@dtuite](https://github.com/dtuite) | Hosted, managed Backstage with easy set-up |
| [Roku](https://www.roku.com) | [@timurista](https://github.com/timurista) | Initial work on Cloud engineering service platform. |
| [SDA SE](https://sda.se) | [@dschwank](https://github.com/dschwank), [@iammnils](https://github.com/iammnils) | Central place for developing and sharing services in our insurance ecosystem. |
| [H-E-B](https://www.heb.com) | [@german-j-rodriguez](https://github.com/german-j-rodriguez) | Initial work on Engineering Portal service platform. |
| [American Airlines](https://www.aa.com) | [@paulpach](https://github.com/paulpach) | Central place for developers to develop and maintain applications |
| [Kiwi.com](https://kiwi.com) | [@aexvir](https://github.com/aexvir) | Replacing the frontend of [The Zoo](https://github.com/kiwicom/the-zoo), their service registry. |
| [Voi](https://www.voiscooters.com/) | [@K-Phoen](https://github.com/K-Phoen) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
| [Talkdesk](https://www.talkdesk.com) | [@jaime-talkdesk](https://github.com/jaime-talkdesk) | Initial work for Engineering Portal and Self Provisioning to R&D |
| [Wealthsimple](https://www.wealthsimple.com) | [@andrewthauer](https://github.com/andrewthauer) | Developer portal, service catalog, documentation and tooling |
| [Grab](https://www.grab.com) | [@althafh](https://github.com/althafh) | Initial work as a unified interface for all of Grab's internal tooling |
| [Telenor Sweden](https://www.telenor.se) | [@O5ten](https://github.com/O5ten) | Building a developer portal for scaffolding projects towards our unified build environment and microservice stacks |
| [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 |
| [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. |
| [Trendyol](https://trendyol.com) | [Gamze Senturk](https://github.com/gmzsenturk), [Mert Can Bilgic](https://github.com/mertcb) | The Developer Portal has been called `Pandora`. Provides an overview of Trendyol tech ecosystem. TechDocs, Catalog, Custom Plugins and Theme. |
| [Peloton](https://www.onepeloton.com/) | [Jim Haughwout](https://github.com/JimHaughwout) | Creating our first developer portal and tech-docs. Exploring Service Catalog, Tech Insights and Cost Insights as well. |
| [TELUS](https://telus.com) | [Seb Barre](https://github.com/sbarre) | The Go-to place to find answers about development and delivery at TELUS. |
| [Brex](https://www.brex.com/) | [Vamsi Chitters](https://github.com/vamsikc) | A centralized UI to understand how a service fits in the whole Brex architecture and manage a teams engineering dependencies. |
| [Oriflame](https://www.oriflame.com/) | [Oriflame](https://github.com/oriflame) | Internal developer portal for services, single page apps and packages overview, API documentation, technical guides, tech-radar and more. |
| [Booz Allen Hamilton](https://www.boozallen.com/) | [Jason Miller](https://github.com/JasonMiller-BAH) | Developer portal for a full-stack software development ecosystem that accelerates consistent and repeatable Modern Software Development practices for internal innovation and investments. |
| [Netflix](https://www.netflix.com/) | [bleathem](https://github.com/bleathem) | Our Backstage implementation will be the front door to a unified experience connecting our internal platform products across important workflows with integrated knowledge and support. |
| [b.well](https://www.icanbwell.com/) | [Jacob Rosales](https://github.com/jrosales) | Foundation for our engineering portal and cloud insights. |
| [PagerDuty](https://www.pagerduty.com/) | [Mark Shaw](https://github.com/markshawtoronto) | Developer portal, initially focused on software templates and tech-docs. |
| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑‍🚀 |
| [FundApps](https://www.fundapps.co/) | [Elliot Greenwood](https://github.com/egnwd) | Developer Portal - A place for us to keep track of our projects and documentation for all services and processes |
| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). |
| [HelloFresh](https://www.hellofresh.de/) | [@iammuho](https://github.com/iammuho), [@ElenaForester](https://github.com/ElenaForester), [@diegomarangoni](https://github.com/diegomarangoni) | Our developer portal at HelloFresh - Spread across an organisation of 500+ engineers globally. |
| [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. |
| [RedVentures](https://www.redventures.com/) | [Chris Diaz](https://github.com/codingdiaz) | Developer portal that brings everything an engineer needs to provide value into a single pane of glass. |
| [MavTek](https://www.mavtek.com/) | [@fgascon](https://github.com/fgascon) | Developer portal focused on standardizing practices, centralizing documentation and streamlining developer practices. |
| [QuintoAndar](https://www.quintoandar.com.br/) | [@quintoandar](https://github.com/quintoandar) | Developer portal, services catalog and centralization of service metrics. |
| [empathy.co](https://empathy.co/) | [@guillermotti](https://github.com/guillermotti) | Developer portal for tech docs, service catalog, plugin discovery and much more. |
| [creditas.com](https://creditas.com/) | [@aureliosaraiva](https://github.com/aureliosaraiva) [@Creditas](https://github.com/creditas) | Centralization of all services, standards, documentation, etc. We started the deployment process. |
| [Prisjakt](https://www.prisjakt.nu) / [PriceSpy](https://pricespy.co.uk) | [@kennylindahl](https://github.com/kennylindahl) | Internal developer portal - Documentation, scaffolding, software catalog, TechRadar, Gitlab org data integration |
| [Powerspike](https://powerspike.tv/) | [@trelore](https://github.com/trelore) | Developer portal for documentation of core libraries and repositories. |
| [2U](https://2u.com) | [Andrew Thal](https://github.com/athal7) | Development team home-base, promoting service discoverability, resource dependencies, and tech radar |
| [Taxfix](https://taxfix.de/) | [Sami Ur Rehman](https://github.com/samiurrehman92) | Developer's portal with software catalog at it's core. Hosts API Specs, Tech Docs, Tech Radar and some custom plugins. |
| [Busuu](https://busuu.com/) | [Adam Tester](https://github.com/adamtester) | Developer portal with service catalog, API docs, Event docs, service templating, and cost insights. |
| [Loadsmart](https://loadsmart.com/) | [Loadsmart](https://github.com/loadsmart) | Improve services visibility and operations for service owners and developers. |
| [Monzo](https://monzo.com/) | [@WillSewell](https://github.com/WillSewell), [@joechrisellis](https://github.com/joechrisellis) | Developer portal showing metadata and docs for over 2000 microservices. We have built a number of plugins such as a UI for our system to measure [software excellence](https://monzo.com/blog/2021/09/15/how-we-measure-software-excellence), and a UI to show deployment and config change events. |
| [Vaimo](https://www.vaimo.com) | [@vaimo-magnus](https://github.com/vaimo-magnus) | Developer Portal for our developers at Vaimo, currently docs and self-service towards our internal PaaS based on k8s. Plans to extend the catalog into Projects, Environments etc |
| [Wayfair](https://www.wayfair.com) | [@fransan](https://github.com/fransan), [@errskipower](https://github.com/errskipower), [@hrrs](https://github.com/hrrs) | Developer portal for service catalog, technical documentation, and APIs. |
| [CircleHD](https://www.circlehd.com) | [@circlehddev](https://github.com/circlehddev) | Developer Portal for internal dev team across the globe |
| [CastDesk](https://castdesk.com) | [@circlehddev](https://github.com/circlehddev) | Developer Portal for internal dev team across the globe |
| [Santagostino](https://santagostino.it) | [@santagostino](https://github.com/santagostino) | Developer portal, gateway to our infrastructure, documentation, service catalog and internal tooling. |
| [Peak](https://peak.ai) | [Luke Beamish](https://github.com/lukebeamish-peak) | Developer portal for all internal engineers to access documentation and tooling. |
| [Gelato](https://gelato.com/) | [Dmitry Makarenko](https://github.com/dmitry-makarenko-gelato) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal and third-party systems🚀. |
| [GoCardless](https://gocardless.com/) | [James Turley](https://github.com/tragiclifestories) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal systems. |
| [Box](https://www.box.com) | [@kielosz](https://github.com/kielosz), [@jluk-box](https://github.com/jluk-box), [@ptychu](https://github.com/ptychu), [@alexrybch](https://github.com/alexrybch), [@szubster](https://github.com/szubster) | Developer portal for service catalog, integration with internal systems, new service onboarding. |
| [Bazaarvoice](https://www.bazaarvoice.com) | [@niallmccullagh](https://github.com/niallmccullagh) | Developer portal for service catalog and scaffolds, publishing Github docs and API documentation, visualising our internal tech radar and our product engineering org structure. |
| [Krateo PlatformOps](https://www.krateo.io) | [@projectkerberus](https://github.com/projectkerberus) | A multi-cloud control plane to create, manage and deploy any kind of resource easily and centrally via a Developer Portal that centralizes via a self-service catalog the templating and ownership of services, the available documentation, the overview of the components that compose an entire domain and all the data of the service lifecycle. |
| [Adevinta](https://www.adevinta.com) | [Ray Sinnema](https://github.com/RemonSinnema) | Showcase shared services to our internal customers. |
| [Splunk](https://www.splunk.com) | [@tonytamsf](https://github.com/tonytamsf) | Developer portal as a centralized place to find people, services, documentation, escalation policies and give bravos. This portal is also being used as a centralized search engine for engineering specific documentation. |
| [SoundCloud](https://www.soundcloud.com) | [Julio Zynger](https://github.com/julioz) | Developer portal as a [humane registry](https://martinfowler.com/bliki/HumaneRegistry.html) for the organization: catalog of people, services, documentation, feature toggles, escalation policies, etc. |
| [Volvofinans Bank](https://www.volvofinans.se) | [Johan Hammar](https://github.com/johanhammar) | Developer portal enabling engineers to manage and explore software and documentation. |
| [Palo Alto Networks](https://www.paloaltonetworks.com) | [Jeremy Guarini](https://github.com/jeremyguarini), [Brian Lomeland](https://github.com/bbbmmmlll), [Palo Alto Networks](https://github.com/PaloAltoNetworks) | Developer portal, service catalog, documentation and tooling |
| [Signal Iduna Group](https://www.signal-iduna.de/) | [Jonas Thomsen](https://github.com/JoThomsen) | Developer Portal, documentation, monitoring, service catalog for our insurance ecosystem |
| [Tradeshift](https://www.tradeshift.com/) | [Soren Mathiasen](https://github.com/sorenmat) | Developer Portal: documentation, monitoring, service templates, service catalog for our micro services |
| [Unity](https://unity.com) | [Ted Cordery](https://github.com/TeddyBallGame) | A centralized service catalog with documentation for our service engineers. |
| [PicPay](https://www.picpay.com) | [Luis Baroni](https://github.com/lcsbaroni), [Renata Poluceno](https://github.com/renatapoluceno), [PicPay](https://github.com/picpay) | Developer portal for building services throught templates, service catalog with ownership of services, documentation and metrics providing autonomy and visibility for all. |
| [Epic Games](https://www.epicgames.com) | [Brian Jung](https://github.com/brian-at-epic), [Jeff Goldian](https://github.com/jeffgoldian-Epic) | Developer Portal: Service Catalog, Documentation, Software Templates and more making our internal teams' lives easier! |
| [Globo](https://globo.com) | [Carlos Gusmão](https://github.com/caeugusmao), [Guilherme Vierno](https://github.com/vierno), [Denis Aoki](https://github.com/dnsaoki2), [Maycon Dionisio](https://github.com/MayconDionisio), | Reduce the friction of accessing the information engineers need about Globo's digital services through a coherent and centralized experience. |
| [QBE](https://www.qbe.com/) | [Daniel Steel](https://github.com/danielsteelqbe), [Pete Jespers](https://github.com/petejespersqbe) | Developer portal allowing our global teams to explore and create applications, documentation and cloud infrastructure easily and quickly 🚀 |
| [LogMeIn](https://www.logmein.com) | [Lorenzo Orsatti](https://github.com/lorsatti) | Improve onboarding experience of new developers. Discover faster and painlessly developer documentation, API definitions and team information. Provide useful dev metrics in a central place. Provide easy-to-use templates for new services. |
| [Telstra](https://www.telstra.com.au) | [@kiranpatel11](https://github.com/kiranpatel11), [JasonC](https://github.com/JasonC17) | Primary usage: software catalog and templates<br/> Emerging usage : TechDocs, Explore Ecosystem, TechRadar, etc |
| [Mosaico](https://www.mosaico.com.br/) | [Wédney Yuri](https://github.com/wedneyyuri),[@tino.milton](https://github.com/miltonjacomini) | A centralized service catalog of our documentation for our service engineers. |
| [Mox Bank](https://www.mox.com/) | [Nick Laqua](https://github.com/nick-laqua-dragon), [Gauthier Roebroeck](https://github.com/gauthier-roebroeck-mox) | "Single pane of glass" developer portal for providing a best-in-class developer experience to our product teams and making Mox the best tech environment in Hongkong 🥰🚀 |
| [Keyloop](https://www.keyloop.com/) | [Andre Wanlin](https://github.com/awanlin) | Future-motive Developer Portal to help our teams create technology to make everything about buying and owning a car better. 🚗 |
| [Simply Business](https://sbtech.simplybusiness.co.uk/) | [@addersuk](https://github.com/addersuk), [@LightningStairs](https://github.com/LightningStairs), [@punitcse](https://github.com/punitcse), [@moltenice](https://github.com/moltenice) | Central developer portal to access everything a developer needs such as docs, internal service catalog, and the ability to quickly create a new service from a template. Internally developed Backstage plugins allow us to customise the experience to how we work. |
| [Overwolf](https://www.overwolf.com) | [@tomwolfgang](https://github.com/tomwolfgang) | Dev portal - software catalog, tech-docs, scaffolding |
| [Hotmart](https://www.hotmart.com) | [@fabioviana-hotmart](https://github.com/fabioviana-hotmart) | The main Developers Portal to centralize docs, applications and technical metrics. |
| [EF Education First](https://www.ef.com) | [Daan Boerlage](https://github.com/runebaas), [Rafał Nowosielski](https://github.com/rnowosielski) | Our developer portal - primarily used for cataloging and scaffolding with the ambition to expand with more feature adoptions over time |
| [Power Home Remodeling](https://www.techatpower.com) | [Ben Langfeld](https://github.com/benlangfeld) | Developer portal to our internal services, build on open-source software (including Kubernetes) in our own datacenters. Our Portal allows our team members to navigate inherant complexity and standardise. |
| [Livspace](https://www.livspace.com) | [Praveen Kumar](https://github.com/praveen-livspace) | Developer portal, service catalog, tech docs, API docs and plugins |
| [Just Eat Takeaway](https://www.justeattakeaway.com) | [Kim Wilson](https://github.com/kwilson541) | Our developer portal which centralises applications, reduces cognitive load and provides teams insights. |
| [Hopin](https://hopin.com) | [Vladimir Glafirov](https://github.com/vglafirov), [Chloe Lee](https://github.com/msfuko) | Developer portal to streamline the development practices. Integrated with service catalog, software templates, application monitoring, tech docs and plugins. |
| [HBO Max](https://hbomax.com) | [@mdb](https://github.com/mdb), [@nesta219](https://github.com/nesta219), [@nmische](https://github.com/nmische), [@hbomark](https://github.com/hbomark) | Developer portal hosting service catalog and API documentation, as well as cloud infrastructure details, operational visibility tools, and a custom plugin for browsing notable platform change events, such as deployments and configuration updates. |
| [RCHLO](https://www.riachuelo.com.br) & [MIDWAY](https://www.midway.com.br) | [@marcosborges](https://github.com/marcosborges), [@defaultbr](https://github.com/defaultbr) | Self-Service Platform |
| Organization | Contact | Description of Use |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Spotify](https://www.spotify.com) | [@leemills83](https://github.com/leemills83) | Main interface towards all of Spotify's infrastructure and technical documentation. |
| [bol.com](https://www.bol.com) | [@sagacity](https://github.com/sagacity) | Initial work being done to unify platform tooling. |
| [DFDS](https://www.dfds.com) | [@carlsendk](https://github.com/carlsendk) | V2 self-service platform. |
| [Roadie](https://roadie.io) | [@dtuite](https://github.com/dtuite) | Hosted, managed Backstage with easy set-up |
| [Roku](https://www.roku.com) | [@timurista](https://github.com/timurista) | Initial work on Cloud engineering service platform. |
| [SDA SE](https://sda.se) | [@dschwank](https://github.com/dschwank), [@iammnils](https://github.com/iammnils) | Central place for developing and sharing services in our insurance ecosystem. |
| [H-E-B](https://www.heb.com) | [@german-j-rodriguez](https://github.com/german-j-rodriguez) | Initial work on Engineering Portal service platform. |
| [American Airlines](https://www.aa.com) | [@paulpach](https://github.com/paulpach) | Central place for developers to develop and maintain applications |
| [Kiwi.com](https://kiwi.com) | [@aexvir](https://github.com/aexvir) | Replacing the frontend of [The Zoo](https://github.com/kiwicom/the-zoo), their service registry. |
| [Voi](https://www.voiscooters.com/) | [@K-Phoen](https://github.com/K-Phoen) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
| [Talkdesk](https://www.talkdesk.com) | [@jaime-talkdesk](https://github.com/jaime-talkdesk) | Initial work for Engineering Portal and Self Provisioning to R&D |
| [Wealthsimple](https://www.wealthsimple.com) | [@andrewthauer](https://github.com/andrewthauer) | Developer portal, service catalog, documentation and tooling |
| [Grab](https://www.grab.com) | [@althafh](https://github.com/althafh) | Initial work as a unified interface for all of Grab's internal tooling |
| [Telenor Sweden](https://www.telenor.se) | [@O5ten](https://github.com/O5ten) | Building a developer portal for scaffolding projects towards our unified build environment and microservice stacks |
| [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 |
| [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. |
| [Trendyol](https://trendyol.com) | [Gamze Senturk](https://github.com/gmzsenturk), [Mert Can Bilgic](https://github.com/mertcb) | The Developer Portal has been called `Pandora`. Provides an overview of Trendyol tech ecosystem. TechDocs, Catalog, Custom Plugins and Theme. |
| [Peloton](https://www.onepeloton.com/) | [Jim Haughwout](https://github.com/JimHaughwout) | Creating our first developer portal and tech-docs. Exploring Service Catalog, Tech Insights and Cost Insights as well. |
| [TELUS](https://telus.com) | [Seb Barre](https://github.com/sbarre) | The Go-to place to find answers about development and delivery at TELUS. |
| [Brex](https://www.brex.com/) | [Vamsi Chitters](https://github.com/vamsikc) | A centralized UI to understand how a service fits in the whole Brex architecture and manage a teams engineering dependencies. |
| [Oriflame](https://www.oriflame.com/) | [Oriflame](https://github.com/oriflame) | Internal developer portal for services, single page apps and packages overview, API documentation, technical guides, tech-radar and more. |
| [Booz Allen Hamilton](https://www.boozallen.com/) | [Jason Miller](https://github.com/JasonMiller-BAH) | Developer portal for a full-stack software development ecosystem that accelerates consistent and repeatable Modern Software Development practices for internal innovation and investments. |
| [Netflix](https://www.netflix.com/) | [bleathem](https://github.com/bleathem) | Our Backstage implementation will be the front door to a unified experience connecting our internal platform products across important workflows with integrated knowledge and support. |
| [b.well](https://www.icanbwell.com/) | [Jacob Rosales](https://github.com/jrosales) | Foundation for our engineering portal and cloud insights. |
| [PagerDuty](https://www.pagerduty.com/) | [Mark Shaw](https://github.com/markshawtoronto) | Developer portal, initially focused on software templates and tech-docs. |
| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑‍🚀 |
| [FundApps](https://www.fundapps.co/) | [Elliot Greenwood](https://github.com/egnwd) | Developer Portal - A place for us to keep track of our projects and documentation for all services and processes |
| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). |
| [HelloFresh](https://www.hellofresh.de/) | [@iammuho](https://github.com/iammuho), [@ElenaForester](https://github.com/ElenaForester), [@diegomarangoni](https://github.com/diegomarangoni) | Our developer portal at HelloFresh - Spread across an organisation of 500+ engineers globally. |
| [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. |
| [RedVentures](https://www.redventures.com/) | [Chris Diaz](https://github.com/codingdiaz) | Developer portal that brings everything an engineer needs to provide value into a single pane of glass. |
| [MavTek](https://www.mavtek.com/) | [@fgascon](https://github.com/fgascon) | Developer portal focused on standardizing practices, centralizing documentation and streamlining developer practices. |
| [QuintoAndar](https://www.quintoandar.com.br/) | [@quintoandar](https://github.com/quintoandar) | Developer portal, services catalog and centralization of service metrics. |
| [empathy.co](https://empathy.co/) | [@guillermotti](https://github.com/guillermotti) | Developer portal for tech docs, service catalog, plugin discovery and much more. |
| [creditas.com](https://creditas.com/) | [@aureliosaraiva](https://github.com/aureliosaraiva) [@Creditas](https://github.com/creditas) | Centralization of all services, standards, documentation, etc. We started the deployment process. |
| [Prisjakt](https://www.prisjakt.nu) / [PriceSpy](https://pricespy.co.uk) | [@kennylindahl](https://github.com/kennylindahl) | Internal developer portal - Documentation, scaffolding, software catalog, TechRadar, Gitlab org data integration |
| [Powerspike](https://powerspike.tv/) | [@trelore](https://github.com/trelore) | Developer portal for documentation of core libraries and repositories. |
| [2U](https://2u.com) | [Andrew Thal](https://github.com/athal7) | Development team home-base, promoting service discoverability, resource dependencies, and tech radar |
| [Taxfix](https://taxfix.de/) | [Sami Ur Rehman](https://github.com/samiurrehman92) | Developer's portal with software catalog at it's core. Hosts API Specs, Tech Docs, Tech Radar and some custom plugins. |
| [Busuu](https://busuu.com/) | [Adam Tester](https://github.com/adamtester) | Developer portal with service catalog, API docs, Event docs, service templating, and cost insights. |
| [Loadsmart](https://loadsmart.com/) | [Loadsmart](https://github.com/loadsmart) | Improve services visibility and operations for service owners and developers. |
| [Monzo](https://monzo.com/) | [@WillSewell](https://github.com/WillSewell), [@joechrisellis](https://github.com/joechrisellis) | Developer portal showing metadata and docs for over 2000 microservices. We have built a number of plugins such as a UI for our system to measure [software excellence](https://monzo.com/blog/2021/09/15/how-we-measure-software-excellence), and a UI to show deployment and config change events. |
| [Vaimo](https://www.vaimo.com) | [@vaimo-magnus](https://github.com/vaimo-magnus) | Developer Portal for our developers at Vaimo, currently docs and self-service towards our internal PaaS based on k8s. Plans to extend the catalog into Projects, Environments etc |
| [Wayfair](https://www.wayfair.com) | [@fransan](https://github.com/fransan), [@errskipower](https://github.com/errskipower), [@hrrs](https://github.com/hrrs) | Developer portal for service catalog, technical documentation, and APIs. |
| [CircleHD](https://www.circlehd.com) | [@circlehddev](https://github.com/circlehddev) | Developer Portal for internal dev team across the globe |
| [CastDesk](https://castdesk.com) | [@circlehddev](https://github.com/circlehddev) | Developer Portal for internal dev team across the globe |
| [Santagostino](https://santagostino.it) | [@santagostino](https://github.com/santagostino) | Developer portal, gateway to our infrastructure, documentation, service catalog and internal tooling. |
| [Peak](https://peak.ai) | [Luke Beamish](https://github.com/lukebeamish-peak) | Developer portal for all internal engineers to access documentation and tooling. |
| [Gelato](https://gelato.com/) | [Dmitry Makarenko](https://github.com/dmitry-makarenko-gelato) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal and third-party systems🚀. |
| [GoCardless](https://gocardless.com/) | [James Turley](https://github.com/tragiclifestories) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal systems. |
| [Box](https://www.box.com) | [@kielosz](https://github.com/kielosz), [@jluk-box](https://github.com/jluk-box), [@ptychu](https://github.com/ptychu), [@alexrybch](https://github.com/alexrybch), [@szubster](https://github.com/szubster) | Developer portal for service catalog, integration with internal systems, new service onboarding. |
| [Bazaarvoice](https://www.bazaarvoice.com) | [@niallmccullagh](https://github.com/niallmccullagh) | Developer portal for service catalog and scaffolds, publishing Github docs and API documentation, visualising our internal tech radar and our product engineering org structure. |
| [Krateo PlatformOps](https://www.krateo.io) | [@projectkerberus](https://github.com/projectkerberus) | A multi-cloud control plane to create, manage and deploy any kind of resource easily and centrally via a Developer Portal that centralizes via a self-service catalog the templating and ownership of services, the available documentation, the overview of the components that compose an entire domain and all the data of the service lifecycle. |
| [Adevinta](https://www.adevinta.com) | [Ray Sinnema](https://github.com/RemonSinnema) | Showcase shared services to our internal customers. |
| [Splunk](https://www.splunk.com) | [@tonytamsf](https://github.com/tonytamsf) | Developer portal as a centralized place to find people, services, documentation, escalation policies and give bravos. This portal is also being used as a centralized search engine for engineering specific documentation. |
| [SoundCloud](https://www.soundcloud.com) | [Julio Zynger](https://github.com/julioz) | Developer portal as a [humane registry](https://martinfowler.com/bliki/HumaneRegistry.html) for the organization: catalog of people, services, documentation, feature toggles, escalation policies, etc. |
| [Volvofinans Bank](https://www.volvofinans.se) | [Johan Hammar](https://github.com/johanhammar) | Developer portal enabling engineers to manage and explore software and documentation. |
| [Palo Alto Networks](https://www.paloaltonetworks.com) | [Jeremy Guarini](https://github.com/jeremyguarini), [Brian Lomeland](https://github.com/bbbmmmlll), [Palo Alto Networks](https://github.com/PaloAltoNetworks) | Developer portal, service catalog, documentation and tooling |
| [Signal Iduna Group](https://www.signal-iduna.de/) | [Jonas Thomsen](https://github.com/JoThomsen) | Developer Portal, documentation, monitoring, service catalog for our insurance ecosystem |
| [Tradeshift](https://www.tradeshift.com/) | [Soren Mathiasen](https://github.com/sorenmat) | Developer Portal: documentation, monitoring, service templates, service catalog for our micro services |
| [Unity](https://unity.com) | [Ted Cordery](https://github.com/TeddyBallGame) | A centralized service catalog with documentation for our service engineers. |
| [PicPay](https://www.picpay.com) | [Luis Baroni](https://github.com/lcsbaroni), [Renata Poluceno](https://github.com/renatapoluceno), [PicPay](https://github.com/picpay) | Developer portal for building services throught templates, service catalog with ownership of services, documentation and metrics providing autonomy and visibility for all. |
| [Epic Games](https://www.epicgames.com) | [Brian Jung](https://github.com/brian-at-epic), [Jeff Goldian](https://github.com/jeffgoldian-Epic) | Developer Portal: Service Catalog, Documentation, Software Templates and more making our internal teams' lives easier! |
| [Globo](https://globo.com) | [Carlos Gusmão](https://github.com/caeugusmao), [Guilherme Vierno](https://github.com/vierno), [Denis Aoki](https://github.com/dnsaoki2), [Maycon Dionisio](https://github.com/MayconDionisio), | Reduce the friction of accessing the information engineers need about Globo's digital services through a coherent and centralized experience. |
| [QBE](https://www.qbe.com/) | [Daniel Steel](https://github.com/danielsteelqbe), [Pete Jespers](https://github.com/petejespersqbe) | Developer portal allowing our global teams to explore and create applications, documentation and cloud infrastructure easily and quickly 🚀 |
| [LogMeIn](https://www.logmein.com) | [Lorenzo Orsatti](https://github.com/lorsatti) | Improve onboarding experience of new developers. Discover faster and painlessly developer documentation, API definitions and team information. Provide useful dev metrics in a central place. Provide easy-to-use templates for new services. |
| [Telstra](https://www.telstra.com.au) | [@kiranpatel11](https://github.com/kiranpatel11), [JasonC](https://github.com/JasonC17) | Primary usage: software catalog and templates<br/> Emerging usage : TechDocs, Explore Ecosystem, TechRadar, etc |
| [Mosaico](https://www.mosaico.com.br/) | [Wédney Yuri](https://github.com/wedneyyuri),[@tino.milton](https://github.com/miltonjacomini) | A centralized service catalog of our documentation for our service engineers. |
| [Mox Bank](https://www.mox.com/) | [Nick Laqua](https://github.com/nick-laqua-dragon), [Gauthier Roebroeck](https://github.com/gauthier-roebroeck-mox) | "Single pane of glass" developer portal for providing a best-in-class developer experience to our product teams and making Mox the best tech environment in Hongkong 🥰🚀 |
| [Keyloop](https://www.keyloop.com/) | [Andre Wanlin](https://github.com/awanlin) | Future-motive Developer Portal to help our teams create technology to make everything about buying and owning a car better. 🚗 |
| [Simply Business](https://sbtech.simplybusiness.co.uk/) | [@addersuk](https://github.com/addersuk), [@LightningStairs](https://github.com/LightningStairs), [@punitcse](https://github.com/punitcse), [@moltenice](https://github.com/moltenice) | Central developer portal to access everything a developer needs such as docs, internal service catalog, and the ability to quickly create a new service from a template. Internally developed Backstage plugins allow us to customise the experience to how we work. |
| [Overwolf](https://www.overwolf.com) | [@tomwolfgang](https://github.com/tomwolfgang) | Dev portal - software catalog, tech-docs, scaffolding |
| [Hotmart](https://www.hotmart.com) | [@fabioviana-hotmart](https://github.com/fabioviana-hotmart) | The main Developers Portal to centralize docs, applications and technical metrics. |
| [EF Education First](https://www.ef.com) | [Daan Boerlage](https://github.com/runebaas), [Rafał Nowosielski](https://github.com/rnowosielski) | Our developer portal - primarily used for cataloging and scaffolding with the ambition to expand with more feature adoptions over time |
| [Power Home Remodeling](https://www.techatpower.com) | [Ben Langfeld](https://github.com/benlangfeld) | Developer portal to our internal services, build on open-source software (including Kubernetes) in our own datacenters. Our Portal allows our team members to navigate inherant complexity and standardise. |
| [Livspace](https://www.livspace.com) | [Praveen Kumar](https://github.com/praveen-livspace) | Developer portal, service catalog, tech docs, API docs and plugins |
| [Just Eat Takeaway](https://www.justeattakeaway.com) | [Kim Wilson](https://github.com/kwilson541) | Our developer portal which centralises applications, reduces cognitive load and provides teams insights. |
| [Hopin](https://hopin.com) | [Vladimir Glafirov](https://github.com/vglafirov), [Chloe Lee](https://github.com/msfuko) | Developer portal to streamline the development practices. Integrated with service catalog, software templates, application monitoring, tech docs and plugins. |
| [HBO Max](https://hbomax.com) | [@mdb](https://github.com/mdb), [@nesta219](https://github.com/nesta219), [@nmische](https://github.com/nmische), [@hbomark](https://github.com/hbomark) | Developer portal hosting service catalog and API documentation, as well as cloud infrastructure details, operational visibility tools, and a custom plugin for browsing notable platform change events, such as deployments and configuration updates. |
| [RCHLO](https://www.riachuelo.com.br) & [MIDWAY](https://www.midway.com.br) | [@marcosborges](https://github.com/marcosborges), [@defaultbr](https://github.com/defaultbr) | Self-Service Platform |
| [HP Inc](https://www.hp.com) | [Damon Kaswell](https://github.com/dekoding) | DevEx engagement hub (dev portal: docs, standards, Q&A) and extensive assets catalog (APIs, services, code, data, etc.) for the pan-HP internal developer community. |
| [VMware](https://www.vmware.com) | [@mpriamo](https://github.com/mpriamo), [@krisapplegate](https://github.com/krisapplegate) | Part of [Tanzu Application Platform](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/index.html) offering; internal developer portal |
| [Ualá](https://www.uala.com.ar/) | [Santiago Bernal](https://github.com/sabernal) | Initial work being done to centralize documentation for all our microservices and APIs, as well as scaffolding new services and tracking code quality |
+19
View File
@@ -36,6 +36,25 @@ To become a maintainer you need to demonstrate the following:
If a maintainer is no longer interested or cannot perform the maintainer duties listed above, they should volunteer to be moved to emeritus status. In extreme cases this can also occur by a vote of the sponsors and maintainers per the voting process below.
# End User Sponsors
## Role of a Backstage End User Sponsor
- Provide support for Backstage by removing blockers, securing funding, providing advocacy, feedback, and ensuring project continuity and long term success.
- Assist Backstage maintainers in prioritizing upcoming roadmap items and planned work.
- Provide neutral mediation for any disputes that arise as part of the project.
## Backstage End User Sponsor Membership
The End User Sponsors group comprises at most 5 people. To be eligible for membership in the group, you or the company where you work you must:
- Be responsible for and end user of a production Backstage deployment of non-trivial size
- Be active contributors to the open source project
- Be willing and able to attend regularly-scheduled End User Sponsor meetings
- Abide by [Backstages Code of Conduct](./CODE_OF_CONDUCT.md).
Candidates for membership will be nominated by current Sponsor members or by Backstage maintainers. If there are more nominations than Sponsor seats remaining, existing sponsors shall vote on the candidates, and the candidates with the most votes will become Sponsors. Any ties will be broken by current Backstage sponsors.
# Reviewers
The project also contains a team called [@backstage/reviewers](https://github.com/orgs/backstage/teams/reviewers). This is the team of people who are the fallback in [`CODEOWNERS`](./.github/CODEOWNERS). This team will typically contain the maintainers, and a small number of additional people who are permitted to approve and merge pull requests. The purpose of this group is to offload some of the review work from the maintainers, simplifying and speeding up the review process for contributors.
+33 -4
View File
@@ -18,11 +18,10 @@ First, install the
$ heroku login
```
Heroku runs a container registry on `registry.heroku.com`. To push Backstage
Docker images, log in to the container registry also:
If you have not yet created a project through the Heroku interface, you can create it through the CLI.
```shell
$ heroku container:login
$ heroku create <your-app>
```
You _might_ also need to set your Heroku app's stack to `container`:
@@ -31,13 +30,43 @@ You _might_ also need to set your Heroku app's stack to `container`:
$ heroku stack:set container -a <your-app>
```
Configuring your `app-config.yaml`:
```yaml
app:
# Should be the same as backend.baseUrl when using the `app-backend` plugin
baseUrl: https://<your-app>.herokuapp.com
backend:
baseUrl: https://<your-app>.herokuapp.com
listen:
port:
$env: PORT
# The $PORT environment variable is a feature of Heroku
# https://devcenter.heroku.com/articles/dynos#web-dynos
```
> Make sure your file is being copied into your container in the `Dockerfile`.
Before building the Docker image, run the [backstage host build commands](https://backstage.io/docs/deployment/docker#host-build). They must be run whenever you are going to publish a new image.
Heroku runs a container registry on `registry.heroku.com`. To push Backstage
Docker images, log in to the container registry also:
```shell
$ heroku container:login
```
## Push and deploy a Docker image
Now we can push a Backstage [Docker image](docker.md) to Heroku's container
registry and release it to the `web` worker:
```bash
$ heroku container:push web -a <your-app>
$ docker image build . -f packages/backend/Dockerfile --tag registry.heroku.com/<your-app>/web
$ docker push registry.heroku.com/<your-app>/web
$ heroku container:release web -a <your-app>
```
+1 -1
View File
@@ -21,7 +21,7 @@ section below is `/entities`, and the catalog is located at
`http://localhost:7007/api/catalog` during local development, the full URL would
be `http://localhost:7007/api/catalog/entities`. The actual URL may vary from
one organization to the other, especially in production, but is commonly your
`backend.baseUrl` in your app config, plus `/catalog` at the end.
`backend.baseUrl` in your app config, plus `/api/catalog` at the end.
Some or all of the endpoints may accept or require an `Authorization` header
with a `Bearer` token, which should then be the Backstage token returned by the
@@ -48,9 +48,9 @@ The details of these processes are described below.
## Ingestion
Each catalog deployment has a number of entity providers installed. They are
Each catalog deployment has a number of _entity providers_ installed. They are
responsible for fetching data from external authoritative sources in any way
that they see fit, to translate those into entity objects, and to notify the
that they see fit, translating those into entity objects, and notifying the
database when those entities are added or removed. These are the _unprocessed
entities_ that will be subject to later processing (see below), and they form
the very basis of existence for entities. If there were no entity providers, no
@@ -108,7 +108,7 @@ the processing loop should next try to process it. When the entity first
appears, this timestamp is set to "now" - asking for it to be picked up as soon
as possible.
Each catalog deployment has a number of processors installed. They are
Each catalog deployment has a number of _processors_ installed. They are
responsible for receiving unprocessed entities that the catalog decided are due
for processing, and then running that data through a number of processing
stages, mutating the entity and emitting auxiliary data about it. When all of
@@ -185,7 +185,28 @@ happen during ingestion or processing.
## Errors
> TODO: Describe how errors are exposed through entities
Errors during the ingestion and processing of entities can happen in a variety
of ways, and they may happen at a far later point in time than when they were
registered. For example, a registered file may get deleted in the remote system,
or the user may accidentally change the file contents in such a way that they
cannot be parsed successfully, etc.
There are two main ways that these errors are surfaced.
First, the catalog backend will produce detailed logs that should contain
sufficient information for a reader to find the causes for errors. Since these
logs are typically not easily found by end users, this can mainly be a useful
tool for Backstage operators who want to debug problems either with statically
registered entities that are under their control, or to help end users find
problems.
Second, for most classes of errors, the entity itself will contain a status
field that describes the problem. The contents of this field is shown at the top
of your entity page in Backstage, if you have placed the corresponding error
callout component (`EntityProcessingErrorsPanel`) there.
We are still working to improve the surfacing and observability around
processing loop errors.
## Orphaning
@@ -206,17 +227,22 @@ either, it becomes _orphaned_. The end result is as follows:
- The catalog page in Backstage for the child entity detects the new annotation
and informs users about the orphan status.
Orphaning can occur in several different scenarios. One common cause is that the
end user edited a corresponding catalog catalog-info YAML file removing the
entity's entry. In the case of a `Location` parent entity, orphaning can happen
if removing the target line pointing to the file containing the child entity.
Another common cause is large batch processors such as the ones that crawl
through remote systems looking for entities, no longer finding something that it
used to find before. Maybe the data was moved, or deleted, in the remote system.
So for example when a person leaves the company an LDAP org discovery processor
might leave an orphaned `User` entity behind. Note that this only applies to
processors - ingestion that happens using entity providers work differently,
described below.
Orphaning can occur in several different scenarios.
- If a catalog-info YAML file is moved from one place to another in the version
control system without updating the registration in the catalog, it will
effectively become orphaned "by" that registered location
- If the user edits a corresponding parent catalog-info YAML file removing the
entity's entry - for example in the case of a `Location` parent entity,
orphaning can happen if editing or removing the `target`/`targets` lines
pointing to the file containing the child entity.
- Another common cause is large batch processors such as the ones that crawl
through remote systems looking for entities, no longer finding something that
it used to find before. Maybe the data was moved, or deleted, in the remote
system. So for example when a person leaves the company an LDAP org discovery
processor might leave an orphaned `User` entity behind. Note that this only
applies to processors - ingestion that happens using entity providers work
differently, described below.
> Note that removing a file, or accidentally corrupting a file so that it cannot
> be read successfully, does _not_ lead to orphaning. Hard errors, including the
@@ -239,8 +265,78 @@ provided out of the box.
## Implicit Deletion
> TODO: Describe the process of entity providers eagerly deleting entities
Entity providers - not processors - are subject to _eager_ deletion of entities,
which may trigger the implicit deletion of more than just the entity you thought
you were deleting. This concept is explained here.
Recall that all entity providers manage a private "bucket" of entities, as
described in the [External integrations](external-integrations.md) article. They
can perform some operations on those entities, including additions, updates, and
deletions. Entity additions/updates are subject to the regular processing loops,
which means that bucket entities may end up forming roots of an entire graph of
entities that are emitted by those processors as they recursively work they way
through the bucket contents and its descendants.
When a provider issues a deletion of an entity in its bucket, that entity as
well as _the entire tree of entities processed out of it_, if any, are
considered for immediate deletion. Note "considered" - they are deleted if and
only if they would otherwise have become orphaned (no other parent entities
emitting them). Since the graph of entities is not strictly a tree, multiple
roots may actually end up indirectly referencing a node farther down in the
graph. If that's the case, that node won't go away until all such roots go away.
URLs to yaml files that you register using either the Create button or add to
your app-config, are both handled by entity providers. That means that this
implicit deletion mechanism comes into play in some everyday circumstances.
Let's illustrate.
Imagine that you have a monorepo, with a single `Location` entity in a
catalog-info file at the root, and that entity points to three other
catalog-info files in the repo with a `Component` entity in each one.
```text
/
feature_one/
catalog-info.yaml <- kind: Component
feature_two/
catalog-info.yaml <- kind: Component
feature_three/
catalog-info.yaml <- kind: Component
catalog-info.yaml <- kind: Location
```
If you register the root `Location` entity, the actual effect is that _five_
entities appear in the catalog. First, one that is named `generated-`-something,
which corresponds to the registered URL itself. That's the one that the provider
has put in its "bucket". Then, as processing loops chug along, the `Location`
entity you pointed to appears as a child of that, and then the three `Component`
entities appear in turn as children of the `Location`.
As an end user of the Backstage interface, you may now want to delete one of the
three `Component` entities. You do that by visiting the three-dots menu in the
top right of an entity view. The popup dialog that appears will inform you that
actually this entity belongs to a certain root, and that you may want to remove
that root instead (which corresponds to unregistering the originally registered
URL). If you choose to do so, _all_ of the aforementioned five entities will
actually be deleted in the same operation.
If you did not want to perform this aggressive pruning, you might have instead
chosen to remove one of the `target` rows of your `Location` catalog-info file,
and then deleted the catalog-info file that contained the `Component` you wanted
to get rid of. Now the catalog would be left with an orphaned component, and you
would instead be able to use the explicit deletion (see below) to delete that
single component.
## Explicit Deletion
> TODO: Describe direct deletion via the catalog API
The catalog and its REST API also permits direct deletion of individual
entities. This makes sense to do on orphaned entities; entities that aren't
being actively kept up to date by any parent entities. The popup interface under
the three-dots menu option of entity views does offer this option, and the
orphaned status can be seen in an info box at the top of the entity's overview
page.
However, if you were to try to do an explicit depletion on an entity that's
being kept actively updated by a parent entity, it would just reappear again
shortly thereafter when the processing loops reconsider the parent entity that's
still in there.
@@ -287,6 +287,79 @@ The `RepoUrlPicker` is a custom field that we provide part of the
`plugin-scaffolder`. You can provide your own custom fields by
[writing your own Custom Field Extensions](./writing-custom-field-extensions.md)
##### Using the Users `oauth` token
There's a little bit of extra magic that you get out of the box when using the
`RepoUrlPicker` as a field input. You can provide some additional options under
`ui:options` to allow the `RepoUrlPicker` to grab an `oauth` token for the user
for the required `repository`.
This is great for when you are wanting to create a new repository, or wanting to
perform operations on top of an existing repository.
A sample template that takes advantage of this is like so:
```yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: v1beta3-demo
title: Test Action template
description: scaffolder v1beta3 template demo
spec:
owner: backstage/techdocs-core
type: service
parameters:
...
- title: Choose a location
required:
- repoUrl
properties:
repoUrl:
title: Repository Location
type: string
ui:field: RepoUrlPicker
ui:options:
# Here's the option you can pass to the RepoUrlPicker
requestUserCredentials:
secretsKey: USER_OAUTH_TOKEN
additionalScopes:
github:
- workflow:write
allowedHosts:
- github.com
...
steps:
...
- id: publish
name: Publish
action: publish:github
input:
allowedHosts: ['github.com']
description: This is ${{ parameters.name }}
repoUrl: ${{ parameters.repoUrl }}
# here's where the secret can be used
token: ${{ secrets.USER_OAUTH_TOKEN }}
...
```
You will see from above that there is an additional `requestUserCredentials`
object that is passed to the `RepoUrlPicker`. This object defines what the
returned `secret` should be stored as when accessing using
`${{ secrets.secretName }}`, in this case it is `USER_OAUTH_TOKEN`. And then you
will see that there is an additional `input` field into the `publish:github`
action called `token`, in which you can use the `secret` like so:
`token: ${{ secrets.USER_OAUTH_TOKEN }}`.
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.
#### The Owner Picker
When the scaffolder needs to add new components to the catalog, it needs to have
@@ -41,7 +41,10 @@ For this reason, any changes made to the template are documented along with
upgrade instructions in the
[changelog](https://github.com/backstage/backstage/blob/master/packages/create-app/CHANGELOG.md)
of the `@backstage/create-app` package. We recommend peeking at this changelog
for any applicable updates when upgrading packages.
-for any applicable updates when upgrading packages. As an alternative, the
[Backstage Upgrade Helper](https://backstage.github.io/upgrade-helper/) provides
a consolidated view of all the changes between two versions of Backstage. You
can find the current version of your Backstage installation in `backstage.json`.
## More information on dependency mismatches
+1 -1
View File
@@ -49,7 +49,7 @@
"**/@roadiehq/**/@backstage/plugin-catalog": "*",
"**/@roadiehq/**/@backstage/catalog-model": "*"
},
"version": "0.66.0-next.0",
"version": "0.66.0",
"dependencies": {
"@manypkg/get-packages": "^1.1.3",
"@microsoft/api-documenter": "^7.15.0",
+16
View File
@@ -1,5 +1,21 @@
# @backstage/app-defaults
## 0.1.6
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7
- @backstage/core-app-api@0.5.2
## 0.1.6-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7-next.1
- @backstage/core-app-api@0.5.2-next.0
## 0.1.6-next.0
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
"version": "0.1.6-next.0",
"version": "0.1.6",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,8 +29,8 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/core-components": "^0.8.7-next.0",
"@backstage/core-app-api": "^0.5.1",
"@backstage/core-components": "^0.8.7",
"@backstage/core-app-api": "^0.5.2",
"@backstage/core-plugin-api": "^0.6.0",
"@backstage/plugin-permission-react": "^0.3.0",
"@backstage/theme": "^0.2.14",
@@ -42,8 +42,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/cli": "^0.13.1",
"@backstage/test-utils": "^0.2.4",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@types/jest": "^26.0.7",
+65
View File
@@ -1,5 +1,70 @@
# example-app
## 0.2.63
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7
- @backstage/plugin-catalog-react@0.6.13
- @backstage/plugin-code-coverage@0.1.24
- @backstage/plugin-catalog-common@0.1.2
- @backstage/cli@0.13.1
- @backstage/plugin-scaffolder@0.12.1
- @backstage/integration-react@0.1.20
- @backstage/plugin-org@0.4.1
- @backstage/plugin-pagerduty@0.3.24
- @backstage/plugin-catalog-import@0.8.0
- @backstage/core-app-api@0.5.2
- @backstage/plugin-techdocs@0.13.2
- @backstage/app-defaults@0.1.6
- @backstage/plugin-airbrake@0.1.2
- @backstage/plugin-apache-airflow@0.1.5
- @backstage/plugin-api-docs@0.7.1
- @backstage/plugin-azure-devops@0.1.13
- @backstage/plugin-badges@0.2.21
- @backstage/plugin-catalog@0.7.11
- @backstage/plugin-catalog-graph@0.2.9
- @backstage/plugin-circleci@0.2.36
- @backstage/plugin-cloudbuild@0.2.34
- @backstage/plugin-cost-insights@0.11.19
- @backstage/plugin-explore@0.3.28
- @backstage/plugin-gcp-projects@0.3.16
- @backstage/plugin-github-actions@0.4.34
- @backstage/plugin-gocd@0.1.3
- @backstage/plugin-graphiql@0.2.29
- @backstage/plugin-home@0.4.13
- @backstage/plugin-jenkins@0.5.19
- @backstage/plugin-kafka@0.2.27
- @backstage/plugin-kubernetes@0.5.6
- @backstage/plugin-lighthouse@0.2.36
- @backstage/plugin-newrelic@0.3.15
- @backstage/plugin-newrelic-dashboard@0.1.5
- @backstage/plugin-rollbar@0.3.25
- @backstage/plugin-search@0.6.1
- @backstage/plugin-sentry@0.3.35
- @backstage/plugin-shortcuts@0.1.21
- @backstage/plugin-tech-insights@0.1.7
- @backstage/plugin-tech-radar@0.5.4
- @backstage/plugin-todo@0.1.21
- @backstage/plugin-user-settings@0.3.18
## 0.2.63-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7-next.1
- @backstage/plugin-catalog-react@0.6.13-next.1
- @backstage/plugin-code-coverage@0.1.24-next.1
- @backstage/plugin-catalog-common@0.1.2-next.0
- @backstage/cli@0.13.1-next.1
- @backstage/plugin-scaffolder@0.12.1-next.1
- @backstage/core-app-api@0.5.2-next.0
- @backstage/plugin-techdocs@0.13.2-next.1
- @backstage/plugin-catalog@0.7.11-next.1
- @backstage/app-defaults@0.1.6-next.1
## 0.2.63-next.0
### Patch Changes
+45 -45
View File
@@ -1,56 +1,56 @@
{
"name": "example-app",
"version": "0.2.63-next.0",
"version": "0.2.63",
"private": true,
"bundled": true,
"dependencies": {
"@backstage/app-defaults": "^0.1.6-next.0",
"@backstage/app-defaults": "^0.1.6",
"@backstage/catalog-model": "^0.9.10",
"@backstage/cli": "^0.13.1-next.0",
"@backstage/core-app-api": "^0.5.1",
"@backstage/core-components": "^0.8.7-next.0",
"@backstage/cli": "^0.13.1",
"@backstage/core-app-api": "^0.5.2",
"@backstage/core-components": "^0.8.7",
"@backstage/core-plugin-api": "^0.6.0",
"@backstage/integration-react": "^0.1.20-next.0",
"@backstage/plugin-airbrake": "^0.1.2-next.0",
"@backstage/plugin-api-docs": "^0.7.1-next.0",
"@backstage/plugin-azure-devops": "^0.1.13-next.0",
"@backstage/plugin-apache-airflow": "^0.1.5-next.0",
"@backstage/plugin-badges": "^0.2.21-next.0",
"@backstage/plugin-catalog": "^0.7.11-next.0",
"@backstage/plugin-catalog-common": "^0.1.1",
"@backstage/plugin-catalog-graph": "^0.2.9-next.0",
"@backstage/plugin-catalog-import": "^0.8.0-next.0",
"@backstage/plugin-catalog-react": "^0.6.13-next.0",
"@backstage/plugin-circleci": "^0.2.36-next.0",
"@backstage/plugin-cloudbuild": "^0.2.34-next.0",
"@backstage/plugin-code-coverage": "^0.1.24-next.0",
"@backstage/plugin-cost-insights": "^0.11.19-next.0",
"@backstage/plugin-explore": "^0.3.28-next.0",
"@backstage/plugin-gcp-projects": "^0.3.16-next.0",
"@backstage/plugin-github-actions": "^0.4.34-next.0",
"@backstage/plugin-gocd": "^0.1.3-next.0",
"@backstage/plugin-graphiql": "^0.2.29-next.0",
"@backstage/plugin-home": "^0.4.13-next.0",
"@backstage/plugin-jenkins": "^0.5.19-next.0",
"@backstage/plugin-kafka": "^0.2.27-next.0",
"@backstage/plugin-kubernetes": "^0.5.6-next.0",
"@backstage/plugin-lighthouse": "^0.2.36-next.0",
"@backstage/plugin-newrelic": "^0.3.15-next.0",
"@backstage/plugin-newrelic-dashboard": "^0.1.5-next.0",
"@backstage/plugin-org": "^0.4.1-next.0",
"@backstage/plugin-pagerduty": "0.3.24-next.0",
"@backstage/integration-react": "^0.1.20",
"@backstage/plugin-airbrake": "^0.1.2",
"@backstage/plugin-api-docs": "^0.7.1",
"@backstage/plugin-azure-devops": "^0.1.13",
"@backstage/plugin-apache-airflow": "^0.1.5",
"@backstage/plugin-badges": "^0.2.21",
"@backstage/plugin-catalog": "^0.7.11",
"@backstage/plugin-catalog-common": "^0.1.2",
"@backstage/plugin-catalog-graph": "^0.2.9",
"@backstage/plugin-catalog-import": "^0.8.0",
"@backstage/plugin-catalog-react": "^0.6.13",
"@backstage/plugin-circleci": "^0.2.36",
"@backstage/plugin-cloudbuild": "^0.2.34",
"@backstage/plugin-code-coverage": "^0.1.24",
"@backstage/plugin-cost-insights": "^0.11.19",
"@backstage/plugin-explore": "^0.3.28",
"@backstage/plugin-gcp-projects": "^0.3.16",
"@backstage/plugin-github-actions": "^0.4.34",
"@backstage/plugin-gocd": "^0.1.3",
"@backstage/plugin-graphiql": "^0.2.29",
"@backstage/plugin-home": "^0.4.13",
"@backstage/plugin-jenkins": "^0.5.19",
"@backstage/plugin-kafka": "^0.2.27",
"@backstage/plugin-kubernetes": "^0.5.6",
"@backstage/plugin-lighthouse": "^0.2.36",
"@backstage/plugin-newrelic": "^0.3.15",
"@backstage/plugin-newrelic-dashboard": "^0.1.5",
"@backstage/plugin-org": "^0.4.1",
"@backstage/plugin-pagerduty": "0.3.24",
"@backstage/plugin-permission-react": "^0.3.0",
"@backstage/plugin-rollbar": "^0.3.25-next.0",
"@backstage/plugin-scaffolder": "^0.12.1-next.0",
"@backstage/plugin-search": "^0.6.1-next.0",
"@backstage/plugin-sentry": "^0.3.35-next.0",
"@backstage/plugin-shortcuts": "^0.1.21-next.0",
"@backstage/plugin-tech-radar": "^0.5.4-next.0",
"@backstage/plugin-techdocs": "^0.13.2-next.0",
"@backstage/plugin-todo": "^0.1.21-next.0",
"@backstage/plugin-user-settings": "^0.3.18-next.0",
"@backstage/plugin-rollbar": "^0.3.25",
"@backstage/plugin-scaffolder": "^0.12.1",
"@backstage/plugin-search": "^0.6.1",
"@backstage/plugin-sentry": "^0.3.35",
"@backstage/plugin-shortcuts": "^0.1.21",
"@backstage/plugin-tech-radar": "^0.5.4",
"@backstage/plugin-techdocs": "^0.13.2",
"@backstage/plugin-todo": "^0.1.21",
"@backstage/plugin-user-settings": "^0.3.18",
"@backstage/search-common": "^0.2.2",
"@backstage/plugin-tech-insights": "^0.1.7-next.0",
"@backstage/plugin-tech-insights": "^0.1.7",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -72,7 +72,7 @@
},
"devDependencies": {
"@backstage/plugin-permission-react": "^0.3.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/test-utils": "^0.2.4",
"@rjsf/core": "^3.2.1",
"@testing-library/cypress": "^8.0.2",
"@testing-library/jest-dom": "^5.10.1",
+24
View File
@@ -1,5 +1,29 @@
# @backstage/backend-common
## 0.10.6
### Patch Changes
- 50d039577a: Added a `Context` type for the backend, that can propagate an abort signal, a
deadline, and contextual values through the call stack. The main entrypoint is
the `Contexts` utility class that provides a root context creator and commonly
used decorators.
These are marked as `@alpha` for now, and are therefore only accessible via
`@backstage/backend-common/alpha`.
## 0.10.6-next.0
### Patch Changes
- 50d039577a: Added a `Context` type for the backend, that can propagate an abort signal, a
deadline, and contextual values through the call stack. The main entrypoint is
the `Contexts` utility class that provides a root context creator and commonly
used decorators.
These are marked as `@alpha` for now, and are therefore only accessible via
`@backstage/backend-common/alpha`.
## 0.10.5
### Patch Changes
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.10.5",
"version": "0.10.6",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -84,8 +84,8 @@
}
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/cli": "^0.13.1",
"@backstage/test-utils": "^0.2.4",
"@types/archiver": "^5.1.0",
"@types/compression": "^1.7.0",
"@types/concat-stream": "^1.6.0",
+14
View File
@@ -1,5 +1,19 @@
# @backstage/backend-tasks
## 0.1.5
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.10.6
## 0.1.5-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.10.6-next.0
## 0.1.4
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
"version": "0.1.4",
"version": "0.1.5",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -29,7 +29,7 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.10.5",
"@backstage/backend-common": "^0.10.6",
"@backstage/config": "^0.1.13",
"@backstage/errors": "^0.2.0",
"@backstage/types": "^0.1.1",
@@ -43,8 +43,8 @@
"zod": "^3.9.5"
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.16-next.0",
"@backstage/cli": "^0.13.1-next.0",
"@backstage/backend-test-utils": "^0.1.16",
"@backstage/cli": "^0.13.1",
"jest": "^26.0.1",
"wait-for-expect": "^3.0.2"
},
+16
View File
@@ -1,5 +1,21 @@
# @backstage/backend-test-utils
## 0.1.16
### Patch Changes
- Updated dependencies
- @backstage/cli@0.13.1
- @backstage/backend-common@0.10.6
## 0.1.16-next.1
### Patch Changes
- Updated dependencies
- @backstage/cli@0.13.1-next.1
- @backstage/backend-common@0.10.6-next.0
## 0.1.16-next.0
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
"version": "0.1.16-next.0",
"version": "0.1.16",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -30,8 +30,8 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.10.5",
"@backstage/cli": "^0.13.1-next.0",
"@backstage/backend-common": "^0.10.6",
"@backstage/cli": "^0.13.1",
"@backstage/config": "^0.1.13",
"knex": "^0.95.1",
"mysql2": "^2.2.5",
@@ -41,7 +41,7 @@
"uuid": "^8.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/cli": "^0.13.1",
"jest": "^26.0.1"
},
"files": [
+64
View File
@@ -1,5 +1,69 @@
# example-backend
## 0.2.63
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-backend@0.9.0
- @backstage/plugin-rollbar-backend@0.1.20
- @backstage/plugin-catalog-backend@0.21.2
- @backstage/plugin-scaffolder-backend@0.15.23
- @backstage/plugin-proxy-backend@0.2.17
- @backstage/backend-common@0.10.6
- example-app@0.2.63
- @backstage/backend-tasks@0.1.5
- @backstage/plugin-app-backend@0.3.23
- @backstage/plugin-azure-devops-backend@0.3.2
- @backstage/plugin-badges-backend@0.1.17
- @backstage/plugin-code-coverage-backend@0.1.21
- @backstage/plugin-graphql-backend@0.1.13
- @backstage/plugin-jenkins-backend@0.1.12
- @backstage/plugin-kafka-backend@0.2.16
- @backstage/plugin-kubernetes-backend@0.4.6
- @backstage/plugin-permission-backend@0.4.2
- @backstage/plugin-permission-node@0.4.2
- @backstage/plugin-scaffolder-backend-module-rails@0.2.5
- @backstage/plugin-search-backend@0.4.1
- @backstage/plugin-search-backend-module-pg@0.2.5
- @backstage/plugin-tech-insights-backend@0.2.3
- @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.7
- @backstage/plugin-tech-insights-node@0.2.1
- @backstage/plugin-techdocs-backend@0.13.2
- @backstage/plugin-todo-backend@0.1.20
## 0.2.63-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-backend@0.9.0-next.1
- @backstage/backend-common@0.10.6-next.0
- example-app@0.2.63-next.1
- @backstage/plugin-catalog-backend@0.21.2-next.1
- @backstage/plugin-techdocs-backend@0.13.2-next.0
- @backstage/backend-tasks@0.1.5-next.0
- @backstage/plugin-app-backend@0.3.23-next.0
- @backstage/plugin-azure-devops-backend@0.3.2-next.0
- @backstage/plugin-badges-backend@0.1.17-next.0
- @backstage/plugin-code-coverage-backend@0.1.21-next.0
- @backstage/plugin-graphql-backend@0.1.13-next.0
- @backstage/plugin-jenkins-backend@0.1.12-next.0
- @backstage/plugin-kafka-backend@0.2.16-next.0
- @backstage/plugin-kubernetes-backend@0.4.6-next.0
- @backstage/plugin-permission-backend@0.4.2-next.1
- @backstage/plugin-permission-node@0.4.2-next.1
- @backstage/plugin-proxy-backend@0.2.17-next.1
- @backstage/plugin-rollbar-backend@0.1.20-next.1
- @backstage/plugin-scaffolder-backend@0.15.23-next.1
- @backstage/plugin-scaffolder-backend-module-rails@0.2.5-next.1
- @backstage/plugin-search-backend@0.4.1-next.1
- @backstage/plugin-search-backend-module-pg@0.2.5-next.0
- @backstage/plugin-tech-insights-backend@0.2.3-next.0
- @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.7-next.0
- @backstage/plugin-tech-insights-node@0.2.1-next.0
- @backstage/plugin-todo-backend@0.1.20-next.0
## 0.2.63-next.0
### Patch Changes
+28 -28
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.2.63-next.0",
"version": "0.2.63",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,38 +24,38 @@
"migrate:create": "knex migrate:make -x ts"
},
"dependencies": {
"@backstage/backend-common": "^0.10.5",
"@backstage/backend-tasks": "^0.1.4",
"@backstage/backend-common": "^0.10.6",
"@backstage/backend-tasks": "^0.1.5",
"@backstage/catalog-client": "^0.5.5",
"@backstage/catalog-model": "^0.9.10",
"@backstage/config": "^0.1.13",
"@backstage/integration": "^0.7.2",
"@backstage/plugin-app-backend": "^0.3.22",
"@backstage/plugin-auth-backend": "^0.9.0-next.0",
"@backstage/plugin-azure-devops-backend": "^0.3.1",
"@backstage/plugin-badges-backend": "^0.1.16",
"@backstage/plugin-catalog-backend": "^0.21.2-next.0",
"@backstage/plugin-code-coverage-backend": "^0.1.20",
"@backstage/plugin-graphql-backend": "^0.1.12",
"@backstage/plugin-jenkins-backend": "^0.1.11",
"@backstage/plugin-kafka-backend": "^0.2.15",
"@backstage/plugin-kubernetes-backend": "^0.4.5",
"@backstage/plugin-permission-backend": "^0.4.2-next.0",
"@backstage/plugin-app-backend": "^0.3.23",
"@backstage/plugin-auth-backend": "^0.9.0",
"@backstage/plugin-azure-devops-backend": "^0.3.2",
"@backstage/plugin-badges-backend": "^0.1.17",
"@backstage/plugin-catalog-backend": "^0.21.2",
"@backstage/plugin-code-coverage-backend": "^0.1.21",
"@backstage/plugin-graphql-backend": "^0.1.13",
"@backstage/plugin-jenkins-backend": "^0.1.12",
"@backstage/plugin-kubernetes-backend": "^0.4.6",
"@backstage/plugin-kafka-backend": "^0.2.16",
"@backstage/plugin-permission-backend": "^0.4.2",
"@backstage/plugin-permission-common": "^0.4.0",
"@backstage/plugin-permission-node": "^0.4.2-next.0",
"@backstage/plugin-proxy-backend": "^0.2.17-next.0",
"@backstage/plugin-rollbar-backend": "^0.1.20-next.0",
"@backstage/plugin-scaffolder-backend": "^0.15.23-next.0",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.2.5-next.0",
"@backstage/plugin-search-backend": "^0.4.1-next.0",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.0.8",
"@backstage/plugin-search-backend-module-pg": "^0.2.4",
"@backstage/plugin-permission-node": "^0.4.2",
"@backstage/plugin-proxy-backend": "^0.2.17",
"@backstage/plugin-rollbar-backend": "^0.1.20",
"@backstage/plugin-scaffolder-backend": "^0.15.23",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.2.5",
"@backstage/plugin-search-backend": "^0.4.1",
"@backstage/plugin-search-backend-node": "^0.4.5",
"@backstage/plugin-tech-insights-backend": "^0.2.2",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.6",
"@backstage/plugin-tech-insights-node": "^0.2.0",
"@backstage/plugin-techdocs-backend": "^0.13.1",
"@backstage/plugin-todo-backend": "^0.1.19",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.0.8",
"@backstage/plugin-search-backend-module-pg": "^0.2.5",
"@backstage/plugin-techdocs-backend": "^0.13.2",
"@backstage/plugin-tech-insights-backend": "^0.2.3",
"@backstage/plugin-tech-insights-node": "^0.2.1",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.7",
"@backstage/plugin-todo-backend": "^0.1.20",
"@gitbeaker/node": "^35.1.0",
"@octokit/rest": "^18.5.3",
"azure-devops-node-api": "^11.0.1",
@@ -73,7 +73,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/cli": "^0.13.1",
"@types/dockerode": "^3.3.0",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5"
+13
View File
@@ -1,5 +1,18 @@
# @backstage/cli
## 0.13.1
### Patch Changes
- 5bd0ce9e62: chore(deps): bump `inquirer` from 7.3.3 to 8.2.0
- 80f510caee: Log warning if unable to parse yarn.lock
## 0.13.1-next.1
### Patch Changes
- 5bd0ce9e62: chore(deps): bump `inquirer` from 7.3.3 to 8.2.0
## 0.13.1-next.0
### Patch Changes
+7 -7
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
"version": "0.13.1-next.0",
"version": "0.13.1",
"private": false,
"publishConfig": {
"access": "public"
@@ -78,7 +78,7 @@
"glob": "^7.1.7",
"handlebars": "^4.7.3",
"html-webpack-plugin": "^5.3.1",
"inquirer": "^7.0.4",
"inquirer": "^8.2.0",
"jest": "^26.0.1",
"jest-css-modules": "^2.1.0",
"json-schema": "^0.4.0",
@@ -115,13 +115,13 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/backend-common": "^0.10.5",
"@backstage/backend-common": "^0.10.6",
"@backstage/config": "^0.1.13",
"@backstage/core-components": "^0.8.7-next.0",
"@backstage/core-components": "^0.8.7",
"@backstage/core-plugin-api": "^0.6.0",
"@backstage/core-app-api": "^0.5.1",
"@backstage/dev-utils": "^0.2.20-next.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/core-app-api": "^0.5.2",
"@backstage/dev-utils": "^0.2.20",
"@backstage/test-utils": "^0.2.4",
"@backstage/theme": "^0.2.14",
"@types/diff": "^5.0.0",
"@types/express": "^4.17.6",
+16
View File
@@ -1,5 +1,21 @@
# @backstage/codemods
## 0.1.32
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7
- @backstage/core-app-api@0.5.2
## 0.1.32-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7-next.1
- @backstage/core-app-api@0.5.2-next.0
## 0.1.32-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/codemods",
"description": "A collection of codemods for Backstage projects",
"version": "0.1.32-next.0",
"version": "0.1.32",
"private": false,
"publishConfig": {
"access": "public",
+1 -1
View File
@@ -34,7 +34,7 @@
"lodash": "^4.17.21"
},
"devDependencies": {
"@backstage/test-utils": "^0.2.3",
"@backstage/test-utils": "^0.2.4-next.0",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
+16
View File
@@ -1,5 +1,21 @@
# @backstage/core-app-api
## 0.5.2
### Patch Changes
- 40775bd263: Switched out the `GithubAuth` implementation to use the common `OAuth2` implementation. This relies on the simultaneous change in `@backstage/plugin-auth-backend` that enabled access token storage in cookies rather than the current solution that's based on `LocalStorage`.
> **NOTE:** Make sure you upgrade the `auth-backend` deployment before or at the same time as you deploy this change.
## 0.5.2-next.0
### Patch Changes
- 40775bd263: Switched out the `GithubAuth` implementation to use the common `OAuth2` implementation. This relies on the simultaneous change in `@backstage/plugin-auth-backend` that enabled access token storage in cookies rather than the current solution that's based on `LocalStorage`.
> **NOTE:** Make sure you upgrade the `auth-backend` deployment before or at the same time as you deploy this change.
## 0.5.1
### Patch Changes
+4 -17
View File
@@ -35,6 +35,7 @@ import { FeatureFlag } from '@backstage/core-plugin-api';
import { FeatureFlagsApi } from '@backstage/core-plugin-api';
import { FeatureFlagsSaveOptions } from '@backstage/core-plugin-api';
import { FetchApi } from '@backstage/core-plugin-api';
import { githubAuthApiRef } from '@backstage/core-plugin-api';
import { gitlabAuthApiRef } from '@backstage/core-plugin-api';
import { googleAuthApiRef } from '@backstage/core-plugin-api';
import { IconComponent } from '@backstage/core-plugin-api';
@@ -379,25 +380,11 @@ export type FlatRoutesProps = {
};
// @public
export class GithubAuth implements OAuthApi, SessionApi {
// (undocumented)
static create(options: OAuthApiCreateOptions): GithubAuth;
// (undocumented)
getAccessToken(scope?: string, options?: AuthRequestOptions): Promise<string>;
// (undocumented)
getBackstageIdentity(
options?: AuthRequestOptions,
): Promise<BackstageIdentityResponse | undefined>;
// (undocumented)
getProfile(options?: AuthRequestOptions): Promise<ProfileInfo | undefined>;
export class GithubAuth {
// (undocumented)
static create(options: OAuthApiCreateOptions): typeof githubAuthApiRef.T;
// @deprecated (undocumented)
static normalizeScope(scope?: string): Set<string>;
// (undocumented)
sessionState$(): Observable<SessionState>;
// (undocumented)
signIn(): Promise<void>;
// (undocumented)
signOut(): Promise<void>;
}
// @public @deprecated
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-app-api",
"description": "Core app API used by Backstage apps",
"version": "0.5.1",
"version": "0.5.2",
"private": false,
"publishConfig": {
"access": "public",
@@ -45,8 +45,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/cli": "^0.13.1",
"@backstage/test-utils": "^0.2.4",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^7.0.2",
@@ -14,16 +14,33 @@
* limitations under the License.
*/
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import GithubAuth from './GithubAuth';
describe('GithubAuth', () => {
it('should get access token', async () => {
const getSession = jest
.fn()
.mockResolvedValue({ providerInfo: { accessToken: 'access-token' } });
const githubAuth = new (GithubAuth as any)({ getSession }) as GithubAuth;
const getSession = jest.fn();
expect(await githubAuth.getAccessToken()).toBe('access-token');
expect(getSession).toBeCalledTimes(1);
jest.mock('../../../../lib/AuthSessionManager', () => ({
...(jest.requireActual('../../../../lib/AuthSessionManager') as any),
RefreshingAuthSessionManager: class {
getSession = getSession;
},
}));
describe('GithubAuth', () => {
afterEach(() => {
jest.resetAllMocks();
});
it('should forward access token request to session manager', async () => {
const githubAuth = GithubAuth.create({
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
});
githubAuth.getAccessToken('repo');
expect(getSession).toHaveBeenCalledWith({
scopes: new Set(['repo']),
});
});
});
@@ -14,35 +14,9 @@
* limitations under the License.
*/
import {
AuthRequestOptions,
BackstageIdentityResponse,
OAuthApi,
ProfileInfo,
SessionApi,
SessionState,
} from '@backstage/core-plugin-api';
import { Observable } from '@backstage/types';
import { DefaultAuthConnector } from '../../../../lib/AuthConnector';
import {
AuthSessionStore,
RefreshingAuthSessionManager,
StaticAuthSessionManager,
} from '../../../../lib/AuthSessionManager';
import { OptionalRefreshSessionManagerMux } from '../../../../lib/AuthSessionManager/OptionalRefreshSessionManagerMux';
import { SessionManager } from '../../../../lib/AuthSessionManager/types';
import { githubAuthApiRef } from '@backstage/core-plugin-api';
import { OAuth2 } from '../oauth2';
import { OAuthApiCreateOptions } from '../types';
import { GithubSession, githubSessionSchema } from './types';
export type GithubAuthResponse = {
providerInfo: {
accessToken: string;
scope: string;
expiresInSeconds?: number;
};
profile: ProfileInfo;
backstageIdentity: BackstageIdentityResponse;
};
const DEFAULT_PROVIDER = {
id: 'github',
@@ -55,8 +29,8 @@ const DEFAULT_PROVIDER = {
*
* @public
*/
export default class GithubAuth implements OAuthApi, SessionApi {
static create(options: OAuthApiCreateOptions) {
export default class GithubAuth {
static create(options: OAuthApiCreateOptions): typeof githubAuthApiRef.T {
const {
discoveryApi,
environment = 'development',
@@ -65,96 +39,18 @@ export default class GithubAuth implements OAuthApi, SessionApi {
defaultScopes = ['read:user'],
} = options;
const connector = new DefaultAuthConnector({
return OAuth2.create({
discoveryApi,
environment,
oauthRequestApi,
provider,
oauthRequestApi: oauthRequestApi,
sessionTransform(res: GithubAuthResponse): GithubSession {
return {
...res,
providerInfo: {
accessToken: res.providerInfo.accessToken,
scopes: GithubAuth.normalizeScope(res.providerInfo.scope),
expiresAt: res.providerInfo.expiresInSeconds
? new Date(Date.now() + res.providerInfo.expiresInSeconds * 1000)
: undefined,
},
};
},
environment,
defaultScopes,
});
const refreshingSessionManager = new RefreshingAuthSessionManager({
connector,
defaultScopes: new Set(defaultScopes),
sessionScopes: (session: GithubSession) => session.providerInfo.scopes,
sessionShouldRefresh: (session: GithubSession) => {
const { expiresAt } = session.providerInfo;
if (!expiresAt) {
return false;
}
const expiresInSec = (expiresAt.getTime() - Date.now()) / 1000;
return expiresInSec < 60 * 5;
},
});
const staticSessionManager = new AuthSessionStore<GithubSession>({
manager: new StaticAuthSessionManager({
connector,
defaultScopes: new Set(defaultScopes),
sessionScopes: (session: GithubSession) => session.providerInfo.scopes,
}),
storageKey: `${provider.id}Session`,
schema: githubSessionSchema,
sessionScopes: (session: GithubSession) => session.providerInfo.scopes,
});
const sessionManagerMux = new OptionalRefreshSessionManagerMux({
refreshingSessionManager,
staticSessionManager,
sessionCanRefresh: session =>
session.providerInfo.expiresAt !== undefined,
});
return new GithubAuth(sessionManagerMux);
}
private constructor(
private readonly sessionManager: SessionManager<GithubSession>,
) {}
async signIn() {
await this.getAccessToken();
}
async signOut() {
await this.sessionManager.removeSession();
}
sessionState$(): Observable<SessionState> {
return this.sessionManager.sessionState$();
}
async getAccessToken(scope?: string, options?: AuthRequestOptions) {
const session = await this.sessionManager.getSession({
...options,
scopes: GithubAuth.normalizeScope(scope),
});
return session?.providerInfo.accessToken ?? '';
}
async getBackstageIdentity(
options: AuthRequestOptions = {},
): Promise<BackstageIdentityResponse | undefined> {
const session = await this.sessionManager.getSession(options);
return session?.backstageIdentity;
}
async getProfile(options: AuthRequestOptions = {}) {
const session = await this.sessionManager.getSession(options);
return session?.profile;
}
/**
* @deprecated This method is deprecated and will be removed in a future release.
*/
static normalizeScope(scope?: string): Set<string> {
if (!scope) {
return new Set();
+16
View File
@@ -1,5 +1,21 @@
# @backstage/core-components
## 0.8.7
### Patch Changes
- f7257dff6f: The `<Link />` component now accepts a `noTrack` prop, which prevents the `click` event from being captured by the Analytics API. This can be used if tracking is explicitly not warranted, or in order to use custom link tracking in specific situations.
- 4c773ed25c: Change subtitle of Header style to use palette.bursts.fontColor
- f465b63b7f: Fix an issue where changes related to the `MobileSidebar` prevented scrolling pages. Additionally improve the menu of the `MobileSidebar` to not overlay the `BottomNavigation`.
- 064e750a50: Adding hover message to the Gauge and an info icon to the GaugeCard.
- a681cb9c2f: Make linkTarget configurable for MarkdownContent component
## 0.8.7-next.1
### Patch Changes
- f7257dff6f: The `<Link />` component now accepts a `noTrack` prop, which prevents the `click` event from being captured by the Analytics API. This can be used if tracking is explicitly not warranted, or in order to use custom link tracking in specific situations.
## 0.8.7-next.0
### Patch Changes
+7 -1
View File
@@ -384,7 +384,12 @@ export function GaugeCard(props: Props_10): JSX.Element;
export type GaugeCardClassKey = 'root';
// @public (undocumented)
export type GaugeClassKey = 'root' | 'overlay' | 'circle' | 'colorUnknown';
export type GaugeClassKey =
| 'root'
| 'overlay'
| 'description'
| 'circle'
| 'colorUnknown';
// @public (undocumented)
export type GaugeProps = {
@@ -393,6 +398,7 @@ export type GaugeProps = {
inverse?: boolean;
unit?: string;
max?: number;
description?: ReactNode;
getColor?: GaugePropsGetColor;
};
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-components",
"description": "Core components used by Backstage plugins and apps",
"version": "0.8.7-next.0",
"version": "0.8.7",
"private": false,
"publishConfig": {
"access": "public",
@@ -39,7 +39,7 @@
"@material-ui/lab": "4.0.0-alpha.57",
"@types/react-sparklines": "^1.7.0",
"@types/react-text-truncate": "^0.14.0",
"ansi-regex": "^5.0.1",
"ansi-regex": "^6.0.1",
"classnames": "^2.2.6",
"d3-selection": "^3.0.0",
"d3-shape": "^3.0.0",
@@ -73,9 +73,9 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/core-app-api": "^0.5.1",
"@backstage/cli": "^0.13.1-next.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/core-app-api": "^0.5.2",
"@backstage/cli": "^0.13.1",
"@backstage/test-utils": "^0.2.4",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^7.0.2",
@@ -17,10 +17,15 @@
import { BackstagePalette, BackstageTheme } from '@backstage/theme';
import { makeStyles, useTheme } from '@material-ui/core/styles';
import { Circle } from 'rc-progress';
import React from 'react';
import React, { ReactNode, useEffect, useState } from 'react';
/** @public */
export type GaugeClassKey = 'root' | 'overlay' | 'circle' | 'colorUnknown';
export type GaugeClassKey =
| 'root'
| 'overlay'
| 'description'
| 'circle'
| 'colorUnknown';
const useStyles = makeStyles<BackstageTheme>(
theme => ({
@@ -37,6 +42,15 @@ const useStyles = makeStyles<BackstageTheme>(
fontWeight: 'bold',
color: theme.palette.textContrast,
},
description: {
fontSize: '100%',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
position: 'absolute',
wordBreak: 'break-all',
display: 'inline-block',
},
circle: {
width: '80%',
transform: 'translate(10%, 0)',
@@ -53,6 +67,7 @@ export type GaugeProps = {
inverse?: boolean;
unit?: string;
max?: number;
description?: ReactNode;
getColor?: GaugePropsGetColor;
};
@@ -104,10 +119,11 @@ export const getProgressColor: GaugePropsGetColor = ({
*/
export function Gauge(props: GaugeProps) {
const [hoverRef, setHoverRef] = useState<HTMLDivElement | null>(null);
const { getColor = getProgressColor } = props;
const classes = useStyles(props);
const { palette } = useTheme<BackstageTheme>();
const { value, fractional, inverse, unit, max } = {
const { value, fractional, inverse, unit, max, description } = {
...defaultGaugeProps,
...props,
};
@@ -115,8 +131,28 @@ export function Gauge(props: GaugeProps) {
const asPercentage = fractional ? Math.round(value * max) : value;
const asActual = max !== 100 ? Math.round(value) : asPercentage;
const [isHovering, setIsHovering] = useState(false);
useEffect(() => {
const node = hoverRef;
const handleMouseOver = () => setIsHovering(true);
const handleMouseOut = () => setIsHovering(false);
if (node && description) {
node.addEventListener('mouseenter', handleMouseOver);
node.addEventListener('mouseleave', handleMouseOut);
return () => {
node.removeEventListener('mouseenter', handleMouseOver);
node.removeEventListener('mouseleave', handleMouseOut);
};
}
return () => {
setIsHovering(false);
};
}, [description, hoverRef]);
return (
<div className={classes.root}>
<div ref={setHoverRef} className={classes.root}>
<Circle
strokeLinecap="butt"
percent={asPercentage}
@@ -125,9 +161,13 @@ export function Gauge(props: GaugeProps) {
strokeColor={getColor({ palette, value: asActual, inverse, max })}
className={classes.circle}
/>
<div className={classes.overlay}>
{isNaN(value) ? 'N/A' : `${asActual}${unit}`}
</div>
{description && isHovering ? (
<div className={classes.description}>{description}</div>
) : (
<div className={classes.overlay}>
{isNaN(value) ? 'N/A' : `${asActual}${unit}`}
</div>
)}
</div>
);
}
@@ -18,6 +18,8 @@ import React, { PropsWithChildren } from 'react';
import { GaugeCard } from './GaugeCard';
import Grid from '@material-ui/core/Grid';
import { MemoryRouter } from 'react-router';
import Tooltip from '@material-ui/core/Tooltip';
import Info from '@material-ui/icons/Info';
const linkInfo = { title: 'Go to XYZ Location', link: '#' };
@@ -118,3 +120,79 @@ export const StaticColor = () => (
</Grid>
</Wrapper>
);
export const InfoMessage = () => (
<Wrapper>
<Grid item>
<GaugeCard
title="Progress"
subheader="With a subheader"
progress={0.3}
icon={
<Tooltip title="Info Message" arrow>
<Info style={{ float: 'right' }} />
</Tooltip>
}
/>
</Grid>
<Grid item>
<GaugeCard
title="Progress"
subheader="With a subheader"
progress={0.57}
icon={
<Tooltip title="Info Message" arrow>
<Info style={{ float: 'right' }} />
</Tooltip>
}
/>
</Grid>
<Grid item>
<GaugeCard
title="Progress"
subheader="With a subheader"
progress={0.89}
icon={
<Tooltip title="Info Message" arrow>
<Info style={{ float: 'right' }} />
</Tooltip>
}
/>
</Grid>
<Grid item>
<GaugeCard
title="Progress"
subheader="With a subheader"
inverse
progress={0.2}
icon={
<Tooltip title="Info Message" arrow>
<Info style={{ float: 'right' }} />
</Tooltip>
}
/>
</Grid>
</Wrapper>
);
export const HoverMessage = () => (
<Wrapper>
<Grid item>
<GaugeCard title="Progress" progress={0.3} description="Hover Message" />
</Grid>
<Grid item>
<GaugeCard title="Progress" progress={0.57} description="Hover Message" />
</Grid>
<Grid item>
<GaugeCard title="Progress" progress={0.89} description="Hover Message" />
</Grid>
<Grid item>
<GaugeCard
title="Progress"
inverse
progress={0.2}
description="Hover Message"
/>
</Grid>
</Wrapper>
);
@@ -15,7 +15,7 @@
*/
import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
import React, { ReactNode } from 'react';
import { BottomLinkProps } from '../../layout/BottomLink';
import { InfoCard, InfoCardVariants } from '../../layout/InfoCard';
import { Gauge, GaugePropsGetColor } from './Gauge';
@@ -26,6 +26,8 @@ type Props = {
variant?: InfoCardVariants;
/** Progress in % specified as decimal, e.g. "0.23" */
progress: number;
description?: ReactNode;
icon?: ReactNode;
inverse?: boolean;
deepLink?: BottomLinkProps;
getColor?: GaugePropsGetColor;
@@ -52,11 +54,21 @@ const useStyles = makeStyles(
*/
export function GaugeCard(props: Props) {
const classes = useStyles(props);
const { title, subheader, progress, inverse, deepLink, variant, getColor } =
props;
const {
title,
subheader,
progress,
inverse,
deepLink,
description,
icon,
variant,
getColor,
} = props;
const gaugeProps = {
inverse,
description,
getColor,
value: progress,
};
@@ -68,6 +80,7 @@ export function GaugeCard(props: Props) {
subheader={subheader}
deepLink={deepLink}
variant={variant}
icon={icon}
>
<Gauge {...gaugeProps} />
</InfoCard>
@@ -55,6 +55,9 @@ const useStyles = makeStyles(
headerAvatar: {},
headerAction: {},
headerContent: {},
subheader: {
display: 'flex',
},
}),
{ name: 'BackstageInfoCard' },
);
@@ -134,6 +137,7 @@ type Props = {
children?: ReactNode;
headerStyle?: object;
headerProps?: CardHeaderProps;
icon?: ReactNode;
action?: ReactNode;
actionsClassName?: string;
actions?: ReactNode;
@@ -162,6 +166,7 @@ export function InfoCard(props: Props): JSX.Element {
children,
headerStyle,
headerProps,
icon,
action,
actionsClassName,
actions,
@@ -194,6 +199,15 @@ export function InfoCard(props: Props): JSX.Element {
});
}
const cardSubTitle = () => {
return (
<div className={classes.headerSubheader}>
{subheader && <div className={classes.subheader}>{subheader}</div>}
{icon}
</div>
);
};
const errProps: ErrorBoundaryProps =
errorBoundaryProps || (slackChannel ? { slackChannel } : {});
@@ -211,7 +225,7 @@ export function InfoCard(props: Props): JSX.Element {
content: classes.headerContent,
}}
title={title}
subheader={subheader}
subheader={cardSubTitle()}
action={action}
style={{ ...headerStyle }}
titleTypographyProps={titleTypographyProps}
+3 -3
View File
@@ -43,9 +43,9 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/core-app-api": "^0.5.1",
"@backstage/test-utils": "^0.2.3",
"@backstage/cli": "^0.13.1-next.1",
"@backstage/core-app-api": "^0.5.2-next.0",
"@backstage/test-utils": "^0.2.4-next.0",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^7.0.2",
+103
View File
@@ -1,5 +1,108 @@
# @backstage/create-app
## 0.4.18
### Patch Changes
- 5bd0ce9e62: chore(deps): bump `inquirer` from 7.3.3 to 8.2.0
- f27f5197e2: Apply the fix from `0.4.16`, which is part of the `v0.65.1` release of Backstage.
- 2687029a67: Update backend-to-backend auth link in configuration file comment
- 24ef62048c: Adds missing `/catalog-graph` route to `<CatalogGraphPage/>`.
To fix this problem for a recently created app please update your `app/src/App.tsx`
```diff
+ import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';
... omitted ...
</Route>
<Route path="/settings" element={<UserSettingsPage />} />
+ <Route path="/catalog-graph" element={<CatalogGraphPage />} />
</FlatRoutes>
```
- ba59832aed: Permission the `catalog-import` route
The following changes are **required** if you intend to add permissions to your existing app.
Use the `PermissionedRoute` for `CatalogImportPage` instead of the normal `Route`:
```diff
// packages/app/src/App.tsx
...
+ import { PermissionedRoute } from '@backstage/plugin-permission-react';
+ import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
...
- <Route path="/catalog-import" element={<CatalogImportPage />} />
+ <PermissionedRoute
+ path="/catalog-import"
+ permission={catalogEntityCreatePermission}
+ element={<CatalogImportPage />}
+ />
```
- cef64b1561: Added `tokenManager` as a required property for the auth-backend `createRouter` function. This dependency is used to issue server tokens that are used by the `CatalogIdentityClient` when looking up users and their group membership during authentication.
These changes are **required** to `packages/backend/src/plugins/auth.ts`:
```diff
export default async function createPlugin({
logger,
database,
config,
discovery,
+ tokenManager,
}: PluginEnvironment): Promise<Router> {
return await createRouter({
logger,
config,
database,
discovery,
+ tokenManager,
});
}
```
- e39d88bd84: Switched the `app` dependency in the backend to use a file target rather than version.
To apply this change to an existing app, make the following change to `packages/backend/package.json`:
```diff
"dependencies": {
- "app": "0.0.0",
+ "app": "file:../app",
```
## 0.4.18-next.1
### Patch Changes
- 5bd0ce9e62: chore(deps): bump `inquirer` from 7.3.3 to 8.2.0
- ba59832aed: Permission the `catalog-import` route
The following changes are **required** if you intend to add permissions to your existing app.
Use the `PermissionedRoute` for `CatalogImportPage` instead of the normal `Route`:
```diff
// packages/app/src/App.tsx
...
+ import { PermissionedRoute } from '@backstage/plugin-permission-react';
+ import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
...
- <Route path="/catalog-import" element={<CatalogImportPage />} />
+ <PermissionedRoute
+ path="/catalog-import"
+ permission={catalogEntityCreatePermission}
+ element={<CatalogImportPage />}
+ />
```
## 0.4.18-next.0
### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
"version": "0.4.18-next.0",
"version": "0.4.18",
"private": false,
"publishConfig": {
"access": "public"
@@ -35,7 +35,7 @@
"commander": "^6.1.0",
"fs-extra": "9.1.0",
"handlebars": "^4.7.3",
"inquirer": "^7.0.4",
"inquirer": "^8.2.0",
"ora": "^5.3.0",
"recursive-readdir": "^2.2.2"
},
+23
View File
@@ -1,5 +1,28 @@
# @backstage/dev-utils
## 0.2.20
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7
- @backstage/plugin-catalog-react@0.6.13
- @backstage/integration-react@0.1.20
- @backstage/core-app-api@0.5.2
- @backstage/app-defaults@0.1.6
- @backstage/test-utils@0.2.4
## 0.2.20-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7-next.1
- @backstage/plugin-catalog-react@0.6.13-next.1
- @backstage/core-app-api@0.5.2-next.0
- @backstage/app-defaults@0.1.6-next.1
- @backstage/test-utils@0.2.4-next.0
## 0.2.20-next.0
### Patch Changes
+8 -8
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/dev-utils",
"description": "Utilities for developing Backstage plugins.",
"version": "0.2.20-next.0",
"version": "0.2.20",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,14 +29,14 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/app-defaults": "^0.1.6-next.0",
"@backstage/core-app-api": "^0.5.1",
"@backstage/core-components": "^0.8.7-next.0",
"@backstage/app-defaults": "^0.1.6",
"@backstage/core-app-api": "^0.5.2",
"@backstage/core-components": "^0.8.7",
"@backstage/core-plugin-api": "^0.6.0",
"@backstage/catalog-model": "^0.9.10",
"@backstage/integration-react": "^0.1.20-next.0",
"@backstage/plugin-catalog-react": "^0.6.13-next.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/integration-react": "^0.1.20",
"@backstage/plugin-catalog-react": "^0.6.13",
"@backstage/test-utils": "^0.2.4",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -55,7 +55,7 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/cli": "^0.13.1",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
+8
View File
@@ -1,5 +1,13 @@
# @backstage/integration-react
## 0.1.20
### Patch Changes
- cee44ad289: Added the ability to collect users `oauth` token from the `RepoUrlPicker` for use in the template manifest
- Updated dependencies
- @backstage/core-components@0.8.7
## 0.1.20-next.0
### Patch Changes
+7
View File
@@ -29,6 +29,7 @@ export class ScmAuth implements ScmAuthApi {
ProfileInfoApi &
BackstageIdentityApi &
SessionApi;
bitbucket: OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi;
}
>;
static forAuthApi(
@@ -82,6 +83,12 @@ export const scmAuthApiRef: ApiRef<ScmAuthApi>;
export interface ScmAuthTokenOptions extends AuthRequestOptions {
additionalScope?: {
repoWrite?: boolean;
customScopes?: {
github?: string[];
azure?: string[];
bitbucket?: string[];
gitlab?: string[];
};
};
url: string;
}
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/integration-react",
"description": "Frontend package for managing integrations towards external systems",
"version": "0.1.20-next.0",
"version": "0.1.20",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -22,7 +22,7 @@
},
"dependencies": {
"@backstage/config": "^0.1.13",
"@backstage/core-components": "^0.8.7-next.0",
"@backstage/core-components": "^0.8.7",
"@backstage/core-plugin-api": "^0.6.0",
"@backstage/integration": "^0.7.2",
"@backstage/theme": "^0.2.14",
@@ -35,9 +35,9 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/dev-utils": "^0.2.20-next.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/cli": "^0.13.1",
"@backstage/dev-utils": "^0.2.20",
"@backstage/test-utils": "^0.2.4",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
@@ -141,6 +141,58 @@ describe('ScmAuth', () => {
});
});
it('should support additional provided scopes from the caller', async () => {
const mockAuthApi = {
getAccessToken: async (scopes: string[]) => {
return scopes.join(' ');
},
};
const githubAuth = ScmAuth.forGithub(mockAuthApi);
await expect(
githubAuth.getCredentials({
url: 'http://example.com',
additionalScope: {
customScopes: { github: ['org:read', 'workflow:write'] },
},
}),
).resolves.toMatchObject({
token: 'repo read:org read:user org:read workflow:write',
});
const gitlabAuth = ScmAuth.forGitlab(mockAuthApi);
await expect(
gitlabAuth.getCredentials({
url: 'http://example.com',
additionalScope: { customScopes: { gitlab: ['write_repository'] } },
}),
).resolves.toMatchObject({
token: 'read_user read_api read_repository write_repository',
});
const azureAuth = ScmAuth.forAzure(mockAuthApi);
await expect(
azureAuth.getCredentials({
url: 'http://example.com',
additionalScope: { customScopes: { azure: ['vso.org'] } },
}),
).resolves.toMatchObject({
token: 'vso.build vso.code vso.graph vso.project vso.profile vso.org',
});
const bitbucketAuth = ScmAuth.forBitbucket(mockAuthApi);
await expect(
bitbucketAuth.getCredentials({
url: 'http://example.com',
additionalScope: {
customScopes: { bitbucket: ['snippet:write', 'issue:write'] },
},
}),
).resolves.toMatchObject({
token: 'account team pullrequest snippet issue snippet:write issue:write',
});
});
it('should handle host option', () => {
const mockAuthApi = {
getAccessToken: jest.fn(),
+41 -8
View File
@@ -15,6 +15,7 @@
*/
import {
bitbucketAuthApiRef,
createApiFactory,
githubAuthApiRef,
gitlabAuthApiRef,
@@ -35,6 +36,9 @@ type ScopeMapping = {
repoWrite: string[];
};
// An enum of all supported providers
type ProviderName = 'generic' | 'github' | 'azure' | 'bitbucket' | 'gitlab';
class ScmAuthMux implements ScmAuthApi {
#providers: Array<ScmAuth>;
@@ -93,12 +97,14 @@ export class ScmAuth implements ScmAuthApi {
github: githubAuthApiRef,
gitlab: gitlabAuthApiRef,
azure: microsoftAuthApiRef,
bitbucket: bitbucketAuthApiRef,
},
factory: ({ github, gitlab, azure }) =>
factory: ({ github, gitlab, azure, bitbucket }) =>
ScmAuth.merge(
ScmAuth.forGithub(github),
ScmAuth.forGitlab(gitlab),
ScmAuth.forAzure(azure),
ScmAuth.forBitbucket(bitbucket),
),
});
}
@@ -116,7 +122,7 @@ export class ScmAuth implements ScmAuthApi {
};
},
): ScmAuth {
return new ScmAuth(authApi, options.host, options.scopeMapping);
return new ScmAuth('generic', authApi, options.host, options.scopeMapping);
}
/**
@@ -139,7 +145,7 @@ export class ScmAuth implements ScmAuthApi {
},
): ScmAuth {
const host = options?.host ?? 'github.com';
return new ScmAuth(githubAuthApi, host, {
return new ScmAuth('github', githubAuthApi, host, {
default: ['repo', 'read:org', 'read:user'],
repoWrite: ['gist'],
});
@@ -165,7 +171,7 @@ export class ScmAuth implements ScmAuthApi {
},
): ScmAuth {
const host = options?.host ?? 'gitlab.com';
return new ScmAuth(gitlabAuthApi, host, {
return new ScmAuth('gitlab', gitlabAuthApi, host, {
default: ['read_user', 'read_api', 'read_repository'],
repoWrite: ['write_repository', 'api'],
});
@@ -191,7 +197,7 @@ export class ScmAuth implements ScmAuthApi {
},
): ScmAuth {
const host = options?.host ?? 'dev.azure.com';
return new ScmAuth(microsoftAuthApi, host, {
return new ScmAuth('azure', microsoftAuthApi, host, {
default: [
'vso.build',
'vso.code',
@@ -223,7 +229,7 @@ export class ScmAuth implements ScmAuthApi {
},
): ScmAuth {
const host = options?.host ?? 'bitbucket.org';
return new ScmAuth(bitbucketAuthApi, host, {
return new ScmAuth('bitbucket', bitbucketAuthApi, host, {
default: ['account', 'team', 'pullrequest', 'snippet', 'issue'],
repoWrite: ['pullrequest:write', 'snippet:write', 'issue:write'],
});
@@ -240,11 +246,18 @@ export class ScmAuth implements ScmAuthApi {
#api: OAuthApi;
#host: string;
#scopeMapping: ScopeMapping;
#providerName: ProviderName;
private constructor(api: OAuthApi, host: string, scopeMapping: ScopeMapping) {
private constructor(
providerName: ProviderName,
api: OAuthApi,
host: string,
scopeMapping: ScopeMapping,
) {
this.#api = api;
this.#host = host;
this.#scopeMapping = scopeMapping;
this.#providerName = providerName;
}
/**
@@ -254,6 +267,16 @@ export class ScmAuth implements ScmAuthApi {
return url.host === this.#host;
}
private getAdditionalScopesForProvider(
additionalScopes: ScmAuthTokenOptions['additionalScope'],
): string[] {
if (!additionalScopes?.customScopes || this.#providerName === 'generic') {
return [];
}
return additionalScopes.customScopes?.[this.#providerName] ?? [];
}
/**
* Fetches credentials for the given resource.
*/
@@ -267,7 +290,17 @@ export class ScmAuth implements ScmAuthApi {
scopes.push(...this.#scopeMapping.repoWrite);
}
const token = await this.#api.getAccessToken(scopes, restOptions);
const additionalScopes =
this.getAdditionalScopesForProvider(additionalScope);
if (additionalScopes.length) {
scopes.push(...additionalScopes);
}
const uniqueScopes = [...new Set(scopes)];
const token = await this.#api.getAccessToken(uniqueScopes, restOptions);
return {
token,
headers: {
@@ -44,6 +44,16 @@ export interface ScmAuthTokenOptions extends AuthRequestOptions {
* the ability to create things like issues and pull requests.
*/
repoWrite?: boolean;
/**
* Allow an arbitrary list of scopes provided from the user
* to request from the provider.
*/
customScopes?: {
github?: string[];
azure?: string[];
bitbucket?: string[];
gitlab?: string[];
};
};
}
+2 -2
View File
@@ -39,9 +39,9 @@
"lodash": "^4.17.21"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/cli": "^0.13.1-next.1",
"@backstage/config-loader": "^0.9.3",
"@backstage/test-utils": "^0.2.3",
"@backstage/test-utils": "^0.2.4-next.0",
"@types/jest": "^26.0.7",
"@types/luxon": "^2.0.4",
"msw": "^0.35.0"
@@ -1,4 +1,31 @@
# embedded-techdocs-app
# techdocs-cli-embedded-app
## 0.2.62
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7
- @backstage/cli@0.13.1
- @backstage/integration-react@0.1.20
- @backstage/core-app-api@0.5.2
- @backstage/plugin-techdocs@0.13.2
- @backstage/app-defaults@0.1.6
- @backstage/test-utils@0.2.4
- @backstage/plugin-catalog@0.7.11
## 0.2.62-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.7-next.1
- @backstage/cli@0.13.1-next.1
- @backstage/core-app-api@0.5.2-next.0
- @backstage/plugin-techdocs@0.13.2-next.1
- @backstage/plugin-catalog@0.7.11-next.1
- @backstage/app-defaults@0.1.6-next.1
- @backstage/test-utils@0.2.4-next.0
## 0.2.62-next.0
@@ -1,20 +1,20 @@
{
"name": "embedded-techdocs-app",
"version": "0.2.62-next.0",
"name": "techdocs-cli-embedded-app",
"version": "0.2.62",
"private": true,
"bundled": true,
"dependencies": {
"@backstage/app-defaults": "^0.1.6-next.0",
"@backstage/app-defaults": "^0.1.6",
"@backstage/catalog-model": "^0.9.10",
"@backstage/cli": "^0.13.1-next.0",
"@backstage/cli": "^0.13.1",
"@backstage/config": "^0.1.13",
"@backstage/core-app-api": "^0.5.1",
"@backstage/core-components": "^0.8.7-next.0",
"@backstage/core-app-api": "^0.5.2",
"@backstage/core-components": "^0.8.7",
"@backstage/core-plugin-api": "^0.6.0",
"@backstage/integration-react": "^0.1.20-next.0",
"@backstage/plugin-catalog": "^0.7.11-next.0",
"@backstage/plugin-techdocs": "^0.13.2-next.0",
"@backstage/test-utils": "^0.2.3",
"@backstage/integration-react": "^0.1.20",
"@backstage/plugin-catalog": "^0.7.11",
"@backstage/plugin-techdocs": "^0.13.2",
"@backstage/test-utils": "^0.2.4",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -26,7 +26,7 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.13.1-next.0",
"@backstage/cli": "^0.13.1",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before

Width:  |  Height:  |  Size: 883 B

After

Width:  |  Height:  |  Size: 883 B

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Some files were not shown because too many files have changed in this diff Show More