Merge remote-tracking branch 'upstream/master' into airbrake-backend
# Conflicts: # packages/backend/package.json
@@ -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.
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/core-components': patch
|
||||
---
|
||||
|
||||
chore: bump `ansi-regex` from `5.0.1` to `6.0.1`
|
||||
@@ -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).
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/plugin-rollbar-backend': patch
|
||||
---
|
||||
|
||||
chore(deps): bump `camelcase-keys` from 6.2.2 to 7.0.1
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/plugin-auth-backend': patch
|
||||
---
|
||||
|
||||
chore(deps): bump `passport` from 0.4.1 to 0.5.2
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend': patch
|
||||
---
|
||||
|
||||
chore(deps): bump `prom-client` from 13.2.0 to 14.0.1
|
||||
@@ -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.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/core-components': patch
|
||||
---
|
||||
|
||||
Change subtitle of Header style to use palette.bursts.fontColor
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder': patch
|
||||
---
|
||||
|
||||
Permission the Register Existing Component button
|
||||
@@ -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`.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend': patch
|
||||
---
|
||||
|
||||
Migrate from deprecated package @octokit/rest to octokit
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/create-app': patch
|
||||
---
|
||||
|
||||
Update backend-to-backend auth link in configuration file comment
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-search': patch
|
||||
---
|
||||
|
||||
Modify modal search to clamp result length to 5 rows.
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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>
|
||||
```
|
||||
@@ -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,
|
||||
});
|
||||
```
|
||||
@@ -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`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-splunk-on-call': patch
|
||||
---
|
||||
|
||||
Correct spelling of 'Acknowledge' in tooltip.
|
||||
@@ -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
|
||||
@@ -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 />}
|
||||
+ />
|
||||
```
|
||||
@@ -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.
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
```
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/plugin-pagerduty': patch
|
||||
---
|
||||
|
||||
Fix change events tab error when change events exist
|
||||
@@ -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"
|
||||
/>
|
||||
```
|
||||
@@ -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.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend': patch
|
||||
---
|
||||
|
||||
Pass authorization token to location service inside location api routes
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
'@backstage/core-components': patch
|
||||
'@backstage/plugin-scaffolder': patch
|
||||
---
|
||||
|
||||
Make linkTarget configurable for MarkdownContent component
|
||||
@@ -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",
|
||||
```
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'@backstage/cli': patch
|
||||
---
|
||||
|
||||
Log warning if unable to parse yarn.lock
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 team’s engineering dependencies. |
|
||||
| [Oriflame](https://www.oriflame.com/) | [Oriflame](https://github.com/oriflame) | Internal developer portal for services, single page apps and packages overview, API documentation, technical guides, tech-radar and more. |
|
||||
| [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 team’s engineering dependencies. |
|
||||
| [Oriflame](https://www.oriflame.com/) | [Oriflame](https://github.com/oriflame) | Internal developer portal for services, single page apps and packages overview, API documentation, technical guides, tech-radar and more. |
|
||||
| [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 |
|
||||
|
||||
@@ -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 [Backstage’s 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.
|
||||
|
||||
@@ -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>
|
||||
```
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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[];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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 |