Merge branch 'backstage:master' into feature-flag-scaffolding

This commit is contained in:
djamaile
2022-02-18 16:48:01 +01:00
committed by GitHub
857 changed files with 14305 additions and 8432 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Fixed a bug in the built-in Jest configuration that prevented it from identifying packages that had migrated to using the new package scripts to run tests.
-78
View File
@@ -1,78 +0,0 @@
---
'@backstage/backend-common': patch
'@backstage/catalog-client': patch
'@backstage/cli': patch
'@backstage/config-loader': patch
'@backstage/core-app-api': patch
'@backstage/core-components': patch
'@backstage/core-plugin-api': patch
'@backstage/errors': patch
'@backstage/integration': patch
'@backstage/integration-react': patch
'@backstage/release-manifests': patch
'@backstage/test-utils': patch
'@backstage/plugin-airbrake': patch
'@backstage/plugin-allure': patch
'@backstage/plugin-analytics-module-ga': patch
'@backstage/plugin-apache-airflow': patch
'@backstage/plugin-api-docs': patch
'@backstage/plugin-auth-backend': patch
'@backstage/plugin-auth-node': patch
'@backstage/plugin-azure-devops': patch
'@backstage/plugin-badges': patch
'@backstage/plugin-bazaar': patch
'@backstage/plugin-bitrise': patch
'@backstage/plugin-catalog': patch
'@backstage/plugin-catalog-backend': patch
'@backstage/plugin-catalog-backend-module-msgraph': patch
'@backstage/plugin-catalog-graphql': patch
'@backstage/plugin-catalog-import': patch
'@backstage/plugin-catalog-react': patch
'@backstage/plugin-circleci': patch
'@backstage/plugin-cloudbuild': patch
'@backstage/plugin-code-coverage': patch
'@backstage/plugin-config-schema': patch
'@backstage/plugin-cost-insights': patch
'@backstage/plugin-explore': patch
'@backstage/plugin-explore-react': patch
'@backstage/plugin-firehydrant': patch
'@backstage/plugin-fossa': patch
'@backstage/plugin-gcp-projects': patch
'@backstage/plugin-git-release-manager': patch
'@backstage/plugin-github-actions': patch
'@backstage/plugin-github-deployments': patch
'@backstage/plugin-gitops-profiles': patch
'@backstage/plugin-gocd': patch
'@backstage/plugin-graphiql': patch
'@backstage/plugin-home': patch
'@backstage/plugin-ilert': patch
'@backstage/plugin-jenkins': patch
'@backstage/plugin-kafka': patch
'@backstage/plugin-kubernetes': patch
'@backstage/plugin-lighthouse': patch
'@backstage/plugin-newrelic': patch
'@backstage/plugin-newrelic-dashboard': patch
'@backstage/plugin-org': patch
'@backstage/plugin-pagerduty': patch
'@backstage/plugin-permission-backend': patch
'@backstage/plugin-permission-common': patch
'@backstage/plugin-permission-react': patch
'@backstage/plugin-rollbar': patch
'@backstage/plugin-rollbar-backend': patch
'@backstage/plugin-scaffolder': patch
'@backstage/plugin-scaffolder-backend': patch
'@backstage/plugin-search': patch
'@backstage/plugin-sentry': patch
'@backstage/plugin-shortcuts': patch
'@backstage/plugin-sonarqube': patch
'@backstage/plugin-splunk-on-call': patch
'@backstage/plugin-tech-insights': patch
'@backstage/plugin-tech-radar': patch
'@backstage/plugin-techdocs': patch
'@backstage/plugin-techdocs-backend': patch
'@backstage/plugin-todo': patch
'@backstage/plugin-user-settings': patch
'@backstage/plugin-xcmetrics': patch
---
Bump `node-fetch` to version 2.6.7 and `cross-fetch` to version 3.1.5
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Deprecated the `runPeriodically` function which is no longer in use.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': minor
---
The `CodeOwnersProcessor` no longer supports the deprecated SCM-specific location types like `'github/api'`. This is a breaking change but it is unlikely to have an impact, as these location types haven't been supported by the rest of the catalog for a long time.
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/plugin-scaffolder-common': patch
---
**DEPRECATED** - The `TaskSpec.metadata` and `TaskSpec.baseUrl` has been deprecated in favour of the new `TaskSpec.templateInfo`.
The `baseUrl` is now found on the `templateInfo` object, and the name can be inferred from the `templateInfo.entityRef` property.
Usages of `TaskSpec.metadata.name` or `ctx.metadata.name` in Actions should migrate to using `parseEntityRef(taskSpec.templateInfo.entityRef)` to get the parsed entity triplet.
Usages of `ctx.baseUrl` in Actions should migrate to using `ctx.templateInfo.baseUrl` instead.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
chore(deps-dev): bump `@types/rollup-plugin-postcss` from 2.0.1 to 3.1.4
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
chore(deps): bump `@hot-loader/react-dom` from 16.13.0 to 17.0.2
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': patch
---
Renamed `CatalogResultListItem` to `CatalogSearchResultListItem` along with its prop type, leaving the old names in place as a deprecations.
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/plugin-catalog-backend': patch
---
Added an `/entity-facets` endpoint, which lets you query the distribution of
possible values for fields of entities.
This can be useful for example when populating a dropdown in the user interface,
such as listing all tag values that are actually being used right now in your
catalog instance, along with putting the most common ones at the top.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': minor
---
**BREAKING**: Removed unused `durationText` utility.
+33
View File
@@ -0,0 +1,33 @@
---
'@backstage/plugin-catalog-backend': minor
---
**BREAKING**: Removed `AwsOrganizationCloudAccountProcessor` from the default
set of builtin processors, and instead moved it into its own module
`@backstage/plugin-catalog-backend-module-aws`.
If you were using this processor, through making use of the location type
`aws-cloud-accounts` and/or using the configuration key
`catalog.processors.awsOrganization`, you will from now on have to add the
processor manually to your catalog.
First, add the `@backstage/plugin-catalog-backend-module-aws` dependency to your
`packages/backend` package.
Then, in `packages/backend/src/plugins/catalog.ts`:
```diff
+import { AwsOrganizationCloudAccountProcessor } from '@backstage/plugin-catalog-backend-module-aws';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const builder = await CatalogBuilder.create(env);
+ builder.addProcessor(
+ AwsOrganizationCloudAccountProcessor.fromConfig(
+ env.config,
+ { logger: env.logger }
+ )
+ );
// ...
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend': patch
---
Support "dependencyOf" relation in Resource entities
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': patch
---
Added `EntitySwitchProps` type for `EntitySwitch`.
+22
View File
@@ -0,0 +1,22 @@
---
'@backstage/create-app': patch
---
Update the template to reflect the renaming of `CatalogResultListItem` to `CatalogSearchResultListItem` from `@backstage/plugin-catalog`.
To apply this change to an existing app, make the following change to `packages/app/src/components/search/SearchPage.tsx`:
```diff
-import { CatalogResultListItem } from '@backstage/plugin-catalog';
+import { CatalogSearchResultListItem } from '@backstage/plugin-catalog';
```
```diff
case 'software-catalog':
return (
- <CatalogResultListItem
+ <CatalogSearchResultListItem
key={document.location}
result={document}
/>
```
+19
View File
@@ -0,0 +1,19 @@
---
'@backstage/plugin-scaffolder-backend': minor
---
- **BREAKING** - `DatabaseTaskStore()` constructor is now removed. Please use the `DatabaseTaskStore.create()` method instead.
- **BREAKING** - `TaskStore.createTask()` method now only takes one argument of type `TaskStoreCreateTaskOptions` which encapsulates the `spec` and `secrets`
```diff
- TaskStore.createTask(spec, secrets)
+ TaskStore.createTask({ spec, secrets})
```
- **BREAKING** - `TaskBroker.dispatch()` method now only takes one argument of type `TaskBrokerDispatchOptions` which encapsulates the `spec` and `secrets`
```diff
- TaskBroker.dispatch(spec, secrets)
+ TaskBroker.dispatch({ spec, secrets})
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Allow missing kubernetes config in development env
+23
View File
@@ -0,0 +1,23 @@
---
'@backstage/plugin-catalog-backend': patch
---
Deprecated the second parameter of `results.location()` that determines whether an emitted location is optional. In cases where this is currently being set to `false`, the parameter can simply be dropped, as that is the default. Usage where this was being set to `true` should be migrated to set the `presence` option of the emitted location to `optional`. For example:
```ts
results.location(
{
type: 'url',
target: 'http://example.com/foo',
},
true,
);
// migrated to
results.location({
type: 'url',
target: 'http://example.com/foo',
presence: 'optional',
});
```
+18
View File
@@ -0,0 +1,18 @@
---
'@backstage/plugin-auth-backend': minor
---
**BREAKING**: The default sign-in resolvers for all providers, if you choose to
use them, now emit the token `sub` and `ent` claims on the standard,
all-lowercase form, instead of the mixed-case form. The mixed-case form causes
problems for implementations that naively do string comparisons on refs. The end
result is that you may for example see your Backstage token `sub` claim now
become `'user:default/my-id'` instead of `'user:default/My-ID'`.
On a related note, specifically the SAML provider now correctly issues both
`sub` and `ent` claims, and on the full entity ref form instead of the short
form with only the ID.
**NOTE**: For a long time, it has been strongly recommended that you provide
your own sign-in resolver instead of using the builtin ones, and that will
become mandatory in the future.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-catalog-react': minor
---
Improved API documentation.
**BREAKING**: The individual table column factories (e.g. `createEntityRefColumn`) are now no longer available directly, but only through `EntityTable.columns`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Added `EntityRelationSpec`, which was moved over from `@backstage/catalog-model`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/catalog-model': minor
---
**BREAKING**: Removed `EntityRelationSpec` as it is only used during the catalog during the catalog processing.
+15
View File
@@ -0,0 +1,15 @@
---
'@backstage/plugin-auth-backend': patch
'@backstage/plugin-badges-backend': patch
'@backstage/plugin-catalog': patch
'@backstage/plugin-catalog-backend': patch
'@backstage/plugin-catalog-graph': patch
'@backstage/plugin-catalog-import': patch
'@backstage/plugin-catalog-react': patch
'@backstage/plugin-explore': patch
'@backstage/plugin-fossa': patch
'@backstage/plugin-scaffolder': patch
'@backstage/plugin-todo-backend': patch
---
Updated according to the new `getEntityFacets` catalog API method
+33
View File
@@ -0,0 +1,33 @@
---
'@backstage/plugin-catalog-backend-module-aws': minor
---
Added this new catalog module, initially containing only the
`AwsOrganizationCloudAccountProcessor`.
Note that this was moved over from the catalog backend itself, and therefore is
no longer part of its builtin set of processors. If you were using this
processor, through making use of the location type `aws-cloud-accounts` and/or
using the configuration key `catalog.processors.awsOrganization`, you will from
now on have to add the processor manually to your catalog.
First, add the `@backstage/plugin-catalog-backend-module-aws` dependency to your
`packages/backend` package.
Then, in `packages/backend/src/plugins/catalog.ts`:
```diff
+import { AwsOrganizationCloudAccountProcessor } from '@backstage/plugin-catalog-backend-module-aws';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const builder = await CatalogBuilder.create(env);
+ builder.addProcessor(
+ AwsOrganizationCloudAccountProcessor.fromConfig(
+ env.config,
+ { logger: env.logger }
+ )
+ );
// ...
```
+48 -1
View File
@@ -1,3 +1,50 @@
{
"currentReleaseVersion": {}
"currentReleaseVersion": {
"@backstage/backend-common": "0.10.9",
"@backstage/backend-tasks": "0.1.8",
"@backstage/catalog-client": "0.7.1",
"@backstage/catalog-model": "0.10.1",
"@backstage/cli-common": "0.1.8",
"@backstage/config": "0.1.15",
"@backstage/config-loader": "0.9.5",
"@backstage/errors": "0.2.2",
"@backstage/integration": "0.7.4",
"@backstage/search-common": "0.2.4",
"@backstage/techdocs-common": "0.11.9",
"@backstage/types": "0.1.3",
"@backstage/plugin-app-backend": "0.3.26",
"@backstage/plugin-auth-backend": "0.10.2",
"@backstage/plugin-auth-node": "0.1.2",
"@backstage/plugin-azure-devops-backend": "0.3.5",
"@backstage/plugin-azure-devops-common": "0.2.2",
"@backstage/plugin-badges-backend": "0.1.20",
"@backstage/plugin-catalog-backend": "0.21.5",
"@backstage/plugin-catalog-common": "0.1.4",
"@backstage/plugin-catalog-graphql": "0.3.3",
"@backstage/plugin-code-coverage-backend": "0.1.24",
"@backstage/plugin-graphql-backend": "0.1.16",
"@backstage/plugin-jenkins-backend": "0.1.15",
"@backstage/plugin-kafka-backend": "0.2.19",
"@backstage/plugin-kubernetes-backend": "0.4.9",
"@backstage/plugin-kubernetes-common": "0.2.4",
"@backstage/plugin-permission-backend": "0.5.1",
"@backstage/plugin-permission-common": "0.5.1",
"@backstage/plugin-permission-node": "0.5.1",
"@backstage/plugin-proxy-backend": "0.2.20",
"@backstage/plugin-rollbar-backend": "0.1.23",
"@backstage/plugin-scaffolder-backend": "0.16.1",
"@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.1",
"@backstage/plugin-scaffolder-backend-module-rails": "0.3.1",
"@backstage/plugin-scaffolder-common": "0.2.1",
"@backstage/plugin-search-backend": "0.4.4",
"@backstage/plugin-search-backend-module-elasticsearch": "0.0.10",
"@backstage/plugin-search-backend-module-pg": "0.2.8",
"@backstage/plugin-search-backend-node": "0.4.7",
"@backstage/plugin-tech-insights-backend": "0.2.6",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.10",
"@backstage/plugin-tech-insights-common": "0.2.3",
"@backstage/plugin-tech-insights-node": "0.2.4",
"@backstage/plugin-techdocs-backend": "0.13.5",
"@backstage/plugin-todo-backend": "0.1.23"
}
}
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/config-loader': patch
---
Include any files included in configuration via $include or $file directives when watching for configuration changes.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Deprecated `StaticLocationProcessor` which is unused and replaced by `ConfigLocationEntityProvider`.
+8
View File
@@ -0,0 +1,8 @@
---
'@backstage/plugin-scaffolder': patch
'@backstage/plugin-scaffolder-backend': patch
'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch
'@backstage/plugin-scaffolder-backend-module-rails': patch
---
Migrated over from the deprecated `spec.metadata` to `spec.templateInfo` for the `name` and the `baseUrl` of the template.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-github-deployments': patch
---
The removed `'github'` catalog location type no longer triggers a GitHub integration configuration lookup.
+17
View File
@@ -0,0 +1,17 @@
---
'@backstage/plugin-api-docs': minor
'@backstage/plugin-catalog': minor
'@backstage/plugin-circleci': minor
'@backstage/plugin-cloudbuild': minor
'@backstage/plugin-github-actions': minor
'@backstage/plugin-jenkins': minor
'@backstage/plugin-kafka': minor
'@backstage/plugin-kubernetes': minor
'@backstage/plugin-lighthouse': minor
'@backstage/plugin-org': minor
'@backstage/plugin-rollbar': minor
'@backstage/plugin-sonarqube': minor
'@backstage/plugin-techdocs': minor
---
**BREAKING**: Removed support for passing in an explicit `entity` prop to entity page extensions, which has been deprecated for a long time. This is only a breaking change at the TypeScript level, as this property was already ignored.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': minor
---
Made the `GitLabDiscoveryProcessor.updateLastActivity` method private, as it was accidentally exposed. It has also been fixed to properly operate in its own cache namespace to avoid collisions with other processors.
+6
View File
@@ -0,0 +1,6 @@
---
'@techdocs/cli': patch
'@backstage/techdocs-common': patch
---
Updated usage of `github:` location types in docs to use `url:` instead.
+19
View File
@@ -0,0 +1,19 @@
---
'@backstage/plugin-catalog-backend': minor
---
Updated all processors to implement `getProcessorName`.
**BREAKING**: The `CatalogProcessor` interface now require that the `CatalogProcessor` class implements `getProcessorName()`.
The processor name has previously defaulted processor class name. It's therefore _recommended_ to keep your return the same name as the class name if you did not implement this method previously.
For example:
```ts
class CustomProcessor implements CatalogProcessor {
getProcessorName() {
// Use the same name as the class name if this method was not previously implemented.
return 'CustomProcessor';
}
}
```
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-catalog-backend-module-ldap': patch
'@backstage/plugin-catalog-backend-module-msgraph': patch
---
Minor wording update
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
- **DEPRECATED** - `Status` has been deprecated in favour of `TaskStatus`
- **DEPRECATED** - `CompletedTaskState` has been deprecated in favour of `TaskCompletionState`
- **DEPRECATED** - `DispatchResult` has been deprecated in favour of `TaskBrokerDispatchResult`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': minor
---
**BREAKING**: Removed the old `plugin` export, use `catalogPlugin` instead.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/integration': patch
---
Fixed bug in integration package where Self Hosted GitLab instances with custom ports weren't supported (because of the lack of an option to add the port in the integration configs. Now users can add the port directly in the host)
+8
View File
@@ -0,0 +1,8 @@
---
'@backstage/catalog-client': patch
---
Added `CatalogApi.getEntityFacets`. Marking this as a breaking change since it
is a non-optional addition to the API and depends on the backend being in place.
If you are mocking this interface in your tests, you will need to add an extra
`getEntityFacets: jest.fn()` or similar to that interface.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-catalog-backend-module-ldap': patch
'@backstage/plugin-catalog-backend-module-msgraph': patch
'@backstage/plugin-scaffolder-backend': patch
---
Implemented required `getProcessorName` method for catalog processor.
+28
View File
@@ -0,0 +1,28 @@
---
'@backstage/create-app': patch
---
To reflect the updated `knex` and `@vscode/sqlite3` dependencies introduced with [v0.4.19](https://github.com/backstage/backstage/blob/master/packages/create-app/CHANGELOG.md#0419), we update our example `Dockerfile`, adding `@vscode/sqlite3` build dependencies to the image. Further on, we updated it to the `node:16-bullseye-slim` base image.
To apply this update to an existing app, make the following change to `packages/backend/Dockerfile`:
```diff
-FROM node:14-buster-slim
+FROM node:16-bullseye-slim
```
and, _only if you are using sqlite3 in your app_:
```diff
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
+
+# install sqlite3 dependencies
+RUN apt-get update && \
+ apt-get install -y libsqlite3-dev python3 cmake g++ && \
+ rm -rf /var/lib/apt/lists/* && \
+ yarn config set python /usr/bin/python3
RUN yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)"
```
If you are using a multi-stage Docker build for your app, please refer to the [updated examples](https://github.com/backstage/backstage/blob/master/docs/deployment/docker.md#multi-stage-build) in the documentation.
+1
View File
@@ -17,6 +17,7 @@ autoscaling
Autoscaling
autoselect
Avro
aws
backrub
backported
backporting
@@ -1,57 +0,0 @@
name: Automate TechDocs project board
# Development of TechDocs in Backstage is managed by this Kanban board - https://github.com/orgs/backstage/projects/1
# New issues and PRs with TechDocs in their title or docs-like-code label will be added to the board.
# Caveat: New PRs created from forks will not be added since GitHub Actions don't share credentials with forks.
on:
issues:
types: [opened, reopened, labeled, edited]
pull_request:
types: [opened, reopened, labeled, edited]
jobs:
assign_issue_or_pr_to_project:
runs-on: ubuntu-latest
name: Triage
env:
MY_GITHUB_TOKEN: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }}
steps:
- name: Assign new issue to Incoming based on its title.
uses: srggrs/assign-one-project-github-action@1.2.0
if: |
env.MY_GITHUB_TOKEN != null &&
contains(github.event.issue.title, 'TechDocs') ||
contains(github.event.issue.title, 'techdocs') ||
contains(github.event.issue.title, 'Techdocs')
with:
project: 'https://github.com/orgs/backstage/projects/1'
column_name: 'Incoming'
- name: Assign new issue to Incoming based on its label.
uses: srggrs/assign-one-project-github-action@1.2.0
if: |
env.MY_GITHUB_TOKEN != null &&
contains(github.event.issue.labels.*.name, 'docs-like-code')
with:
project: 'https://github.com/orgs/backstage/projects/1'
column_name: 'Incoming'
- name: Assign new PR to Incoming based on its title.
uses: srggrs/assign-one-project-github-action@1.2.0
if: |
env.MY_GITHUB_TOKEN != null &&
contains(github.event.pull_request.title, 'TechDocs') ||
contains(github.event.pull_request.title, 'techdocs') ||
contains(github.event.pull_request.title, 'Techdocs')
with:
project: 'https://github.com/orgs/backstage/projects/1'
column_name: 'Incoming'
- name: Assign new PR to Incoming based on its label.
uses: srggrs/assign-one-project-github-action@1.2.0
if: |
env.MY_GITHUB_TOKEN != null &&
contains(github.event.pull_request.labels.*.name, 'docs-like-code')
with:
project: 'https://github.com/orgs/backstage/projects/1'
column_name: 'Incoming'
+1 -1
View File
@@ -189,7 +189,7 @@ jobs:
run: yarn tsc:full
- name: build packages
run: yarn lerna -- run --ignore example-app build
run: yarn lerna -- run --ignore example-app --ignore example-backend build
# Publishes current version of packages that are not already present in the registry
- name: publish
+96 -94
View File
@@ -1,94 +1,96 @@
| Organization | Contact | Description of Use |
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Spotify](https://www.spotify.com) | [@leemills83](https://github.com/leemills83) | Main interface towards all of Spotify's infrastructure and technical documentation. |
| [bol.com](https://www.bol.com) | [@sagacity](https://github.com/sagacity) | Initial work being done to unify platform tooling. |
| [DFDS](https://www.dfds.com) | [@carlsendk](https://github.com/carlsendk) | V2 self-service platform. |
| [Roadie](https://roadie.io) | [@dtuite](https://github.com/dtuite) | Hosted, managed Backstage with easy set-up |
| [Roku](https://www.roku.com) | [@timurista](https://github.com/timurista) | Initial work on Cloud engineering service platform. |
| [SDA SE](https://sda.se) | [@dschwank](https://github.com/dschwank), [@iammnils](https://github.com/iammnils) | Central place for developing and sharing services in our insurance ecosystem. |
| [H-E-B](https://www.heb.com) | [@german-j-rodriguez](https://github.com/german-j-rodriguez) | Initial work on Engineering Portal service platform. |
| [American Airlines](https://www.aa.com) | [@paulpach](https://github.com/paulpach) | Central place for developers to develop and maintain applications |
| [Kiwi.com](https://kiwi.com) | [@aexvir](https://github.com/aexvir) | Replacing the frontend of [The Zoo](https://github.com/kiwicom/the-zoo), their service registry. |
| [Voi](https://www.voiscooters.com/) | [@K-Phoen](https://github.com/K-Phoen) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
| [Talkdesk](https://www.talkdesk.com) | [@jaime-talkdesk](https://github.com/jaime-talkdesk) | Initial work for Engineering Portal and Self Provisioning to R&D |
| [Wealthsimple](https://www.wealthsimple.com) | [@andrewthauer](https://github.com/andrewthauer) | Developer portal, service catalog, documentation and tooling |
| [Grab](https://www.grab.com) | [@althafh](https://github.com/althafh) | Initial work as a unified interface for all of Grab's internal tooling |
| [Telenor Sweden](https://www.telenor.se) | [@O5ten](https://github.com/O5ten) | Building a developer portal for scaffolding projects towards our unified build environment and microservice stacks |
| [Fiverr](https://www.fiverr.com) | [@nirga](https://github.com/nirga) | Unifying separate tools that developers are using today (i.e. monitoring, dead letter queues management, etc.) into a single platform. |
| [Zalando SE](https://www.zalando.de) | [@leviferreira](https://github.com/leviferreira) | Building V2 of the Internal Development Portal. |
| [LegalZoom](https://legalzoom.com) | [@backjo](https://github.com/backjo) | Developer portal - hub for all engineering projects and metadata. |
| [Expedia Group](https://www.expediagroup.com) | [Mike Turner](mailto:miturner@expediagroup.com), [Sneha Kumar](mailto:snkumar@expediagroup.com), [@guillermomanzo](https://github.com/guillermomanzo), [Erik Lindgren](https://github.com/lindgren) | EG Common Developer Toolkit |
| [Paddle.com](https://paddle.com) | [Ioannis Georgoulas](https://github.com/geototti21) | Developer portal (Tech Docs, Service Catalog, Internal Tooling), we use vanilla Backstage FE and custom BE implementation in Go |
| [Acast.com](https://acast.com) | [Olle Lundberg](https://github.com/lndbrg) | Developer portal with tech docs, service catalog and a bunch of other internal tooling |
| [Lunar](https://lunar.app) | [Jacob Valdemar](https://github.com/JacobValdemar) | Internal developer portal for service overview and insights, API documentation, technical guides, onboarding guides and RFC's. |
| [Trendyol](https://trendyol.com) | [Gamze Senturk](https://github.com/gmzsenturk), [Mert Can Bilgic](https://github.com/mertcb) | The Developer Portal has been called `Pandora`. Provides an overview of Trendyol tech ecosystem. TechDocs, Catalog, Custom Plugins and Theme. |
| [Peloton](https://www.onepeloton.com/) | [Jim Haughwout](https://github.com/JimHaughwout) | Creating our first developer portal and tech-docs. Exploring Service Catalog, Tech Insights and Cost Insights as well. |
| [TELUS](https://telus.com) | [Seb Barre](https://github.com/sbarre) | The Go-to place to find answers about development and delivery at TELUS. |
| [Brex](https://www.brex.com/) | [Vamsi Chitters](https://github.com/vamsikc) | A centralized UI to understand how a service fits in the whole Brex architecture and manage a teams engineering dependencies. |
| [Oriflame](https://www.oriflame.com/) | [Oriflame](https://github.com/oriflame) | Internal developer portal for services, single page apps and packages overview, API documentation, technical guides, tech-radar and more. |
| [Booz Allen Hamilton](https://www.boozallen.com/) | [Jason Miller](https://github.com/JasonMiller-BAH) | Developer portal for a full-stack software development ecosystem that accelerates consistent and repeatable Modern Software Development practices for internal innovation and investments. |
| [Netflix](https://www.netflix.com/) | [bleathem](https://github.com/bleathem) | Our Backstage implementation will be the front door to a unified experience connecting our internal platform products across important workflows with integrated knowledge and support. |
| [b.well](https://www.icanbwell.com/) | [Jacob Rosales](https://github.com/jrosales) | Foundation for our engineering portal and cloud insights. |
| [PagerDuty](https://www.pagerduty.com/) | [Mark Shaw](https://github.com/markshawtoronto) | Developer portal, initially focused on software templates and tech-docs. |
| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑‍🚀 |
| [FundApps](https://www.fundapps.co/) | [Elliot Greenwood](https://github.com/egnwd) | Developer Portal - A place for us to keep track of our projects and documentation for all services and processes |
| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). |
| [HelloFresh](https://www.hellofresh.de/) | [@iammuho](https://github.com/iammuho), [@ElenaForester](https://github.com/ElenaForester), [@diegomarangoni](https://github.com/diegomarangoni) | Our developer portal at HelloFresh - Spread across an organisation of 500+ engineers globally. |
| [FactSet](https://www.factset.com/) | [@kuangp](https://github.com/kuangp) | Developer portal to provide discoverability to all internal components, APIs, documentation, and scaffold templates with integrations to our internal infrastructure tools. |
| [Workrise](https://www.workrise.com/) | [Michael Rode](https://github.com/michaelrode) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
| [RedVentures](https://www.redventures.com/) | [Chris Diaz](https://github.com/codingdiaz) | Developer portal that brings everything an engineer needs to provide value into a single pane of glass. |
| [MavTek](https://www.mavtek.com/) | [@fgascon](https://github.com/fgascon) | Developer portal focused on standardizing practices, centralizing documentation and streamlining developer practices. |
| [QuintoAndar](https://www.quintoandar.com.br/) | [@quintoandar](https://github.com/quintoandar) | Developer portal, services catalog and centralization of service metrics. |
| [empathy.co](https://empathy.co/) | [@guillermotti](https://github.com/guillermotti) | Developer portal for tech docs, service catalog, plugin discovery and much more. |
| [creditas.com](https://creditas.com/) | [@aureliosaraiva](https://github.com/aureliosaraiva) [@Creditas](https://github.com/creditas) | Centralization of all services, standards, documentation, etc. We started the deployment process. |
| [Prisjakt](https://www.prisjakt.nu) / [PriceSpy](https://pricespy.co.uk) | [@kennylindahl](https://github.com/kennylindahl) | Internal developer portal - Documentation, scaffolding, software catalog, TechRadar, Gitlab org data integration |
| [Powerspike](https://powerspike.tv/) | [@trelore](https://github.com/trelore) | Developer portal for documentation of core libraries and repositories. |
| [2U](https://2u.com) | [Andrew Thal](https://github.com/athal7) | Development team home-base, promoting service discoverability, resource dependencies, and tech radar |
| [Taxfix](https://taxfix.de/) | [Sami Ur Rehman](https://github.com/samiurrehman92) | Developer's portal with software catalog at it's core. Hosts API Specs, Tech Docs, Tech Radar and some custom plugins. |
| [Busuu](https://busuu.com/) | [Adam Tester](https://github.com/adamtester) | Developer portal with service catalog, API docs, Event docs, service templating, and cost insights. |
| [Loadsmart](https://loadsmart.com/) | [Loadsmart](https://github.com/loadsmart) | Improve services visibility and operations for service owners and developers. |
| [Monzo](https://monzo.com/) | [@WillSewell](https://github.com/WillSewell), [@joechrisellis](https://github.com/joechrisellis) | Developer portal showing metadata and docs for over 2000 microservices. We have built a number of plugins such as a UI for our system to measure [software excellence](https://monzo.com/blog/2021/09/15/how-we-measure-software-excellence), and a UI to show deployment and config change events. |
| [Vaimo](https://www.vaimo.com) | [@vaimo-magnus](https://github.com/vaimo-magnus) | Developer Portal for our developers at Vaimo, currently docs and self-service towards our internal PaaS based on k8s. Plans to extend the catalog into Projects, Environments etc |
| [Wayfair](https://www.wayfair.com) | [@fransan](https://github.com/fransan), [@errskipower](https://github.com/errskipower), [@hrrs](https://github.com/hrrs) | Developer portal for service catalog, technical documentation, and APIs. |
| [CircleHD](https://www.circlehd.com) | [@circlehddev](https://github.com/circlehddev) | Developer Portal for internal dev team across the globe |
| [CastDesk](https://castdesk.com) | [@circlehddev](https://github.com/circlehddev) | Developer Portal for internal dev team across the globe |
| [Santagostino](https://santagostino.it) | [@santagostino](https://github.com/santagostino) | Developer portal, gateway to our infrastructure, documentation, service catalog and internal tooling. |
| [Peak](https://peak.ai) | [Luke Beamish](https://github.com/lukebeamish-peak) | Developer portal for all internal engineers to access documentation and tooling. |
| [Gelato](https://gelato.com/) | [Dmitry Makarenko](https://github.com/dmitry-makarenko-gelato) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal and third-party systems🚀. |
| [GoCardless](https://gocardless.com/) | [James Turley](https://github.com/tragiclifestories) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal systems. |
| [Box](https://www.box.com) | [@kielosz](https://github.com/kielosz), [@jluk-box](https://github.com/jluk-box), [@ptychu](https://github.com/ptychu), [@alexrybch](https://github.com/alexrybch), [@szubster](https://github.com/szubster) | Developer portal for service catalog, integration with internal systems, new service onboarding. |
| [Bazaarvoice](https://www.bazaarvoice.com) | [@niallmccullagh](https://github.com/niallmccullagh) | Developer portal for service catalog and scaffolds, publishing Github docs and API documentation, visualising our internal tech radar and our product engineering org structure. |
| [Krateo PlatformOps](https://www.krateo.io) | [@projectkerberus](https://github.com/projectkerberus) | A multi-cloud control plane to create, manage and deploy any kind of resource easily and centrally via a Developer Portal that centralizes via a self-service catalog the templating and ownership of services, the available documentation, the overview of the components that compose an entire domain and all the data of the service lifecycle. |
| [Adevinta](https://www.adevinta.com) | [Ray Sinnema](https://github.com/RemonSinnema) | Showcase shared services to our internal customers. |
| [Splunk](https://www.splunk.com) | [@tonytamsf](https://github.com/tonytamsf) | Developer portal as a centralized place to find people, services, documentation, escalation policies and give bravos. This portal is also being used as a centralized search engine for engineering specific documentation. |
| [SoundCloud](https://www.soundcloud.com) | [Julio Zynger](https://github.com/julioz) | Developer portal as a [humane registry](https://martinfowler.com/bliki/HumaneRegistry.html) for the organization: catalog of people, services, documentation, feature toggles, escalation policies, etc. |
| [Volvofinans Bank](https://www.volvofinans.se) | [Johan Hammar](https://github.com/johanhammar) | Developer portal enabling engineers to manage and explore software and documentation. |
| [Palo Alto Networks](https://www.paloaltonetworks.com) | [Jeremy Guarini](https://github.com/jeremyguarini), [Brian Lomeland](https://github.com/bbbmmmlll), [Palo Alto Networks](https://github.com/PaloAltoNetworks) | Developer portal, service catalog, documentation and tooling |
| [Signal Iduna Group](https://www.signal-iduna.de/) | [Jonas Thomsen](https://github.com/JoThomsen) | Developer Portal, documentation, monitoring, service catalog for our insurance ecosystem |
| [Tradeshift](https://www.tradeshift.com/) | [Soren Mathiasen](https://github.com/sorenmat) | Developer Portal: documentation, monitoring, service templates, service catalog for our micro services |
| [Unity](https://unity.com) | [Ted Cordery](https://github.com/TeddyBallGame) | A centralized service catalog with documentation for our service engineers. |
| [PicPay](https://www.picpay.com) | [Luis Baroni](https://github.com/lcsbaroni), [Renata Poluceno](https://github.com/renatapoluceno), [PicPay](https://github.com/picpay) | Developer portal for building services throught templates, service catalog with ownership of services, documentation and metrics providing autonomy and visibility for all. |
| [Epic Games](https://www.epicgames.com) | [Brian Jung](https://github.com/brian-at-epic), [Jeff Goldian](https://github.com/jeffgoldian-Epic) | Developer Portal: Service Catalog, Documentation, Software Templates and more making our internal teams' lives easier! |
| [Globo](https://globo.com) | [Carlos Gusmão](https://github.com/caeugusmao), [Guilherme Vierno](https://github.com/vierno), [Denis Aoki](https://github.com/dnsaoki2), [Maycon Dionisio](https://github.com/MayconDionisio), | Reduce the friction of accessing the information engineers need about Globo's digital services through a coherent and centralized experience. |
| [QBE](https://www.qbe.com/) | [Daniel Steel](https://github.com/danielsteelqbe), [Pete Jespers](https://github.com/petejespersqbe) | Developer portal allowing our global teams to explore and create applications, documentation and cloud infrastructure easily and quickly 🚀 |
| [GoTo](https://www.goto.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 |
| [IKEA IT AB](https://www.ingka.com) | [@bjornramberg](https://github.com/bjornramberg), [@supriyachitale](https://github.com/supriyachitale) | Supporting engineers at scale with self serve access and connecting the dots of our engineering platform and services, enabling product teams to move faster and go further, and unleashing innovation, reuse and co-creation across the organisation. |
| [Invitae](https://www.invitae.com/en) | [@ryan-hanchett](https://github.com/ryan-hanchett), [@gmandler42](https://github.com/gmandler42) | Centralized Developer Experience portal, putting all of our tooling behind a single pane of glass and creating a living service catalog. |
| [Fortum](https://www.fortum.com/) | [@brunoamaroalmeida](https://github.com/brunoamaroalmeida), [@dhaval-vithalani](https://github.com/dhaval-vithalani), [@sunilkumarmohanty](https://github.com/sunilkumarmohanty) | A central portal containing information about our applications, services, processes and other software assets to be used by Fortum software engineering community. |
| Organization | Contact | Description of Use |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Spotify](https://www.spotify.com) | [@leemills83](https://github.com/leemills83) | Main interface towards all of Spotify's infrastructure and technical documentation. |
| [bol.com](https://www.bol.com) | [@sagacity](https://github.com/sagacity) | Initial work being done to unify platform tooling. |
| [DFDS](https://www.dfds.com) | [@carlsendk](https://github.com/carlsendk) | V2 self-service platform. |
| [Roadie](https://roadie.io) | [@dtuite](https://github.com/dtuite) | Hosted, managed Backstage with easy set-up |
| [Roku](https://www.roku.com) | [@timurista](https://github.com/timurista) | Initial work on Cloud engineering service platform. |
| [SDA SE](https://sda.se) | [@dschwank](https://github.com/dschwank), [@iammnils](https://github.com/iammnils) | Central place for developing and sharing services in our insurance ecosystem. |
| [H-E-B](https://www.heb.com) | [@german-j-rodriguez](https://github.com/german-j-rodriguez) | Initial work on Engineering Portal service platform. |
| [American Airlines](https://www.aa.com) | [@paulpach](https://github.com/paulpach) | Central place for developers to develop and maintain applications |
| [Kiwi.com](https://kiwi.com) | [@aexvir](https://github.com/aexvir) | Replacing the frontend of [The Zoo](https://github.com/kiwicom/the-zoo), their service registry. |
| [Voi](https://www.voiscooters.com/) | [@K-Phoen](https://github.com/K-Phoen) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
| [Talkdesk](https://www.talkdesk.com) | [@jaime-talkdesk](https://github.com/jaime-talkdesk) | Initial work for Engineering Portal and Self Provisioning to R&D |
| [Wealthsimple](https://www.wealthsimple.com) | [@andrewthauer](https://github.com/andrewthauer) | Developer portal, service catalog, documentation and tooling |
| [Grab](https://www.grab.com) | [@althafh](https://github.com/althafh) | Initial work as a unified interface for all of Grab's internal tooling |
| [Telenor Sweden](https://www.telenor.se) | [@O5ten](https://github.com/O5ten) | Building a developer portal for scaffolding projects towards our unified build environment and microservice stacks |
| [Fiverr](https://www.fiverr.com) | [@nirga](https://github.com/nirga) | Unifying separate tools that developers are using today (i.e. monitoring, dead letter queues management, etc.) into a single platform. |
| [Zalando SE](https://www.zalando.de) | [@leviferreira](https://github.com/leviferreira) | Building V2 of the Internal Development Portal. |
| [LegalZoom](https://legalzoom.com) | [@backjo](https://github.com/backjo) | Developer portal - hub for all engineering projects and metadata. |
| [Expedia Group](https://www.expediagroup.com) | [Mike Turner](mailto:miturner@expediagroup.com), [Sneha Kumar](mailto:snkumar@expediagroup.com), [@guillermomanzo](https://github.com/guillermomanzo), [Erik Lindgren](https://github.com/lindgren) | EG Common Developer Toolkit |
| [Paddle.com](https://paddle.com) | [Ioannis Georgoulas](https://github.com/geototti21) | Developer portal (Tech Docs, Service Catalog, Internal Tooling), we use vanilla Backstage FE and custom BE implementation in Go |
| [Acast.com](https://acast.com) | [Olle Lundberg](https://github.com/lndbrg) | Developer portal with tech docs, service catalog and a bunch of other internal tooling |
| [Lunar](https://lunar.app) | [Jacob Valdemar](https://github.com/JacobValdemar) | Internal developer portal for service overview and insights, API documentation, technical guides, onboarding guides and RFC's. |
| [Trendyol](https://trendyol.com) | [Gamze Senturk](https://github.com/gmzsenturk), [Mert Can Bilgic](https://github.com/mertcb) | The Developer Portal has been called `Pandora`. Provides an overview of Trendyol tech ecosystem. TechDocs, Catalog, Custom Plugins and Theme. |
| [Peloton](https://www.onepeloton.com/) | [Jim Haughwout](https://github.com/JimHaughwout) | Creating our first developer portal and tech-docs. Exploring Service Catalog, Tech Insights and Cost Insights as well. |
| [TELUS](https://telus.com) | [Seb Barre](https://github.com/sbarre) | The Go-to place to find answers about development and delivery at TELUS. |
| [Brex](https://www.brex.com/) | [Vamsi Chitters](https://github.com/vamsikc) | A centralized UI to understand how a service fits in the whole Brex architecture and manage a teams engineering dependencies. |
| [Oriflame](https://www.oriflame.com/) | [Oriflame](https://github.com/oriflame) | Internal developer portal for services, single page apps and packages overview, API documentation, technical guides, tech-radar and more. |
| [Booz Allen Hamilton](https://www.boozallen.com/) | [Jason Miller](https://github.com/JasonMiller-BAH) | Developer portal for a full-stack software development ecosystem that accelerates consistent and repeatable Modern Software Development practices for internal innovation and investments. |
| [Netflix](https://www.netflix.com/) | [bleathem](https://github.com/bleathem) | Our Backstage implementation will be the front door to a unified experience connecting our internal platform products across important workflows with integrated knowledge and support. |
| [b.well](https://www.icanbwell.com/) | [Jacob Rosales](https://github.com/jrosales) | Foundation for our engineering portal and cloud insights. |
| [PagerDuty](https://www.pagerduty.com/) | [Mark Shaw](https://github.com/markshawtoronto) | Developer portal, initially focused on software templates and tech-docs. |
| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑‍🚀 |
| [FundApps](https://www.fundapps.co/) | [Elliot Greenwood](https://github.com/egnwd) | Developer Portal - A place for us to keep track of our projects and documentation for all services and processes |
| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). |
| [HelloFresh](https://www.hellofresh.de/) | [@iammuho](https://github.com/iammuho), [@ElenaForester](https://github.com/ElenaForester), [@diegomarangoni](https://github.com/diegomarangoni) | Our developer portal at HelloFresh - Spread across an organisation of 500+ engineers globally. |
| [FactSet](https://www.factset.com/) | [@kuangp](https://github.com/kuangp) | Developer portal to provide discoverability to all internal components, APIs, documentation, and scaffold templates with integrations to our internal infrastructure tools. |
| [Workrise](https://www.workrise.com/) | [Michael Rode](https://github.com/michaelrode) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
| [RedVentures](https://www.redventures.com/) | [Chris Diaz](https://github.com/codingdiaz) | Developer portal that brings everything an engineer needs to provide value into a single pane of glass. |
| [MavTek](https://www.mavtek.com/) | [@fgascon](https://github.com/fgascon) | Developer portal focused on standardizing practices, centralizing documentation and streamlining developer practices. |
| [QuintoAndar](https://www.quintoandar.com.br/) | [@quintoandar](https://github.com/quintoandar) | Developer portal, services catalog and centralization of service metrics. |
| [empathy.co](https://empathy.co/) | [@guillermotti](https://github.com/guillermotti) | Developer portal for tech docs, service catalog, plugin discovery and much more. |
| [creditas.com](https://creditas.com/) | [@aureliosaraiva](https://github.com/aureliosaraiva) [@Creditas](https://github.com/creditas) | Centralization of all services, standards, documentation, etc. We started the deployment process. |
| [Prisjakt](https://www.prisjakt.nu) / [PriceSpy](https://pricespy.co.uk) | [@kennylindahl](https://github.com/kennylindahl) | Internal developer portal - Documentation, scaffolding, software catalog, TechRadar, Gitlab org data integration |
| [Powerspike](https://powerspike.tv/) | [@trelore](https://github.com/trelore) | Developer portal for documentation of core libraries and repositories. |
| [2U](https://2u.com) | [Andrew Thal](https://github.com/athal7) | Development team home-base, promoting service discoverability, resource dependencies, and tech radar |
| [Taxfix](https://taxfix.de/) | [Sami Ur Rehman](https://github.com/samiurrehman92) | Developer's portal with software catalog at it's core. Hosts API Specs, Tech Docs, Tech Radar and some custom plugins. |
| [Busuu](https://busuu.com/) | [Adam Tester](https://github.com/adamtester) | Developer portal with service catalog, API docs, Event docs, service templating, and cost insights. |
| [Loadsmart](https://loadsmart.com/) | [Loadsmart](https://github.com/loadsmart) | Improve services visibility and operations for service owners and developers. |
| [Monzo](https://monzo.com/) | [@WillSewell](https://github.com/WillSewell), [@joechrisellis](https://github.com/joechrisellis) | Developer portal showing metadata and docs for over 2000 microservices. We have built a number of plugins such as a UI for our system to measure [software excellence](https://monzo.com/blog/2021/09/15/how-we-measure-software-excellence), and a UI to show deployment and config change events. |
| [Vaimo](https://www.vaimo.com) | [@vaimo-magnus](https://github.com/vaimo-magnus) | Developer Portal for our developers at Vaimo, currently docs and self-service towards our internal PaaS based on k8s. Plans to extend the catalog into Projects, Environments etc |
| [Wayfair](https://www.wayfair.com) | [@fransan](https://github.com/fransan), [@errskipower](https://github.com/errskipower), [@hrrs](https://github.com/hrrs) | Developer portal for service catalog, technical documentation, and APIs. |
| [CircleHD](https://www.circlehd.com) | [@circlehddev](https://github.com/circlehddev) | Developer Portal for internal dev team across the globe |
| [CastDesk](https://castdesk.com) | [@circlehddev](https://github.com/circlehddev) | Developer Portal for internal dev team across the globe |
| [Santagostino](https://santagostino.it) | [@santagostino](https://github.com/santagostino) | Developer portal, gateway to our infrastructure, documentation, service catalog and internal tooling. |
| [Peak](https://peak.ai) | [Luke Beamish](https://github.com/lukebeamish-peak) | Developer portal for all internal engineers to access documentation and tooling. |
| [Gelato](https://gelato.com/) | [Dmitry Makarenko](https://github.com/dmitry-makarenko-gelato) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal and third-party systems🚀. |
| [GoCardless](https://gocardless.com/) | [James Turley](https://github.com/tragiclifestories) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal systems. |
| [Box](https://www.box.com) | [@kielosz](https://github.com/kielosz), [@jluk-box](https://github.com/jluk-box), [@ptychu](https://github.com/ptychu), [@alexrybch](https://github.com/alexrybch), [@szubster](https://github.com/szubster) | Developer portal for service catalog, integration with internal systems, new service onboarding. |
| [Bazaarvoice](https://www.bazaarvoice.com) | [@niallmccullagh](https://github.com/niallmccullagh) | Developer portal for service catalog and scaffolds, publishing Github docs and API documentation, visualising our internal tech radar and our product engineering org structure. |
| [Krateo PlatformOps](https://www.krateo.io) | [@projectkerberus](https://github.com/projectkerberus) | A multi-cloud control plane to create, manage and deploy any kind of resource easily and centrally via a Developer Portal that centralizes via a self-service catalog the templating and ownership of services, the available documentation, the overview of the components that compose an entire domain and all the data of the service lifecycle. |
| [Adevinta](https://www.adevinta.com) | [Ray Sinnema](https://github.com/RemonSinnema) | Showcase shared services to our internal customers. |
| [Splunk](https://www.splunk.com) | [@tonytamsf](https://github.com/tonytamsf) | Developer portal as a centralized place to find people, services, documentation, escalation policies and give bravos. This portal is also being used as a centralized search engine for engineering specific documentation. |
| [SoundCloud](https://www.soundcloud.com) | [Julio Zynger](https://github.com/julioz) | Developer portal as a [humane registry](https://martinfowler.com/bliki/HumaneRegistry.html) for the organization: catalog of people, services, documentation, feature toggles, escalation policies, etc. |
| [Volvofinans Bank](https://www.volvofinans.se) | [Johan Hammar](https://github.com/johanhammar) | Developer portal enabling engineers to manage and explore software and documentation. |
| [Palo Alto Networks](https://www.paloaltonetworks.com) | [Jeremy Guarini](https://github.com/jeremyguarini), [Brian Lomeland](https://github.com/bbbmmmlll), [Palo Alto Networks](https://github.com/PaloAltoNetworks) | Developer portal, service catalog, documentation and tooling |
| [Signal Iduna Group](https://www.signal-iduna.de/) | [Jonas Thomsen](https://github.com/JoThomsen) | Developer Portal, documentation, monitoring, service catalog for our insurance ecosystem |
| [Tradeshift](https://www.tradeshift.com/) | [Soren Mathiasen](https://github.com/sorenmat) | Developer Portal: documentation, monitoring, service templates, service catalog for our micro services |
| [Unity](https://unity.com) | [Ted Cordery](https://github.com/TeddyBallGame) | A centralized service catalog with documentation for our service engineers. |
| [PicPay](https://www.picpay.com) | [Luis Baroni](https://github.com/lcsbaroni), [Renata Poluceno](https://github.com/renatapoluceno), [PicPay](https://github.com/picpay) | Developer portal for building services throught templates, service catalog with ownership of services, documentation and metrics providing autonomy and visibility for all. |
| [Epic Games](https://www.epicgames.com) | [Brian Jung](https://github.com/brian-at-epic), [Jeff Goldian](https://github.com/jeffgoldian-Epic) | Developer Portal: Service Catalog, Documentation, Software Templates and more making our internal teams' lives easier! |
| [Globo](https://globo.com) | [Carlos Gusmão](https://github.com/caeugusmao), [Guilherme Vierno](https://github.com/vierno), [Denis Aoki](https://github.com/dnsaoki2), [Maycon Dionisio](https://github.com/MayconDionisio), | Reduce the friction of accessing the information engineers need about Globo's digital services through a coherent and centralized experience. |
| [QBE](https://www.qbe.com/) | [Daniel Steel](https://github.com/danielsteelqbe), [Pete Jespers](https://github.com/petejespersqbe) | Developer portal allowing our global teams to explore and create applications, documentation and cloud infrastructure easily and quickly 🚀 |
| [GoTo](https://www.goto.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) | "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 |
| [IKEA IT AB](https://www.ingka.com) | [@bjornramberg](https://github.com/bjornramberg), [@supriyachitale](https://github.com/supriyachitale) | Supporting engineers at scale with self serve access and connecting the dots of our engineering platform and services, enabling product teams to move faster and go further, and unleashing innovation, reuse and co-creation across the organisation. |
| [Invitae](https://www.invitae.com/en) | [@ryan-hanchett](https://github.com/ryan-hanchett), [@gmandler42](https://github.com/gmandler42) | Centralized Developer Experience portal, putting all of our tooling behind a single pane of glass and creating a living service catalog. |
| [Fortum](https://www.fortum.com/) | [@brunoamaroalmeida](https://github.com/brunoamaroalmeida), [@dhaval-vithalani](https://github.com/dhaval-vithalani), [@sunilkumarmohanty](https://github.com/sunilkumarmohanty) | A central portal containing information about our applications, services, processes and other software assets to be used by Fortum software engineering community. |
| [Procore](https://www.procore.com/jobs/engineering) | [@shayon](https://github.com/Shayon), [@jamesdabbs-procore](https://github.com/jamesdabbs-procore) | Developer portal - centralized software catalog and templates to enable self serve and reduce cognitive load. |
| [Bradesco](https://banco.bradesco/html/classic/sobre/index.shtm) | [@danilosoarescardoso](https://github.com/danilosoarescardoso) | Centralized developer portal with software catalog, software templates, techdocs and some plugins from community and by our own. |
+3
View File
@@ -464,3 +464,6 @@ apacheAirflow:
gocd:
baseUrl: https://your.gocd.instance.com
airbrake:
apiKey: ${AIRBRAKE_API_KEY}
@@ -15,7 +15,6 @@ metadata:
{{- if .Values.issuer.email }}
cert-manager.io/cluster-issuer: {{ .Values.issuer.clusterIssuer }}
{{- end }}
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($scheme = https) {
+8 -2
View File
@@ -9,7 +9,8 @@ WORKDIR /tmp
# update package sources
# `--virtual` is used to enable removal of these dependencies as a named group
# - python: required by node-gyp
# - python3: required by node-gyp
# - g++: required to build @vscode/sqlite3
# - pixman: required by node-canvas
# - pkgconfig: required by pixman
# --------------------------------------------
@@ -32,7 +33,8 @@ WORKDIR /tmp
RUN apk update \
&& apk add --no-cache \
--virtual ${APK_VIRTUAL_NAME} \
python \
python3 \
g++ \
pixman \
pkgconfig \
alpine-sdk \
@@ -51,6 +53,10 @@ RUN wget -qO- ${VALE_INSTALL_URL} \
| tar xvz -C /bin vale \
&& chmod +x /bin/vale
# needed for sqlite3 build that needs python
RUN ln -s /usr/bin/python3 /usr/bin/python && \
ln -s /usr/bin/pip3 /usr/bin/pip
RUN mkdir /app
WORKDIR /app
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

+34 -14
View File
@@ -56,18 +56,15 @@ allows a single auth backend to serve multiple environments, such as running a
local frontend against a deployed backend. The provider configuration matching
the local `auth.environment` setting will be selected.
### Adding the provider to the sign-in page
## Using an authentication provider for sign-in
After configuring an authentication provider, the `app` frontend package needs a
small update to show this provider as a login option. The `SignInPage` component
handles this, and takes either a `provider` or `providers` (array) prop of
`SignInProviderConfig` definitions.
If you want to use an authentication provider for sign-in, as opposed to just accessing external resources, you'll need to configure that in your app as well. This is done by providing a custom `SignInPage` component to the app, which will require the user to sign in before they can access the app. Note that this does not block access to the app, which you can read more about [here](./using-auth.md).
These reference the `ApiRef` exported by the provider. Again, an example using
GitHub that can be adapted to any of the built-in providers:
If you want to, you can use the `SignInPage` component that is provided by `@backstage/core-components`, which takes either a `provider` or `providers` (array) prop of `SignInProviderConfig` definitions. These reference the `ApiRef` exported for the provider.
Again, the following example for GitHub shows the additions needed to `packages/app/src/App.tsx`, and can be adapted to any of the built-in providers:
```diff
# packages/app/src/App.tsx
+ import { githubAuthApiRef } from '@backstage/core-plugin-api';
+ import { SignInProviderConfig, SignInPage } from '@backstage/core-components';
@@ -78,8 +75,8 @@ GitHub that can be adapted to any of the built-in providers:
+ apiRef: githubAuthApiRef,
+};
+
const app = createApp({
apis,
const app = createApp({
apis,
+ components: {
+ SignInPage: props => (
+ <SignInPage
@@ -89,15 +86,15 @@ const app = createApp({
+ />
+ ),
+ },
bindRoutes({ bind }) {
bindRoutes({ bind }) {
```
To also allow unauthenticated guest access, use the `providers` prop for
`SignInPage`:
```diff
const app = createApp({
apis,
const app = createApp({
apis,
+ components: {
+ SignInPage: props => (
+ <SignInPage
@@ -106,7 +103,7 @@ const app = createApp({
+ />
+ ),
+ },
bindRoutes({ bind }) {
bindRoutes({ bind }) {
```
## Adding a custom authentication provider
@@ -119,3 +116,26 @@ Backstage uses [Passport](http://www.passportjs.org/) under the hood, which has
a wide library of authentication strategies for different providers. See
[Add authentication provider](add-auth-provider.md) for details on adding a new
Passport-supported authentication method.
## Custom ScmAuthApi Implementation
If you are using any custom authentication providers, like for example one for GitHub Enterprise, then you are likely to need a custom implementation of the [`ScmAuthApi`](https://backstage.io/docs/reference/integration-react.scmauthapi). It is an API used to authenticate towards different SCM systems in a generic way, based on what resource is being accessed, and is used for example by the Scaffolder (Software Templates) and Catalog Import plugins.
To set up a custom `ScmAuthApi` implementation, you'll need to add an API factory entry to `packages/app/src/apis.ts`. The following example shows an implementation that supports both public GitHub via `githubAuthApi` as well as a GitHub Enterprise installation hosted at `ghe.example.com` via `gheAuthApi`:
```ts
createApiFactory({
api: scmAuthApiRef,
deps: {
gheAuthApi: gheAuthApiRef,
githubAuthApi: githubAuthApiRef,
},
factory: ({ githubAuthApi, gheAuthApi }) =>
ScmAuth.merge(
ScmAuth.forGithub(githubAuthApi),
ScmAuth.forGithub(gheAuthApi, {
host: 'ghe.example.com',
}),
),
});
```
+21 -4
View File
@@ -56,7 +56,7 @@ Once the host build is complete, we are ready to build our image. The following
`Dockerfile` is included when creating a new app with `@backstage/create-app`:
```Dockerfile
FROM node:14-buster-slim
FROM node:16-bullseye-slim
WORKDIR /app
# Copy repo skeleton first, to avoid unnecessary docker cache invalidation.
@@ -65,6 +65,12 @@ WORKDIR /app
COPY yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
# install sqlite3 dependencies
RUN apt-get update && \
apt-get install -y libsqlite3-dev python3 cmake g++ && \
rm -rf /var/lib/apt/lists/* && \
yarn config set python /usr/bin/python3
RUN yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)"
# Then copy the rest of the backend bundle, along with any other files we might want.
@@ -134,23 +140,28 @@ the repo root:
```Dockerfile
# Stage 1 - Create yarn install skeleton layer
FROM node:14-buster-slim AS packages
FROM node:16-bullseye-slim AS packages
WORKDIR /app
COPY package.json yarn.lock ./
COPY packages packages
# Comment this out if you don't have any internal plugins
COPY plugins plugins
RUN find packages \! -name "package.json" -mindepth 2 -maxdepth 2 -exec rm -rf {} \+
# Stage 2 - Install dependencies and build packages
FROM node:14-buster-slim AS build
FROM node:16-bullseye-slim AS build
WORKDIR /app
COPY --from=packages /app .
# install sqlite3 dependencies
RUN apt-get update && apt-get install -y libsqlite3-dev python3 cmake g++ && \
yarn config set python /usr/bin/python3
RUN yarn install --frozen-lockfile --network-timeout 600000 && rm -rf "$(yarn cache dir)"
COPY . .
@@ -159,7 +170,7 @@ RUN yarn tsc
RUN yarn --cwd packages/backend backstage-cli backend:bundle --build-dependencies
# Stage 3 - Build the actual backend image and install production dependencies
FROM node:14-buster-slim
FROM node:16-bullseye-slim
WORKDIR /app
@@ -167,6 +178,12 @@ WORKDIR /app
COPY --from=build /app/yarn.lock /app/package.json /app/packages/backend/dist/skeleton.tar.gz ./
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
# install sqlite3 dependencies
RUN apt-get update && \
apt-get install -y libsqlite3-dev python3 cmake g++ && \
rm -rf /var/lib/apt/lists/* && \
yarn config set python /usr/bin/python3
RUN yarn install --frozen-lockfile --production --network-timeout 600000 && rm -rf "$(yarn cache dir)"
# Copy the built packages from the build stage
+2 -4
View File
@@ -114,15 +114,13 @@ const routes = (
In `Root.tsx`, add the `SidebarSearchModal` component:
```bash
import { SidebarSearchModal, SearchContextProvider } from '@backstage/plugin-search';
import { SidebarSearchModal } from '@backstage/plugin-search';
export const Root = ({ children }: PropsWithChildren<{}>) => (
<SidebarPage>
<Sidebar>
<SidebarLogo />
<SearchContextProvider>
<SidebarSearchModal />
</SearchContextProvider>
<SidebarSearchModal />
<SidebarDivider />
...
```
@@ -472,8 +472,8 @@ type CacheItem = {
export class SystemXReaderProcessor implements CatalogProcessor {
constructor(private readonly reader: UrlReader) {}
// It's recommended to give the processor a unique name.
getProcessorName() {
// The processor name must be unique.
return 'system-x-processor';
}
+1 -1
View File
@@ -123,7 +123,7 @@ Options:
--no-pull Do not pull the latest docker image
--no-docker Do not use Docker, use MkDocs executable and plugins in current user environment.
--techdocs-ref <HOST_TYPE:URL> The repository hosting documentation source files e.g.
github:https://ghe.mycompany.net.com/org/repo.
url:https://ghe.mycompany.net.com/org/repo.
This value is same as the backstage.io/techdocs-ref annotation of the corresponding
Backstage entity.
It is completely fine to skip this as it is only being used to set repo_url in mkdocs.yml
+1 -65
View File
@@ -257,68 +257,4 @@ const LogoFull = () => {
## Custom Homepage
In addition to a custom theme, a custom logo, you can also customize the
homepage of your app. To do that we need to go through a few steps.
### Setting up the Home Page
1. Create a Home Page Component that will be used for composition.
`packages/app/src/components/home/HomePage.tsx`
```tsx
import React from 'react';
export const HomePage = () => {
return {
/* TODO: Compose a Home Page here */
};
};
```
2. Add a route where the homepage will live, presumably `/`.
`packages/app/src/App.tsx`
```tsx
import { HomepageCompositionRoot } from '@backstage/plugin-home';
import { HomePage } from './components/home/HomePage';
// ...
<Route path="/" element={<HomepageCompositionRoot />}>
<HomePage />
</Route>;
// ...
```
### Composing your Home Page
Composing a Home Page is no different from creating a regular React Component,
i.e. the App Integrator is free to include whatever content they like. However,
there are components developed with the Home Page in mind. If you are looking
for components to use when composing your homepage, you can take a look at the
[collection of Homepage components](https://backstage.io/?path=/story/plugins-home-components)
in storybook. If you don't find a component that suits your needs but want to
contribute, check the
[Contributing documentation](https://github.com/backstage/backstage/blob/master/plugins/home/README.md#contributing).
> If you want to use one of the available homepage templates you can find the
> [templates](https://backstage.io/storybook/?path=/story/plugins-home-templates)
> in the storybook under the "Home" plugin. And if you would like to contribute
> a template, please see the
> [Contributing documentation](https://github.com/backstage/backstage/blob/master/plugins/home/README.md#contributing)
```tsx
import React from 'react';
import Grid from '@material-ui/core/Grid';
import { HomePageCompanyLogo } from '@backstage/plugin-home';
export const HomePage = () => {
return (
<Grid container spacing={3}>
<Grid item xs={12} md={4}>
<HomePageCompanyLogo className={container} />
</Grid>
</Grid>
);
};
```
homepage of your app. Read the full guide on the [next page](homepage.md).
+1 -2
View File
@@ -16,8 +16,7 @@ may want to [Run Backstage Locally](./running-backstage-locally.md) instead.
## Create an app
To create a Backstage app, you will need to have
[Node.js](https://nodejs.org/en/download/) Active LTS Release installed
(currently v14).
Node.js [Active LTS Release](https://nodejs.org/en/about/releases/) installed.
Backstage provides a utility for creating new apps. It guides you through the
initial setup of selecting the name of the app and a database for the backend.
+166
View File
@@ -0,0 +1,166 @@
---
id: homepage
title: Backstage homepage - Setup and Customization
description: Documentation on setting up and customizing Backstage homepage
---
## Homepage
Having a good Backstage homepage can significantly improve the discoverability of the platform. You want your users to find all the things they need right from the homepage and never have to remember direct URLs in Backstage. The [Home plugin](https://github.com/backstage/backstage/tree/master/plugins/home) introduces a system for composing a homepage for Backstage in order to surface relevant info and provide convenient shortcuts for common tasks. It's designed with composability in mind with an open ecosystem that allows anyone to contribute with any component, to be included in any homepage.
For App Integrators, the system is designed to be composable to give total freedom in designing a Homepage that suits the needs of the organization. From the perspective of a Component Developer who wishes to contribute with building blocks to be included in Homepages, there's a convenient interface for bundling the different parts and exporting them with both error boundary and lazy loading handled under the surface.
At the end of this tutorial, you can expect:
- Your Backstage app to have a dedicated homepage instead of Software Catalog.
- Understand the composability of homepage and how to start customizing it for your own organization.
### Prerequisites
Before we begin, make sure
- You have created your own standalone Backstage app using [`@backstage/create-app`](index.md#create-your-backstage-app) and not using a fork of the [backstage](https://github.com/backstage/backstage) repository.
- You do not have an existing homepage, and by default you are redirected to Software Catalog when you open Backstage.
Now, let's get started by installing the home plugin and creating a simple homepage for your Backstage app.
### Setup homepage
#### 1. Install the plugin
```
# From your Backstage application directory
cd packages/app
yarn add @backstage/plugin-home
```
#### 2. Create a new HomePage component
Inside your `packages/app` directory, create a new file where our new homepage component is going to live. Create `packages/app/src/components/home/HomePage.tsx` with the following initial code
```tsx
import React from 'react';
export const HomePage = () => {
/* We will shortly compose a pretty homepage here. */
return <h1>Welcome to Backstage!</h1>;
};
```
#### 3. Update router for the root `/` route
If you don't have a homepage already, most likely you have a redirect setup to use the Catalog homepage as a homepage.
Inside your `packages/app/src/App.tsx`, look for
```tsx
const routes = (
<FlatRoutes>
<Navigate key="/" to="catalog" />
```
Let's replace the `<Navigate>` line and use the new component we created in the previous step as the new homepage.
```diff
// File: packages/app/src/App.tsx
+ import { HomepageCompositionRoot } from '@backstage/plugin-home';
+ import { HomePage } from './components/home/HomePage';
// ...
const routes = (
<FlatRoutes>
- <Navigate key="/" to="catalog" />
+ <Route path="/" element={<HomepageCompositionRoot />}>
+ <HomePage />
+ </Route>
// ...
)
```
### 4. Update sidebar items
Let's update the route for "Home" in the Backstage sidebar to point to the new homepage. We'll also add a Sidebar item to quickly open Catalog.
<table>
<tr>
<th><img data-zoomable src="../assets/getting-started/sidebar-without-catalog.png" alt="Sidebar without Catalog" /></td>
<th><img data-zoomable src="../assets/getting-started/sidebar-with-catalog.png" alt="Sidebar with Catalog" /></td>
</tr>
<tr align="center">
<td>Before</td>
<td>After</td>
</tr>
</table>
The code for the Backstage sidebar is most likely inside your [`packages/app/src/components/Root/Root.tsx`](https://github.com/backstage/backstage/blob/master/packages/app/src/components/Root/Root.tsx).
Let's make the following changes
```diff
// Other imports
+ import CategoryIcon from '@material-ui/icons/Category';
export const Root = ({ children }: PropsWithChildren<{}>) => (
<SidebarPage>
<Sidebar>
<SidebarLogo />
# ...
<SidebarGroup label="Menu" icon={<MenuIcon />}>
{/* Global nav, not org-specific */}
- <SidebarItem icon={HomeIcon} to="catalog" text="Home" />
+ <SidebarItem icon={HomeIcon} to="/" text="Home" />
+ <SidebarItem icon={CategoryIcon} to="catalog" text="Catalog" />
<SidebarItem icon={ExtensionIcon} to="api-docs" text="APIs" />
<SidebarItem icon={LibraryBooks} to="docs" text="Docs" />
<SidebarItem icon={LayersIcon} to="explore" text="Explore" />
<SidebarItem icon={CreateComponentIcon} to="create" text="Create..." />
{/* End global nav */}
<SidebarDivider />
```
That's it! You should now have _(although slightly boring)_ a homepage!
<img data-zoomable src="../assets/getting-started/simple-homepage.png" alt="Screenshot of a blank homepage" />
In the next steps, we will make it interesting and useful!
### Use the default template
There is a default homepage template ([storybook link](https://backstage.io/storybook/?path=/story/plugins-home-templates--default-template)) which we will use to set up our homepage. Checkout the [blog post announcement](https://backstage.io/blog/2022/01/25/backstage-homepage-templates) about the Backstage homepage templates for more information.
<!-- TODO for later: detailed instructions for using one of these templates. -->
### Composing your homepage
Composing a homepage is no different from creating a regular React Component,
i.e. the App Integrator is free to include whatever content they like. However,
there are components developed with the homepage in mind. If you are looking
for components to use when composing your homepage, you can take a look at the
[collection of Homepage components](https://backstage.io/storybook?path=/story/plugins-home-components)
in storybook. If you don't find a component that suits your needs but want to
contribute, check the
[Contributing documentation](https://github.com/backstage/backstage/blob/master/plugins/home/README.md#contributing).
> If you want to use one of the available homepage templates you can find the
> [templates](https://backstage.io/storybook/?path=/story/plugins-home-templates)
> in the storybook under the "Home" plugin. And if you would like to contribute
> a template, please see the
> [Contributing documentation](https://github.com/backstage/backstage/blob/master/plugins/home/README.md#contributing)
```tsx
import React from 'react';
import Grid from '@material-ui/core/Grid';
import { HomePageCompanyLogo } from '@backstage/plugin-home';
export const HomePage = () => {
return (
<Grid container spacing={3}>
<Grid item xs={12} md={4}>
<HomePageCompanyLogo className={container} />
</Grid>
</Grid>
);
};
```
+1 -1
View File
@@ -25,7 +25,7 @@ guide to do a repository-based installation.
[Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/)
- An account with elevated rights to install the dependencies
- `curl` or `wget` installed
- Node.js Active LTS Release installed (currently v14) using one of these
- Node.js [Active LTS Release](https://nodejs.org/en/about/releases/) installed using one of these
methods:
- Using `nvm` (recommended)
- [Installing nvm](https://github.com/nvm-sh/nvm#install--update-script)
@@ -13,13 +13,14 @@ trying to contribute, follow the instructions to
- Node.js
First make sure you are using Node.js with an Active LTS Release, currently v14.
First make sure you are using Node.js with an [Active LTS Release](https://nodejs.org/en/about/releases/).
This is made easy with a version manager such as
[nvm](https://github.com/nvm-sh/nvm) which allows for version switching.
```bash
# Installing a new version
nvm install 14
# Installing current LTS release
nvm install --lts
> Installing latest LTS version.
> Downloading and installing node v14.15.1...
> Now using node v14.15.1 (npm v6.14.8)
+16
View File
@@ -57,6 +57,22 @@ public GitHub, for which we can infer them). The `apiBaseUrl` will always be
preferred over the other if a `token` is given, otherwise `rawBaseUrl` will be
preferred.
### Token scopes
When creating a personal access token on GitHub, you must select scopes to
define the level of access for the token. The scopes required vary depending on
your use of the integration:
- Reading software components:
- `repo`
- Reading organization data:
- `read:org`
- `read:user`
- `user:email`
- Publishing software templates:
- `repo`
- `workflow` (if templates include GitHub workflows)
## Authentication with GitHub Apps
Alternatively, Backstage can use GitHub Apps for backend authentication. This
+21 -13
View File
@@ -22,19 +22,6 @@ entities that mirror your org setup.
The processor that performs the import, `GithubOrgReaderProcessor`, comes
installed with the default setup of Backstage.
If you have _replaced_ the set of processors in your installation using
`replaceProcessors`, you can import and add it as follows:
```ts
// Typically in packages/backend/src/plugins/catalog.ts
import { GithubOrgReaderProcessor } from '@backstage/plugin-catalog-backend';
builder.replaceProcessors(
GithubOrgReaderProcessor.fromConfig(config, { logger }),
// ...
);
```
## Configuration
The following configuration enables an import of the teams and users under the
@@ -51,10 +38,12 @@ If Backstage is configured to use GitHub Apps authentication you must grant
`Read-Only` access for `Members` under `Organization` in order to ingest users
correctly. You can modify the app's permissions under the organization settings,
`https://github.com/organizations/{ORG}/settings/apps/{APP_NAME}/permissions`.
![permissions](../../assets/integrations/github/permissions.png)
**Please note that when you change permissions, the app owner will get an email
that must be approved first before the changes are applied.**
![email](../../assets/integrations/github/email.png)
Locations point out the specific org(s) you want to import. The `type` of these
@@ -65,3 +54,22 @@ The authorization for loading org information comes from a configured
[GitHub integration](locations.md#configuration). When using a personal access
token, the token needs to have at least the scopes `read:org`, `read:user`, and
`user:email` in the given `target`.
## Addendum
Some Backstage apps have _replaced_ the catalog processors to override the
default catalog processing behavior. These apps will already have a call to
`replaceProcessors` in the catalog initialization.
In the unlikely scenario that this applies to your app, you can import and
add the `GithubOrgReaderProcessor` as follows:
```ts
// Typically in packages/backend/src/plugins/catalog.ts
import { GithubOrgReaderProcessor } from '@backstage/plugin-catalog-backend';
builder.replaceProcessors(
// ... other processor replacements
GithubOrgReaderProcessor.fromConfig(config, { logger }),
);
```
+50 -4
View File
@@ -334,13 +334,19 @@ The following is an example of a `Dockerfile` that can be used to package the
output of `backstage-cli backend:bundle` into an image:
```Dockerfile
FROM node:14-buster-slim
FROM node:16-bullseye-slim
WORKDIR /app
COPY yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
RUN yarn install --production --frozen-lockfile --network-timeout 300000 && rm -rf "$(yarn cache dir)"
# install sqlite3 dependencies
RUN apt-get update && \
apt-get install -y libsqlite3-dev python3 cmake g++ && \
rm -rf /var/lib/apt/lists/* && \
yarn config set python /usr/bin/python3
RUN yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)"
COPY packages/backend/dist/bundle.tar.gz app-config.yaml ./
RUN tar xzf bundle.tar.gz && rm bundle.tar.gz
@@ -444,8 +450,9 @@ working directory to the package that the test is in.
Where small customizations are needed, such as setting coverage thresholds or
support for specific transforms, it is possible to override the Jest
configuration through the `"jest"` field in `package.json`. These overrides will
be loaded in from all `package.json` files in the directory ancestry, meaning
configuration through the `"jest"` field in `package.json`. For a full list of
options, see the [Jest documentation](https://jestjs.io/docs/en/configuration).
These overrides will be loaded in from all `package.json` files in the directory ancestry, meaning
that you can place common configuration in the `package.json` at the root of a
monorepo. If multiple overrides are found, they will be merged together with
configuration further down in the directory tree taking precedence.
@@ -464,6 +471,45 @@ The overrides in a single `package.json` may for example look like this:
},
```
If you want to configure editor integration for tests we recommend executing the bundled configuration directly with Jest rather than running through the Yarn test script. For example, with the Jest extension for VS Code the configuration would look something like this:
```jsonc
{
"jest.jestCommandLine": "node_modules/.bin/jest --config node_modules/@backstage/cli/config/jest.js",
// In a large repo like the Backstage main repo you likely want to disable
// watch mode and the initial test run too, leaving just manual and perhaps
// on-save test runs in place.
"jest.autoRun": {
"watch": false,
"onSave": "test-src-file"
}
}
```
If you also want to enable source maps when debugging tests, you can do so by setting the `ENABLE_SOURCE_MAPS` environment variable. For example, a complete launch configuration for VS Code debugging may look like this:
```json
{
"type": "node",
"name": "vscode-jest-tests",
"request": "launch",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"disableOptimisticBPs": true,
"program": "${workspaceFolder}/node_modules/.bin/jest",
"cwd": "${workspaceFolder}",
"env": {
"ENABLE_SOURCE_MAPS": "true"
},
"args": [
"--config",
"node_modules/@backstage/cli/config/jest.js",
"--runInBand",
"--watchAll=false"
]
}
```
## Publishing
Package publishing is an optional part of the Backstage build system and not
+1 -16
View File
@@ -440,22 +440,7 @@ a yarn workspaces monorepo by automatically creating one grouped configuration
that includes all packages that have `backstage-cli test` in their package
`test` script.
If needed, the configuration can be extended using a `"jest"` field in
`package.json`, both within the target package and the monorepo root, with
configuration in the target package taking precedence. Refer to the
[Jest configuration documentation](https://jestjs.io/docs/en/configuration) for
a full list of configuration options.
In addition to the Jest configuration there's an optional `transformModules`
option, which is an array of module names to include in transformations.
Normally modules inside `node_modules` are not transformed, but there are cases
were published packages are not transpiled far enough to be usable by Jest, in
which case you need to enable transform of them.
Another way to override the Jest configuration is to place a `jest.config.js` or
`jest.config.ts` file in the package root. As opposed to the `package.json` way
of overriding config, this completely removes the base config, and so you need
to set it up from scratch.
For more information about configuration overrides and editor support, see the [Jest Configuration section](./cli-build-system.md#jest-configuration) in the build system documentation.
```text
Usage: backstage-cli test [options]
+16 -6
View File
@@ -109,11 +109,21 @@ privateKey: |
This will result in backstage preventing the use of any installation that is not
within the allow list.
### Permissions for pull requests
### App permissions
These are the minimum permissions required for creating a pull request with
Backstage software templates:
When creating a GitHub App, you must select permissions to define the level of
access for the app. The permissions required vary depending on your use of the
integration:
- Read and Write permissions for `Contents`.
- Read and write permissions for `Pull Requests` and `Issues`.
- Read permissions on `Metadata`.
- Reading software components:
- `Contents`: `Read-only`
- Reading organization data:
- `Members`: `Read-only`
- Publishing software templates:
- `Administration`: `Read & write` (for creating repositories)
- `Contents`: `Read & write`
- `Metadata`: `Read-only`
- `Pull requests`: `Read & write`
- `Issues`: `Read & write`
- `Workflows`: `Read & write` (if templates include GitHub workflows)
@@ -107,7 +107,7 @@ const systemPage = (
</Grid>
</EntityLayout.Route>
<EntityLayout.Route path="/diagram" title="Diagram">
<EntitySystemDiagramCard />
<EntityCatalogGraphCard variant="gridItem" height={400} />
</EntityLayout.Route>
{/* Adding a new tab to the system view */}
+2 -2
View File
@@ -65,8 +65,8 @@ process is used to release an emergency fix as version `6.5.1` in the patch rele
master branch as well. Create a PR that contains the following:
- [ ] The fix, which you can likely cherry-pick from your patch branch: `git cherry-pick origin/patch/v1.18.0^`
- [ ] An updated `CHANGELOG.md` of all patched patches from the tip of the patch branch, which you can get using `git checkout origin/patch/v1.18.0 -- plugins/foo/CHANGELOG.md`.
- [ ] A changeset with the message "Applied the fix from version `6.5.1` of this package, which is part of the `v1.18.1` release of Backstage.",
- [ ] An updated `CHANGELOG.md` of all patched packages from the tip of the patch branch, `git checkout origin/patch/v1.18.0 -- {packages,plugins}/*/CHANGELOG.md`.
- [ ] A changeset with the message "Applied the fix from version `6.5.1` of this package, which is part of the `v1.18.1` release of Backstage."
- [ ] An entry in `.changeset/patched.json` that sets the current release version to `6.5.1`:
```json
@@ -33,7 +33,7 @@ _Example of the default homepage template in Backstage Storybook_
## How to get started
To get started, you first need to set up your homepage plugin in the app if you have not already, then you can move on to composing your homepage. You can find our step-by-step documentation of how to do this under the [App Configuration - Customize the look-and-feel of your App documentation](https://backstage.io/docs/getting-started/app-custom-theme#custom-homepage). You can also access the [Backstage UI Kit in Figma](https://www.figma.com/file/nUaAw56hTgC0RIOYkuLSrB/Backstage-Design-System?node-id=2185%3A2978) to duplicate your own version and play around with a fitting homepage for your own organization.
To get started, you first need to set up your homepage plugin in the app if you have not already, then you can move on to composing your homepage. You can find our step-by-step documentation of how to do this under the [App Configuration - Customize the look-and-feel of your App documentation](https://backstage.io/docs/getting-started/homepage). You can also access the [Backstage UI Kit in Figma](https://www.figma.com/file/nUaAw56hTgC0RIOYkuLSrB/Backstage-Design-System?node-id=2185%3A2978) to duplicate your own version and play around with a fitting homepage for your own organization.
![Example of homepage components in the Backstage UI Kit in Figma](assets/22-01-25/homepage-components-figma.png)
_Example of the homepage components in the Backstage UI Kit in Figma_
+1 -1
View File
@@ -4,6 +4,6 @@ author: Simply Business
authorUrl: https://github.com/simplybusiness/
category: Monitoring
description: Access Airbrake error monitoring and other integrations from within Backstage
documentation: https://github.com/backstage/backstage/blob/master/plugins/airbrake/README.md
documentation: https://github.com/backstage/backstage/blob/master/plugins/airbrake
iconUrl: https://wp-assets.airbrake.io/wp-content/uploads/2020/10/05222904/Square-white-A-on-Orange.png
npmPackageName: '@backstage/plugin-airbrake'
+1
View File
@@ -5,6 +5,7 @@ const React = require('react');
const redirects = {
'bind-routes':
'/docs/plugins/composability#binding-external-routes-in-the-app',
'scm-auth': '/docs/auth/#custom-scmauthapi-implementation',
};
const fallback = '/docs';
+2 -1
View File
@@ -22,7 +22,8 @@
"label": "App configuration",
"ids": [
"getting-started/configure-app-with-plugins",
"getting-started/app-custom-theme"
"getting-started/app-custom-theme",
"getting-started/homepage"
]
},
"getting-started/keeping-backstage-updated",
+3 -3
View File
@@ -6499,9 +6499,9 @@ url-parse-lax@^3.0.0:
prepend-http "^2.0.0"
url-parse@^1.4.3:
version "1.5.3"
resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862"
integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==
version "1.5.7"
resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.7.tgz#00780f60dbdae90181f51ed85fb24109422c932a"
integrity sha512-HxWkieX+STA38EDk7CE9MEryFeHCKzgagxlGvsdS7WBImq9Mk+PGwiT56w82WI3aicwJA8REp42Cxo98c8FZMA==
dependencies:
querystringify "^2.1.1"
requires-port "^1.0.0"
+1 -1
View File
@@ -49,7 +49,7 @@
"**/@roadiehq/**/@backstage/plugin-catalog": "*",
"**/@roadiehq/**/@backstage/catalog-model": "*"
},
"version": "0.67.0",
"version": "0.68.0",
"dependencies": {
"@manypkg/get-packages": "^1.1.3",
"@microsoft/api-documenter": "^7.15.0",
+12
View File
@@ -1,5 +1,17 @@
# @backstage/app-defaults
## 0.1.8
### Patch Changes
- c77c5c7eb6: Added `backstage.role` to `package.json`
- Updated dependencies
- @backstage/core-app-api@0.5.3
- @backstage/core-components@0.8.9
- @backstage/core-plugin-api@0.6.1
- @backstage/plugin-permission-react@0.3.1
- @backstage/theme@0.2.15
## 0.1.7
### Patch Changes
+18 -14
View File
@@ -1,13 +1,16 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
"version": "0.1.7",
"version": "0.1.8",
"private": false,
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
"types": "dist/index.d.ts"
},
"backstage": {
"role": "web-library"
},
"homepage": "https://backstage.io",
"repository": {
"type": "git",
@@ -21,19 +24,20 @@
"main": "src/index.ts",
"types": "src/index.ts",
"scripts": {
"build": "backstage-cli build --outputs types,esm",
"lint": "backstage-cli lint",
"test": "backstage-cli test",
"prepack": "backstage-cli prepack",
"postpack": "backstage-cli postpack",
"clean": "backstage-cli clean"
"build": "backstage-cli package build",
"lint": "backstage-cli package lint",
"test": "backstage-cli package test",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
"clean": "backstage-cli package clean",
"start": "backstage-cli package start"
},
"dependencies": {
"@backstage/core-components": "^0.8.8",
"@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",
"@backstage/core-components": "^0.8.9",
"@backstage/core-app-api": "^0.5.3",
"@backstage/core-plugin-api": "^0.6.1",
"@backstage/plugin-permission-react": "^0.3.1",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"react-router-dom": "6.0.0-beta.0"
@@ -42,8 +46,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.13.2",
"@backstage/test-utils": "^0.2.4",
"@backstage/cli": "^0.14.0",
"@backstage/test-utils": "^0.2.5",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@types/jest": "^26.0.7",
+54
View File
@@ -1,5 +1,59 @@
# example-app
## 0.2.65
### Patch Changes
- Updated dependencies
- @backstage/cli@0.14.0
- @backstage/core-app-api@0.5.3
- @backstage/core-components@0.8.9
- @backstage/core-plugin-api@0.6.1
- @backstage/integration-react@0.1.22
- @backstage/plugin-airbrake@0.2.0
- @backstage/plugin-apache-airflow@0.1.7
- @backstage/plugin-api-docs@0.7.3
- @backstage/plugin-azure-devops@0.1.15
- @backstage/plugin-badges@0.2.23
- @backstage/plugin-catalog@0.8.0
- @backstage/plugin-catalog-import@0.8.2
- @backstage/plugin-catalog-react@0.6.15
- @backstage/plugin-circleci@0.2.38
- @backstage/plugin-cloudbuild@0.2.36
- @backstage/plugin-code-coverage@0.1.26
- @backstage/plugin-cost-insights@0.11.21
- @backstage/plugin-explore@0.3.30
- @backstage/plugin-gcp-projects@0.3.18
- @backstage/plugin-github-actions@0.4.36
- @backstage/plugin-gocd@0.1.5
- @backstage/plugin-graphiql@0.2.31
- @backstage/plugin-home@0.4.15
- @backstage/plugin-jenkins@0.5.21
- @backstage/plugin-kafka@0.2.29
- @backstage/plugin-kubernetes@0.5.8
- @backstage/plugin-lighthouse@0.2.38
- @backstage/plugin-newrelic@0.3.17
- @backstage/plugin-newrelic-dashboard@0.1.7
- @backstage/plugin-org@0.4.3
- @backstage/plugin-pagerduty@0.3.26
- @backstage/plugin-permission-react@0.3.1
- @backstage/plugin-rollbar@0.3.27
- @backstage/plugin-scaffolder@0.12.3
- @backstage/plugin-search@0.7.0
- @backstage/plugin-sentry@0.3.37
- @backstage/plugin-shortcuts@0.2.0
- @backstage/plugin-tech-insights@0.1.9
- @backstage/plugin-tech-radar@0.5.6
- @backstage/plugin-techdocs@0.13.4
- @backstage/plugin-todo@0.2.1
- @backstage/plugin-user-settings@0.3.20
- @backstage/app-defaults@0.1.8
- @backstage/catalog-model@0.10.0
- @backstage/search-common@0.2.3
- @backstage/theme@0.2.15
- @backstage/plugin-catalog-common@0.1.3
- @backstage/plugin-catalog-graph@0.2.11
## 0.2.64
### Patch Changes
+63 -60
View File
@@ -1,65 +1,68 @@
{
"name": "example-app",
"version": "0.2.64",
"version": "0.2.65",
"private": true,
"backstage": {
"role": "frontend"
},
"bundled": true,
"dependencies": {
"@backstage/app-defaults": "^0.1.7",
"@backstage/catalog-model": "^0.9.10",
"@backstage/cli": "^0.13.2",
"@backstage/core-app-api": "^0.5.2",
"@backstage/core-components": "^0.8.8",
"@backstage/core-plugin-api": "^0.6.0",
"@backstage/integration-react": "^0.1.21",
"@backstage/plugin-airbrake": "^0.1.3",
"@backstage/plugin-api-docs": "^0.7.2",
"@backstage/plugin-azure-devops": "^0.1.14",
"@backstage/plugin-apache-airflow": "^0.1.6",
"@backstage/plugin-badges": "^0.2.22",
"@backstage/plugin-catalog": "^0.7.12",
"@backstage/plugin-catalog-common": "^0.1.2",
"@backstage/plugin-catalog-graph": "^0.2.10",
"@backstage/plugin-catalog-import": "^0.8.1",
"@backstage/plugin-catalog-react": "^0.6.14",
"@backstage/plugin-circleci": "^0.2.37",
"@backstage/plugin-cloudbuild": "^0.2.35",
"@backstage/plugin-code-coverage": "^0.1.25",
"@backstage/plugin-cost-insights": "^0.11.20",
"@backstage/plugin-explore": "^0.3.29",
"@backstage/plugin-gcp-projects": "^0.3.17",
"@backstage/plugin-github-actions": "^0.4.35",
"@backstage/plugin-gocd": "^0.1.4",
"@backstage/plugin-graphiql": "^0.2.30",
"@backstage/plugin-home": "^0.4.14",
"@backstage/plugin-jenkins": "^0.5.20",
"@backstage/plugin-kafka": "^0.2.28",
"@backstage/plugin-kubernetes": "^0.5.7",
"@backstage/plugin-lighthouse": "^0.2.37",
"@backstage/plugin-newrelic": "^0.3.16",
"@backstage/plugin-newrelic-dashboard": "^0.1.6",
"@backstage/plugin-org": "^0.4.2-next.0",
"@backstage/plugin-pagerduty": "0.3.25",
"@backstage/plugin-permission-react": "^0.3.0",
"@backstage/plugin-rollbar": "^0.3.26",
"@backstage/plugin-scaffolder": "^0.12.2",
"@backstage/plugin-search": "^0.6.2",
"@backstage/plugin-sentry": "^0.3.36",
"@backstage/plugin-shortcuts": "^0.1.22",
"@backstage/plugin-tech-radar": "^0.5.5",
"@backstage/plugin-techdocs": "^0.13.3",
"@backstage/plugin-todo": "^0.2.0",
"@backstage/plugin-user-settings": "^0.3.19",
"@backstage/search-common": "^0.2.2",
"@backstage/plugin-tech-insights": "^0.1.8",
"@backstage/theme": "^0.2.14",
"@backstage/app-defaults": "^0.1.8",
"@backstage/catalog-model": "^0.10.0",
"@backstage/cli": "^0.14.0",
"@backstage/core-app-api": "^0.5.3",
"@backstage/core-components": "^0.8.9",
"@backstage/core-plugin-api": "^0.6.1",
"@backstage/integration-react": "^0.1.22",
"@backstage/plugin-airbrake": "^0.2.0",
"@backstage/plugin-api-docs": "^0.7.3",
"@backstage/plugin-azure-devops": "^0.1.15",
"@backstage/plugin-apache-airflow": "^0.1.7",
"@backstage/plugin-badges": "^0.2.23",
"@backstage/plugin-catalog": "^0.8.0",
"@backstage/plugin-catalog-common": "^0.1.3",
"@backstage/plugin-catalog-graph": "^0.2.11",
"@backstage/plugin-catalog-import": "^0.8.2",
"@backstage/plugin-catalog-react": "^0.6.15",
"@backstage/plugin-circleci": "^0.2.38",
"@backstage/plugin-cloudbuild": "^0.2.36",
"@backstage/plugin-code-coverage": "^0.1.26",
"@backstage/plugin-cost-insights": "^0.11.21",
"@backstage/plugin-explore": "^0.3.30",
"@backstage/plugin-gcp-projects": "^0.3.18",
"@backstage/plugin-github-actions": "^0.4.36",
"@backstage/plugin-gocd": "^0.1.5",
"@backstage/plugin-graphiql": "^0.2.31",
"@backstage/plugin-home": "^0.4.15",
"@backstage/plugin-jenkins": "^0.5.21",
"@backstage/plugin-kafka": "^0.2.29",
"@backstage/plugin-kubernetes": "^0.5.8",
"@backstage/plugin-lighthouse": "^0.2.38",
"@backstage/plugin-newrelic": "^0.3.17",
"@backstage/plugin-newrelic-dashboard": "^0.1.7",
"@backstage/plugin-org": "^0.4.3",
"@backstage/plugin-pagerduty": "0.3.26",
"@backstage/plugin-permission-react": "^0.3.1",
"@backstage/plugin-rollbar": "^0.3.27",
"@backstage/plugin-scaffolder": "^0.12.3",
"@backstage/plugin-search": "^0.7.0",
"@backstage/plugin-sentry": "^0.3.37",
"@backstage/plugin-shortcuts": "^0.2.0",
"@backstage/plugin-tech-radar": "^0.5.6",
"@backstage/plugin-techdocs": "^0.13.4",
"@backstage/plugin-todo": "^0.2.1",
"@backstage/plugin-user-settings": "^0.3.20",
"@backstage/search-common": "^0.2.3",
"@backstage/plugin-tech-insights": "^0.1.9",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
"@octokit/rest": "^18.5.3",
"@roadiehq/backstage-plugin-github-insights": "^1.4.2",
"@roadiehq/backstage-plugin-github-pull-requests": "^1.3.2",
"@roadiehq/backstage-plugin-travis-ci": "^1.3.2",
"@roadiehq/backstage-plugin-buildkite": "^1.3.4",
"@roadiehq/backstage-plugin-github-insights": "^1.5.0",
"@roadiehq/backstage-plugin-github-pull-requests": "^1.4.0",
"@roadiehq/backstage-plugin-travis-ci": "^1.3.6",
"@roadiehq/backstage-plugin-buildkite": "^1.3.8",
"history": "^5.0.0",
"prop-types": "^15.7.2",
"react": "^17.0.2",
@@ -71,8 +74,8 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/plugin-permission-react": "^0.3.0",
"@backstage/test-utils": "^0.2.4",
"@backstage/plugin-permission-react": "^0.3.1",
"@backstage/test-utils": "^0.2.5",
"@rjsf/core": "^3.2.1",
"@testing-library/cypress": "^8.0.2",
"@testing-library/jest-dom": "^5.10.1",
@@ -89,13 +92,13 @@
"start-server-and-test": "^1.10.11"
},
"scripts": {
"start": "backstage-cli app:serve",
"build": "backstage-cli app:build",
"clean": "backstage-cli clean",
"test": "backstage-cli test",
"start": "backstage-cli package start",
"build": "backstage-cli package build",
"clean": "backstage-cli package clean",
"test": "backstage-cli package test",
"test:e2e": "start-server-and-test start http://localhost:3000 cy:dev",
"test:e2e:ci": "start-server-and-test start http://localhost:3000 cy:run",
"lint": "backstage-cli lint",
"lint": "backstage-cli package lint",
"cy:dev": "cypress open",
"cy:run": "cypress run"
},
+2 -7
View File
@@ -34,10 +34,7 @@ import {
Settings as SidebarSettings,
UserSettingsSignInAvatar,
} from '@backstage/plugin-user-settings';
import {
SidebarSearchModal,
SearchContextProvider,
} from '@backstage/plugin-search';
import { SidebarSearchModal } from '@backstage/plugin-search';
import { Shortcuts } from '@backstage/plugin-shortcuts';
import {
Sidebar,
@@ -89,9 +86,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => (
<Sidebar>
<SidebarLogo />
<SidebarGroup label="Search" icon={<SearchIcon />} to="/search">
<SearchContextProvider>
<SidebarSearchModal />
</SearchContextProvider>
<SidebarSearchModal />
</SidebarGroup>
<SidebarDivider />
<SidebarGroup label="Menu" icon={<MenuIcon />}>
@@ -24,7 +24,7 @@ import {
SidebarPinStateContext,
} from '@backstage/core-components';
import { useApi } from '@backstage/core-plugin-api';
import { CatalogResultListItem } from '@backstage/plugin-catalog';
import { CatalogSearchResultListItem } from '@backstage/plugin-catalog';
import {
catalogApiRef,
CATALOG_FILTER_EXISTS,
@@ -136,7 +136,7 @@ const SearchPage = () => {
switch (type) {
case 'software-catalog':
return (
<CatalogResultListItem
<CatalogSearchResultListItem
key={document.location}
result={document}
/>
+29
View File
@@ -1,5 +1,34 @@
# @backstage/backend-common
## 0.10.9
### Patch Changes
- Fix for the previous release with missing type declarations.
- Updated dependencies
- @backstage/cli-common@0.1.8
- @backstage/config@0.1.15
- @backstage/config-loader@0.9.5
- @backstage/errors@0.2.2
- @backstage/integration@0.7.4
- @backstage/types@0.1.3
## 0.10.8
### Patch Changes
- 1ed305728b: Bump `node-fetch` to version 2.6.7 and `cross-fetch` to version 3.1.5
- c77c5c7eb6: Added `backstage.role` to `package.json`
- 0107c9aa08: chore(deps): bump `helmet` from 4.4.1 to 5.0.2
- b590e9b58d: Updated `isDatabaseConflictError` to handle modern sqlite conflict errors
- Updated dependencies
- @backstage/config-loader@0.9.4
- @backstage/errors@0.2.1
- @backstage/integration@0.7.3
- @backstage/cli-common@0.1.7
- @backstage/config@0.1.14
- @backstage/types@0.1.2
## 0.10.7
### Patch Changes
+20 -16
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.10.7",
"version": "0.10.8",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -11,6 +11,9 @@
"types": "dist/index.d.ts",
"alphaTypes": "dist/index.alpha.d.ts"
},
"backstage": {
"role": "node-library"
},
"homepage": "https://backstage.io",
"repository": {
"type": "git",
@@ -22,20 +25,21 @@
],
"license": "Apache-2.0",
"scripts": {
"build": "backstage-cli build --experimental-type-build --outputs cjs,types",
"lint": "backstage-cli lint",
"test": "backstage-cli test",
"prepack": "backstage-cli prepack",
"postpack": "backstage-cli postpack",
"clean": "backstage-cli clean"
"build": "backstage-cli package build --experimental-type-build",
"lint": "backstage-cli package lint",
"test": "backstage-cli package test",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
"clean": "backstage-cli package clean",
"start": "backstage-cli package start"
},
"dependencies": {
"@backstage/cli-common": "^0.1.6",
"@backstage/config": "^0.1.13",
"@backstage/config-loader": "^0.9.3",
"@backstage/errors": "^0.2.0",
"@backstage/integration": "^0.7.2",
"@backstage/types": "^0.1.1",
"@backstage/cli-common": "^0.1.7",
"@backstage/config": "^0.1.14",
"@backstage/config-loader": "^0.9.4",
"@backstage/errors": "^0.2.1",
"@backstage/integration": "^0.7.3",
"@backstage/types": "^0.1.2",
"@google-cloud/storage": "^5.8.0",
"@manypkg/get-packages": "^1.1.3",
"@octokit/rest": "^18.5.3",
@@ -53,7 +57,7 @@
"express-promise-router": "^4.1.0",
"fs-extra": "9.1.0",
"git-url-parse": "^11.6.0",
"helmet": "^4.0.0",
"helmet": "^5.0.2",
"isomorphic-git": "^1.8.0",
"jose": "^1.27.1",
"keyv": "^4.0.3",
@@ -84,8 +88,8 @@
}
},
"devDependencies": {
"@backstage/cli": "^0.13.2",
"@backstage/test-utils": "^0.2.4",
"@backstage/cli": "^0.14.0",
"@backstage/test-utils": "^0.2.5",
"@types/archiver": "^5.1.0",
"@types/compression": "^1.7.0",
"@types/concat-stream": "^2.0.0",
+1 -1
View File
@@ -27,7 +27,7 @@ export function isDatabaseConflictError(e: unknown) {
return (
typeof message === 'string' &&
(/SQLITE_CONSTRAINT: UNIQUE/.test(message) ||
(/SQLITE_CONSTRAINT(?:_UNIQUE)?: UNIQUE/.test(message) ||
/unique constraint/.test(message))
);
}
@@ -19,7 +19,7 @@ import compression from 'compression';
import cors from 'cors';
import express, { Router, ErrorRequestHandler } from 'express';
import helmet from 'helmet';
import { ContentSecurityPolicyOptions } from 'helmet/dist/middlewares/content-security-policy';
import { ContentSecurityPolicyOptions } from 'helmet/dist/types/middlewares/content-security-policy';
import * as http from 'http';
import stoppable from 'stoppable';
import { Logger } from 'winston';
@@ -215,8 +215,17 @@ export class ServiceBuilderImpl implements ServiceBuilder {
httpsSettings: this.httpsSettings,
helmetOptions: {
contentSecurityPolicy: {
useDefaults: false,
directives: applyCspDirectives(this.cspOptions),
},
// These are all disabled in order to maintain backwards compatibility
// when bumping helmet v5. We can't enable these by default because
// there is no way for users to configure them.
// TODO(Rugvip): We should give control of this setup to consumers
crossOriginEmbedderPolicy: false,
crossOriginOpenerPolicy: false,
crossOriginResourcePolicy: false,
originAgentCluster: false,
},
};
}
@@ -232,6 +241,11 @@ export function applyCspDirectives(
// It should be replaced by any other solution that doesn't require unsafe-eval.
result['script-src'] = ["'self'", "'unsafe-eval'"];
// TODO(Rugvip): This is removed so that we maintained backwards compatibility
// when bumping to helmet v5, we could remove this as well as
// skip setting `useDefaults: false` in the future.
delete result['form-action'];
if (directives) {
for (const [key, value] of Object.entries(directives)) {
if (value === false) {
+22
View File
@@ -1,5 +1,27 @@
# @backstage/backend-tasks
## 0.1.8
### Patch Changes
- Fix for the previous release with missing type declarations.
- Updated dependencies
- @backstage/backend-common@0.10.9
- @backstage/config@0.1.15
- @backstage/errors@0.2.2
- @backstage/types@0.1.3
## 0.1.7
### Patch Changes
- c77c5c7eb6: Added `backstage.role` to `package.json`
- Updated dependencies
- @backstage/backend-common@0.10.8
- @backstage/errors@0.2.1
- @backstage/config@0.1.14
- @backstage/types@0.1.2
## 0.1.6
### Patch Changes
+17 -13
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
"version": "0.1.6",
"version": "0.1.7",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -10,6 +10,9 @@
"main": "dist/index.cjs.js",
"types": "dist/index.d.ts"
},
"backstage": {
"role": "node-library"
},
"homepage": "https://backstage.io",
"repository": {
"type": "git",
@@ -21,18 +24,19 @@
],
"license": "Apache-2.0",
"scripts": {
"build": "backstage-cli build --outputs cjs,types",
"lint": "backstage-cli lint",
"test": "backstage-cli test",
"prepack": "backstage-cli prepack",
"postpack": "backstage-cli postpack",
"clean": "backstage-cli clean"
"build": "backstage-cli package build",
"lint": "backstage-cli package lint",
"test": "backstage-cli package test",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
"clean": "backstage-cli package clean",
"start": "backstage-cli package start"
},
"dependencies": {
"@backstage/backend-common": "^0.10.7",
"@backstage/config": "^0.1.13",
"@backstage/errors": "^0.2.0",
"@backstage/types": "^0.1.1",
"@backstage/backend-common": "^0.10.8",
"@backstage/config": "^0.1.14",
"@backstage/errors": "^0.2.1",
"@backstage/types": "^0.1.2",
"@types/luxon": "^2.0.4",
"knex": "^1.0.2",
"lodash": "^4.17.21",
@@ -43,8 +47,8 @@
"zod": "^3.9.5"
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.17",
"@backstage/cli": "^0.13.2",
"@backstage/backend-test-utils": "^0.1.18",
"@backstage/cli": "^0.14.0",
"jest": "^26.0.1",
"wait-for-expect": "^3.0.2"
},
+10
View File
@@ -1,5 +1,15 @@
# @backstage/backend-test-utils
## 0.1.18
### Patch Changes
- c77c5c7eb6: Added `backstage.role` to `package.json`
- Updated dependencies
- @backstage/cli@0.14.0
- @backstage/backend-common@0.10.8
- @backstage/config@0.1.14
## 0.1.17
### Patch Changes
+15 -11
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
"version": "0.1.17",
"version": "0.1.18",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -10,6 +10,9 @@
"main": "dist/index.cjs.js",
"types": "dist/index.d.ts"
},
"backstage": {
"role": "node-library"
},
"homepage": "https://backstage.io",
"repository": {
"type": "git",
@@ -22,17 +25,18 @@
],
"license": "Apache-2.0",
"scripts": {
"build": "backstage-cli build --outputs cjs,types",
"lint": "backstage-cli lint",
"test": "backstage-cli test",
"prepack": "backstage-cli prepack",
"postpack": "backstage-cli postpack",
"clean": "backstage-cli clean"
"build": "backstage-cli package build",
"lint": "backstage-cli package lint",
"test": "backstage-cli package test",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
"clean": "backstage-cli package clean",
"start": "backstage-cli package start"
},
"dependencies": {
"@backstage/backend-common": "^0.10.7",
"@backstage/cli": "^0.13.2",
"@backstage/config": "^0.1.13",
"@backstage/backend-common": "^0.10.8",
"@backstage/cli": "^0.14.0",
"@backstage/config": "^0.1.14",
"@vscode/sqlite3": "^5.0.7",
"knex": "^1.0.2",
"mysql2": "^2.2.5",
@@ -41,7 +45,7 @@
"uuid": "^8.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.13.2",
"@backstage/cli": "^0.14.0",
"jest": "^26.0.1"
},
"files": [
+79
View File
@@ -1,5 +1,84 @@
# example-backend
## 0.2.66
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.10.9
- @backstage/backend-tasks@0.1.8
- @backstage/catalog-client@0.7.1
- @backstage/catalog-model@0.10.1
- @backstage/config@0.1.15
- @backstage/integration@0.7.4
- @backstage/plugin-app-backend@0.3.26
- @backstage/plugin-auth-backend@0.10.2
- @backstage/plugin-auth-node@0.1.2
- @backstage/plugin-azure-devops-backend@0.3.5
- @backstage/plugin-badges-backend@0.1.20
- @backstage/plugin-catalog-backend@0.21.5
- @backstage/plugin-code-coverage-backend@0.1.24
- @backstage/plugin-graphql-backend@0.1.16
- @backstage/plugin-jenkins-backend@0.1.15
- @backstage/plugin-kafka-backend@0.2.19
- @backstage/plugin-kubernetes-backend@0.4.9
- @backstage/plugin-permission-backend@0.5.1
- @backstage/plugin-permission-common@0.5.1
- @backstage/plugin-permission-node@0.5.1
- @backstage/plugin-proxy-backend@0.2.20
- @backstage/plugin-rollbar-backend@0.1.23
- @backstage/plugin-scaffolder-backend@0.16.1
- @backstage/plugin-scaffolder-backend-module-rails@0.3.1
- @backstage/plugin-search-backend@0.4.4
- @backstage/plugin-search-backend-module-elasticsearch@0.0.10
- @backstage/plugin-search-backend-module-pg@0.2.8
- @backstage/plugin-search-backend-node@0.4.7
- @backstage/plugin-tech-insights-backend@0.2.6
- @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.10
- @backstage/plugin-tech-insights-node@0.2.4
- @backstage/plugin-techdocs-backend@0.13.5
- @backstage/plugin-todo-backend@0.1.23
## 0.2.65
### Patch Changes
- Updated dependencies
- @backstage/plugin-techdocs-backend@0.13.4
- @backstage/plugin-catalog-backend@0.21.4
- @backstage/backend-common@0.10.8
- @backstage/catalog-client@0.7.0
- @backstage/integration@0.7.3
- @backstage/plugin-auth-backend@0.10.1
- @backstage/plugin-auth-node@0.1.1
- @backstage/plugin-permission-backend@0.5.0
- @backstage/plugin-permission-common@0.5.0
- @backstage/plugin-rollbar-backend@0.1.22
- @backstage/plugin-scaffolder-backend@0.16.0
- @backstage/backend-tasks@0.1.7
- @backstage/catalog-model@0.10.0
- @backstage/config@0.1.14
- @backstage/plugin-app-backend@0.3.25
- @backstage/plugin-azure-devops-backend@0.3.4
- @backstage/plugin-badges-backend@0.1.19
- @backstage/plugin-code-coverage-backend@0.1.23
- @backstage/plugin-graphql-backend@0.1.15
- @backstage/plugin-jenkins-backend@0.1.14
- @backstage/plugin-kafka-backend@0.2.18
- @backstage/plugin-kubernetes-backend@0.4.8
- @backstage/plugin-permission-node@0.5.0
- @backstage/plugin-proxy-backend@0.2.19
- @backstage/plugin-scaffolder-backend-module-rails@0.3.0
- @backstage/plugin-search-backend@0.4.3
- @backstage/plugin-search-backend-module-elasticsearch@0.0.9
- @backstage/plugin-search-backend-module-pg@0.2.7
- @backstage/plugin-search-backend-node@0.4.6
- @backstage/plugin-tech-insights-backend@0.2.5
- @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.9
- @backstage/plugin-tech-insights-node@0.2.3
- @backstage/plugin-todo-backend@0.1.22
- example-app@0.2.65
## 0.2.64
### Patch Changes
+7 -1
View File
@@ -9,7 +9,7 @@
#
# Once the commands have been run, you can build the image using `yarn build-image`
FROM node:14-buster-slim
FROM node:16-bullseye-slim
WORKDIR /app
@@ -19,6 +19,12 @@ WORKDIR /app
COPY yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
# install sqlite3 dependencies
RUN apt-get update && \
apt-get install -y libsqlite3-dev python3 cmake g++ && \
rm -rf /var/lib/apt/lists/* && \
yarn config set python /usr/bin/python3
RUN yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)"
# Then copy the rest of the backend bundle, along with any other files we might want.
+43 -40
View File
@@ -1,10 +1,13 @@
{
"name": "example-backend",
"version": "0.2.64",
"version": "0.2.65",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
"private": true,
"backstage": {
"role": "backend"
},
"homepage": "https://backstage.io",
"repository": {
"type": "git",
@@ -15,48 +18,48 @@
"backstage"
],
"scripts": {
"build": "backstage-cli backend:bundle",
"build": "backstage-cli package build",
"build-image": "docker build ../.. -f Dockerfile --tag example-backend",
"start": "backstage-cli backend:dev",
"lint": "backstage-cli lint",
"test": "backstage-cli test",
"clean": "backstage-cli clean",
"start": "backstage-cli package start",
"lint": "backstage-cli package lint",
"test": "backstage-cli package test",
"clean": "backstage-cli package clean",
"migrate:create": "knex migrate:make -x ts"
},
"dependencies": {
"@backstage/backend-common": "^0.10.7",
"@backstage/backend-tasks": "^0.1.6",
"@backstage/catalog-client": "^0.6.0",
"@backstage/catalog-model": "^0.9.10",
"@backstage/config": "^0.1.13",
"@backstage/integration": "^0.7.2",
"@backstage/plugin-app-backend": "^0.3.24",
"@backstage/plugin-auth-backend": "^0.10.0",
"@backstage/plugin-auth-node": "^0.1.0",
"@backstage/plugin-azure-devops-backend": "^0.3.3",
"@backstage/plugin-badges-backend": "^0.1.18",
"@backstage/plugin-catalog-backend": "^0.21.3",
"@backstage/plugin-code-coverage-backend": "^0.1.22",
"@backstage/plugin-graphql-backend": "^0.1.14",
"@backstage/plugin-jenkins-backend": "^0.1.13",
"@backstage/plugin-kubernetes-backend": "^0.4.7",
"@backstage/plugin-kafka-backend": "^0.2.17",
"@backstage/plugin-permission-backend": "^0.4.3",
"@backstage/plugin-permission-common": "^0.4.0",
"@backstage/plugin-permission-node": "^0.4.3",
"@backstage/plugin-proxy-backend": "^0.2.18",
"@backstage/plugin-rollbar-backend": "^0.1.21",
"@backstage/plugin-scaffolder-backend": "^0.15.24",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.2.6",
"@backstage/plugin-search-backend": "^0.4.2",
"@backstage/plugin-search-backend-node": "^0.4.5",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.0.8",
"@backstage/plugin-search-backend-module-pg": "^0.2.6",
"@backstage/plugin-techdocs-backend": "^0.13.3",
"@backstage/plugin-tech-insights-backend": "^0.2.4",
"@backstage/plugin-tech-insights-node": "^0.2.2",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.8",
"@backstage/plugin-todo-backend": "^0.1.21",
"@backstage/backend-common": "^0.10.8",
"@backstage/backend-tasks": "^0.1.7",
"@backstage/catalog-client": "^0.7.0",
"@backstage/catalog-model": "^0.10.0",
"@backstage/config": "^0.1.14",
"@backstage/integration": "^0.7.3",
"@backstage/plugin-app-backend": "^0.3.25",
"@backstage/plugin-auth-backend": "^0.10.1",
"@backstage/plugin-auth-node": "^0.1.1",
"@backstage/plugin-azure-devops-backend": "^0.3.4",
"@backstage/plugin-badges-backend": "^0.1.19",
"@backstage/plugin-catalog-backend": "^0.21.4",
"@backstage/plugin-code-coverage-backend": "^0.1.23",
"@backstage/plugin-graphql-backend": "^0.1.15",
"@backstage/plugin-jenkins-backend": "^0.1.14",
"@backstage/plugin-kubernetes-backend": "^0.4.8",
"@backstage/plugin-kafka-backend": "^0.2.18",
"@backstage/plugin-permission-backend": "^0.5.0",
"@backstage/plugin-permission-common": "^0.5.0",
"@backstage/plugin-permission-node": "^0.5.0",
"@backstage/plugin-proxy-backend": "^0.2.19",
"@backstage/plugin-rollbar-backend": "^0.1.22",
"@backstage/plugin-scaffolder-backend": "^0.16.0",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.3.0",
"@backstage/plugin-search-backend": "^0.4.3",
"@backstage/plugin-search-backend-node": "^0.4.6",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.0.9",
"@backstage/plugin-search-backend-module-pg": "^0.2.7",
"@backstage/plugin-techdocs-backend": "^0.13.4",
"@backstage/plugin-tech-insights-backend": "^0.2.5",
"@backstage/plugin-tech-insights-node": "^0.2.3",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.9",
"@backstage/plugin-todo-backend": "^0.1.22",
"@gitbeaker/node": "^35.1.0",
"@octokit/rest": "^18.5.3",
"@vscode/sqlite3": "^5.0.7",
@@ -73,7 +76,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.13.2",
"@backstage/cli": "^0.14.0",
"@types/dockerode": "^3.3.0",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5"
+2 -1
View File
@@ -35,8 +35,9 @@ class AllowAllPermissionPolicy implements PermissionPolicy {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const { logger, discovery } = env;
const { logger, discovery, config } = env;
return await createRouter({
config,
logger,
discovery,
policy: new AllowAllPermissionPolicy(),
+49
View File
@@ -1,5 +1,54 @@
# @backstage/catalog-client
## 0.7.1
### Patch Changes
- Fix for the previous release with missing type declarations.
- Updated dependencies
- @backstage/catalog-model@0.10.1
- @backstage/errors@0.2.2
## 0.7.0
### Minor Changes
- 8eda0e7a9c: **BREAKING**: Removed the explicit `DiscoveryApi` and `FetchApi` export symbols,
which were unnecessary duplicates from the well known core ones.
The `CATALOG_FILTER_EXISTS` symbol's value has changed. However, this should not
affect any code in practice.
- deaf6065db: Removed `CatalogApi.geLocationByEntity` and `CatalogApi.getOriginLocationByEntity`, and replaced them with `CatalogApi.getLocationByRef`.
If you were using one of the two old methods, you can update your code as follows:
```diff
-const originLocation = catalogApi.getOriginLocationByEntity(entity);
+const originLocation = catalogApi.getLocationByRef(entity.metadata.annotations[ANNOTATION_ORIGIN_LOCATION]!);
-const location = catalogApi.getLocationByEntity(entity);
+const location = catalogApi.getLocationByRef(entity.metadata.annotations[ANNOTATION_LOCATION]!);
```
### Patch Changes
- 1ed305728b: Bump `node-fetch` to version 2.6.7 and `cross-fetch` to version 3.1.5
- c77c5c7eb6: Added `backstage.role` to `package.json`
- 216725b434: Updated to use new names for `parseLocationRef` and `stringifyLocationRef`
- 244d24ebc4: Export the `Location` type that was previously exported by the `@backstage/catalog-model` package.
- 538ca90790: Deprecated the following types used by the catalog client, and created new
corresponding types to make them more consistent:
- `CatalogEntitiesRequest` -> `GetEntitiesRequest`
- `CatalogListResponse` was removed and generally replaced with `GetEntitiesResponse` (which does not use a type parameter argument)
- `CatalogEntityAncestorsRequest`-> `GetEntityAncestorsRequest`
- `CatalogEntityAncestorsResponse` -> `GetEntityAncestorsResponse`
- 27eccab216: Replaces use of deprecated catalog-model constants.
- Updated dependencies
- @backstage/errors@0.2.1
- @backstage/catalog-model@0.10.0
## 0.6.0
### Minor Changes
+105 -55
View File
@@ -5,7 +5,7 @@
```ts
import { Entity } from '@backstage/catalog-model';
import { EntityName } from '@backstage/catalog-model';
import { Location as Location_2 } from '@backstage/catalog-model';
import { LocationSpec } from '@backstage/catalog-model';
// @public
export type AddLocationRequest = {
@@ -32,27 +32,27 @@ export interface CatalogApi {
options?: CatalogRequestOptions,
): Promise<AddLocationResponse>;
getEntities(
request?: CatalogEntitiesRequest,
request?: GetEntitiesRequest,
options?: CatalogRequestOptions,
): Promise<CatalogListResponse<Entity>>;
): Promise<GetEntitiesResponse>;
getEntityAncestors(
request: CatalogEntityAncestorsRequest,
request: GetEntityAncestorsRequest,
options?: CatalogRequestOptions,
): Promise<CatalogEntityAncestorsResponse>;
): Promise<GetEntityAncestorsResponse>;
getEntityByName(
name: EntityName,
options?: CatalogRequestOptions,
): Promise<Entity | undefined>;
getLocationByEntity(
entity: Entity,
getEntityFacets(
request: GetEntityFacetsRequest,
options?: CatalogRequestOptions,
): Promise<Location_2 | undefined>;
): Promise<GetEntityFacetsResponse>;
getLocationById(
id: string,
options?: CatalogRequestOptions,
): Promise<Location_2 | undefined>;
getOriginLocationByEntity(
entity: Entity,
getLocationByRef(
locationRef: string,
options?: CatalogRequestOptions,
): Promise<Location_2 | undefined>;
refreshEntity(
@@ -71,23 +71,35 @@ export interface CatalogApi {
// @public
export class CatalogClient implements CatalogApi {
constructor(options: { discoveryApi: DiscoveryApi; fetchApi?: FetchApi });
constructor(options: {
discoveryApi: {
getBaseUrl(pluginId: string): Promise<string>;
};
fetchApi?: {
fetch: typeof fetch;
};
});
addLocation(
{ type, target, dryRun, presence }: AddLocationRequest,
options?: CatalogRequestOptions,
): Promise<AddLocationResponse>;
getEntities(
request?: CatalogEntitiesRequest,
request?: GetEntitiesRequest,
options?: CatalogRequestOptions,
): Promise<CatalogListResponse<Entity>>;
): Promise<GetEntitiesResponse>;
getEntityAncestors(
request: CatalogEntityAncestorsRequest,
request: GetEntityAncestorsRequest,
options?: CatalogRequestOptions,
): Promise<CatalogEntityAncestorsResponse>;
): Promise<GetEntityAncestorsResponse>;
getEntityByName(
compoundName: EntityName,
options?: CatalogRequestOptions,
): Promise<Entity | undefined>;
getEntityFacets(
request: GetEntityFacetsRequest,
options?: CatalogRequestOptions,
): Promise<GetEntityFacetsResponse>;
// @deprecated (undocumented)
getLocationByEntity(
entity: Entity,
options?: CatalogRequestOptions,
@@ -96,6 +108,11 @@ export class CatalogClient implements CatalogApi {
id: string,
options?: CatalogRequestOptions,
): Promise<Location_2 | undefined>;
getLocationByRef(
locationRef: string,
options?: CatalogRequestOptions,
): Promise<Location_2 | undefined>;
// @deprecated (undocumented)
getOriginLocationByEntity(
entity: Entity,
options?: CatalogRequestOptions,
@@ -114,53 +131,86 @@ export class CatalogClient implements CatalogApi {
): Promise<void>;
}
// @public
export type CatalogEntitiesRequest = {
filter?:
| Record<string, string | symbol | (string | symbol)[]>[]
| Record<string, string | symbol | (string | symbol)[]>
| undefined;
fields?: string[] | undefined;
offset?: number;
limit?: number;
after?: string;
};
// @public @deprecated (undocumented)
export type CatalogEntitiesRequest = GetEntitiesRequest;
// @public @deprecated (undocumented)
export type CatalogEntityAncestorsRequest = GetEntityAncestorsRequest;
// @public @deprecated (undocumented)
export type CatalogEntityAncestorsResponse = GetEntityAncestorsResponse;
// @public @deprecated (undocumented)
export type CatalogListResponse<_Entity> = GetEntitiesResponse;
// @public
export type CatalogEntityAncestorsRequest = {
entityRef: string;
};
// @public
export type CatalogEntityAncestorsResponse = {
rootEntityRef: string;
items: {
entity: Entity;
parentEntityRefs: string[];
}[];
};
// @public
export type CatalogListResponse<T> = {
items: T[];
};
// @public
export type CatalogRequestOptions = {
export interface CatalogRequestOptions {
// (undocumented)
token?: string;
};
// @public
export type DiscoveryApi = {
getBaseUrl(pluginId: string): Promise<string>;
};
}
// @public
export const ENTITY_STATUS_CATALOG_PROCESSING_TYPE =
'backstage.io/catalog-processing';
// @public
export type FetchApi = {
fetch: typeof fetch;
};
export interface GetEntitiesRequest {
after?: string;
fields?: string[] | undefined;
filter?:
| Record<string, string | symbol | (string | symbol)[]>[]
| Record<string, string | symbol | (string | symbol)[]>
| undefined;
limit?: number;
offset?: number;
}
// @public
export interface GetEntitiesResponse {
// (undocumented)
items: Entity[];
}
// @public
export interface GetEntityAncestorsRequest {
// (undocumented)
entityRef: string;
}
// @public
export interface GetEntityAncestorsResponse {
// (undocumented)
items: Array<{
entity: Entity;
parentEntityRefs: string[];
}>;
// (undocumented)
rootEntityRef: string;
}
// @public
export interface GetEntityFacetsRequest {
facets: string[];
filter?:
| Record<string, string | symbol | (string | symbol)[]>[]
| Record<string, string | symbol | (string | symbol)[]>
| undefined;
}
// @public
export interface GetEntityFacetsResponse {
facets: Record<
string,
Array<{
value: string;
count: number;
}>
>;
}
// @public
type Location_2 = {
id: string;
} & LocationSpec;
export { Location_2 as Location };
```
+13 -10
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/catalog-client",
"description": "An isomorphic client for the catalog backend",
"version": "0.6.0",
"version": "0.7.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -12,6 +12,9 @@
"module": "dist/index.esm.js",
"types": "dist/index.d.ts"
},
"backstage": {
"role": "common-library"
},
"homepage": "https://backstage.io",
"repository": {
"type": "git",
@@ -22,20 +25,20 @@
"backstage"
],
"scripts": {
"build": "backstage-cli build",
"lint": "backstage-cli lint",
"test": "backstage-cli test",
"prepack": "backstage-cli prepack",
"postpack": "backstage-cli postpack",
"clean": "backstage-cli clean"
"build": "backstage-cli package build",
"lint": "backstage-cli package lint",
"test": "backstage-cli package test",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
"clean": "backstage-cli package clean"
},
"dependencies": {
"@backstage/catalog-model": "^0.9.10",
"@backstage/errors": "^0.2.0",
"@backstage/catalog-model": "^0.10.0",
"@backstage/errors": "^0.2.1",
"cross-fetch": "^3.1.5"
},
"devDependencies": {
"@backstage/cli": "^0.13.2",
"@backstage/cli": "^0.14.0",
"@types/jest": "^26.0.7",
"msw": "^0.35.0"
},
@@ -18,7 +18,7 @@ import { Entity } from '@backstage/catalog-model';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { CatalogClient } from './CatalogClient';
import { CATALOG_FILTER_EXISTS, CatalogListResponse } from './types/api';
import { CATALOG_FILTER_EXISTS, GetEntitiesResponse } from './types/api';
import { DiscoveryApi } from './types/discovery';
const server = setupServer();
@@ -60,7 +60,7 @@ describe('CatalogClient', () => {
},
},
];
const defaultResponse: CatalogListResponse<Entity> = {
const defaultResponse: GetEntitiesResponse = {
items: defaultServiceResponse.reverse(),
};
+94 -95
View File
@@ -15,14 +15,13 @@
*/
import {
ANNOTATION_LOCATION,
ANNOTATION_ORIGIN_LOCATION,
Entity,
EntityName,
Location,
LOCATION_ANNOTATION,
ORIGIN_LOCATION_ANNOTATION,
parseEntityRef,
stringifyEntityRef,
stringifyLocationReference,
stringifyLocationRef,
} from '@backstage/catalog-model';
import { ResponseError } from '@backstage/errors';
import crossFetch from 'cross-fetch';
@@ -31,43 +30,43 @@ import {
AddLocationRequest,
AddLocationResponse,
CatalogApi,
CatalogEntitiesRequest,
CatalogListResponse,
GetEntitiesRequest,
GetEntitiesResponse,
CatalogRequestOptions,
CatalogEntityAncestorsRequest,
CatalogEntityAncestorsResponse,
GetEntityAncestorsRequest,
GetEntityAncestorsResponse,
Location,
GetEntityFacetsRequest,
GetEntityFacetsResponse,
} from './types/api';
import { DiscoveryApi } from './types/discovery';
import { FetchApi } from './types/fetch';
/**
* A frontend and backend compatible client for communicating with the Backstage Catalog.
* A frontend and backend compatible client for communicating with the Backstage
* software catalog.
*
* @public
* */
*/
export class CatalogClient implements CatalogApi {
private readonly discoveryApi: DiscoveryApi;
private readonly fetchApi: FetchApi;
constructor(options: { discoveryApi: DiscoveryApi; fetchApi?: FetchApi }) {
constructor(options: {
discoveryApi: { getBaseUrl(pluginId: string): Promise<string> };
fetchApi?: { fetch: typeof fetch };
}) {
this.discoveryApi = options.discoveryApi;
this.fetchApi = options.fetchApi || { fetch: crossFetch };
}
/**
* Gets the Ancestors of an Entity.
*
* @param request - A request type for retrieving Entity ancestors.
* @param options - An object with your preferred options.
*
* @returns A CatalogEntityAncestorsResponse.
*
* @public
* {@inheritdoc CatalogApi.getEntityAncestors}
*/
async getEntityAncestors(
request: CatalogEntityAncestorsRequest,
request: GetEntityAncestorsRequest,
options?: CatalogRequestOptions,
): Promise<CatalogEntityAncestorsResponse> {
): Promise<GetEntityAncestorsResponse> {
const { kind, namespace, name } = parseEntityRef(request.entityRef);
return await this.requestRequired(
'GET',
@@ -79,14 +78,7 @@ export class CatalogClient implements CatalogApi {
}
/**
* Gets a Location by Id.
*
* @param id - A string containing the Id.
* @param options - An object with your preferred options.
*
* @returns A {@link catalog-model#Location_2}.
*
* @public
* {@inheritdoc CatalogApi.getLocationById}
*/
async getLocationById(
id: string,
@@ -100,28 +92,20 @@ export class CatalogClient implements CatalogApi {
}
/**
* Gets a set of Entities.
*
* @param request - A request type for retrieving an Entity.
* @param options - An object with your preferred options.
*
* @returns A CatalogListResponse.
*
* @public
* {@inheritdoc CatalogApi.getEntities}
*/
async getEntities(
request?: CatalogEntitiesRequest,
request?: GetEntitiesRequest,
options?: CatalogRequestOptions,
): Promise<CatalogListResponse<Entity>> {
): Promise<GetEntitiesResponse> {
const { filter = [], fields = [], offset, limit, after } = request ?? {};
const filterItems = [filter].flat();
const params: string[] = [];
// filter param can occur multiple times, for example
// /api/catalog/entities?filter=metadata.name=wayback-search,kind=component&filter=metadata.name=www-artist,kind=component'
// the "outer array" defined by `filter` occurrences corresponds to "anyOf" filters
// the "inner array" defined within a `filter` param corresponds to "allOf" filters
for (const filterItem of filterItems) {
for (const filterItem of [filter].flat()) {
const filterParts: string[] = [];
for (const [key, value] of Object.entries(filterItem)) {
for (const v of [value].flat()) {
@@ -187,14 +171,7 @@ export class CatalogClient implements CatalogApi {
}
/**
* Gets a given Entity based on a provided name.
*
* @param compoundName - A string containing the name.
* @param options - An object with your preferred options.
*
* @returns An {@link catalog-model#Entity}.
*
* @public
* {@inheritdoc CatalogApi.getEntityByName}
*/
async getEntityByName(
compoundName: EntityName,
@@ -211,12 +188,7 @@ export class CatalogClient implements CatalogApi {
}
/**
* Refreshes an Entity.
*
* @param entityRef - A string containing the entityREf
* @param options - An object with your preferred options.
*
* @public
* {@inheritdoc CatalogApi.refreshEntity}
*/
async refreshEntity(entityRef: string, options?: CatalogRequestOptions) {
const response = await this.fetchApi.fetch(
@@ -237,14 +209,48 @@ export class CatalogClient implements CatalogApi {
}
/**
* Adds a location.
*
* @param options - An object with your preferred options.
* @param AddLocationRequest - A request object for adding locations.
*
* @returns An AddLocationResponse
*
* @public
* {@inheritdoc CatalogApi.getEntityFacets}
*/
async getEntityFacets(
request: GetEntityFacetsRequest,
options?: CatalogRequestOptions,
): Promise<GetEntityFacetsResponse> {
const { filter = [], facets } = request;
const params: string[] = [];
// filter param can occur multiple times, for example
// /api/catalog/entities?filter=metadata.name=wayback-search,kind=component&filter=metadata.name=www-artist,kind=component'
// the "outer array" defined by `filter` occurrences corresponds to "anyOf" filters
// the "inner array" defined within a `filter` param corresponds to "allOf" filters
for (const filterItem of [filter].flat()) {
const filterParts: string[] = [];
for (const [key, value] of Object.entries(filterItem)) {
for (const v of [value].flat()) {
if (v === CATALOG_FILTER_EXISTS) {
filterParts.push(encodeURIComponent(key));
} else if (typeof v === 'string') {
filterParts.push(
`${encodeURIComponent(key)}=${encodeURIComponent(v)}`,
);
}
}
}
if (filterParts.length) {
params.push(`filter=${filterParts.join(',')}`);
}
}
for (const facet of facets) {
params.push(`facet=${encodeURIComponent(facet)}`);
}
const query = params.length ? `?${params.join('&')}` : '';
return await this.requestOptional('GET', `/entity-facets${query}`, options);
}
/**
* {@inheritdoc CatalogApi.addLocation}
*/
async addLocation(
{ type = 'url', target, dryRun, presence }: AddLocationRequest,
@@ -282,21 +288,14 @@ export class CatalogClient implements CatalogApi {
}
/**
* Gets an origin Location By Entity.
*
* @param entity - An Entity
* @param options - An object with your preferred options.
*
* @returns A {@link catalog-model#Location_2}.
*
* @public
* @deprecated please use getLocationByRef instead
*/
async getOriginLocationByEntity(
entity: Entity,
options?: CatalogRequestOptions,
): Promise<Location | undefined> {
const locationCompound =
entity.metadata.annotations?.[ORIGIN_LOCATION_ANNOTATION];
entity.metadata.annotations?.[ANNOTATION_ORIGIN_LOCATION];
if (!locationCompound) {
return undefined;
}
@@ -307,24 +306,17 @@ export class CatalogClient implements CatalogApi {
);
return all
.map(r => r.data)
.find(l => locationCompound === stringifyLocationReference(l));
.find(l => locationCompound === stringifyLocationRef(l));
}
/**
* Gets a Location by Entity.
*
* @param entity - An Entity
* @param options - An object with your preferred options.
*
* @returns A {@link catalog-model#Location_2}.
*
* @public
* @deprecated please use getLocationByRef instead
*/
async getLocationByEntity(
entity: Entity,
options?: CatalogRequestOptions,
): Promise<Location | undefined> {
const locationCompound = entity.metadata.annotations?.[LOCATION_ANNOTATION];
const locationCompound = entity.metadata.annotations?.[ANNOTATION_LOCATION];
if (!locationCompound) {
return undefined;
}
@@ -335,16 +327,28 @@ export class CatalogClient implements CatalogApi {
);
return all
.map(r => r.data)
.find(l => locationCompound === stringifyLocationReference(l));
.find(l => locationCompound === stringifyLocationRef(l));
}
/**
* Removes a location as identified by Id.
*
* @param id - A string containing the Id
* @param options - An object with your preferred options.
*
* @public
* {@inheritdoc CatalogApi.getLocationByRef}
*/
async getLocationByRef(
locationRef: string,
options?: CatalogRequestOptions,
): Promise<Location | undefined> {
const all: { data: Location }[] = await this.requestRequired(
'GET',
'/locations',
options,
);
return all
.map(r => r.data)
.find(l => locationRef === stringifyLocationRef(l));
}
/**
* {@inheritdoc CatalogApi.removeLocationById}
*/
async removeLocationById(
id: string,
@@ -358,12 +362,7 @@ export class CatalogClient implements CatalogApi {
}
/**
* Removes an Entity as identified by Uid.
*
* @param uid - A string containing the Uid
* @param options - An object with your preferred options.
*
* @public
* {@inheritdoc CatalogApi.removeEntityByUid}
*/
async removeEntityByUid(
uid: string,
+244 -149
View File
@@ -14,21 +14,26 @@
* limitations under the License.
*/
import { Entity, EntityName, Location } from '@backstage/catalog-model';
import { Entity, EntityName, LocationSpec } from '@backstage/catalog-model';
/**
* A Symbol to define if a catalog filter exists or not.
* This symbol can be used in place of a value when passed to filters in e.g.
* {@link CatalogClient.getEntities}, to signify that you want to filter on the
* presence of that key no matter what its value is.
*
* @public
*/
export const CATALOG_FILTER_EXISTS = Symbol('CATALOG_FILTER_EXISTS');
export const CATALOG_FILTER_EXISTS = Symbol.for(
// Random UUID to ensure no collisions
'CATALOG_FILTER_EXISTS_0e15b590c0b343a2bae3e787e84c2111',
);
/**
* A request type for retrieving catalog Entities.
* The request type for {@link CatalogClient.getEntities}.
*
* @public
*/
export type CatalogEntitiesRequest = {
export interface GetEntitiesRequest {
/**
* If given, return only entities that match the given patterns.
*
@@ -104,175 +109,143 @@ export type CatalogEntitiesRequest = {
* request.
*/
after?: string;
};
}
/**
* A request type for Catalog Entity Ancestor information.
* The response type for {@link CatalogClient.getEntities}.
*
* @public
*/
export type CatalogEntityAncestorsRequest = {
export interface GetEntitiesResponse {
items: Entity[];
}
/**
* The request type for {@link CatalogClient.getEntityAncestors}.
*
* @public
*/
export interface GetEntityAncestorsRequest {
entityRef: string;
};
}
/**
* A response type for Catalog Entity Ancestor information.
* The response type for {@link CatalogClient.getEntityAncestors}.
*
* @public
*/
export type CatalogEntityAncestorsResponse = {
export interface GetEntityAncestorsResponse {
rootEntityRef: string;
items: { entity: Entity; parentEntityRefs: string[] }[];
};
items: Array<{
entity: Entity;
parentEntityRefs: string[];
}>;
}
/**
* A response type for the result of a catalog operation in list form.
* The request type for {@link CatalogClient.getEntityFacets}.
*
* @public
*/
export type CatalogListResponse<T> = {
items: T[];
};
export interface GetEntityFacetsRequest {
/**
* If given, return only entities that match the given patterns.
*
* @remarks
*
* If multiple filter sets are given as an array, then there is effectively an
* OR between each filter set.
*
* Within one filter set, there is effectively an AND between the various
* keys.
*
* Within one key, if there are more than one value, then there is effectively
* an OR between them.
*
* Example: For an input of
*
* ```
* [
* { kind: ['API', 'Component'] },
* { 'metadata.name': 'a', 'metadata.namespace': 'b' }
* ]
* ```
*
* This effectively means
*
* ```
* (kind = EITHER 'API' OR 'Component')
* OR
* (metadata.name = 'a' AND metadata.namespace = 'b' )
* ```
*
* Each key is a dot separated path in each object.
*
* As a value you can also pass in the symbol `CATALOG_FILTER_EXISTS`
* (exported from this package), which means that you assert on the existence
* of that key, no matter what its value is.
*/
filter?:
| Record<string, string | symbol | (string | symbol)[]>[]
| Record<string, string | symbol | (string | symbol)[]>
| undefined;
/**
* Dot separated paths for the facets to extract from each entity.
*
* @remarks
*
* Example: For an input of `['kind', 'metadata.annotations.backstage.io/orphan']`, then the
* response will be shaped like
*
* ```
* {
* "facets": {
* "kind": [
* { "key": "Component", "count": 22 },
* { "key": "API", "count": 13 }
* ],
* "metadata.annotations.backstage.io/orphan": [
* { "key": "true", "count": 2 }
* ]
* }
* }
* ```
*/
facets: string[];
}
/**
* The response type for {@link CatalogClient.getEntityFacets}.
*
* @public
*/
export interface GetEntityFacetsResponse {
/**
* The computed facets, one entry per facet in the request.
*/
facets: Record<string, Array<{ value: string; count: number }>>;
}
/**
* Options you can pass into a catalog request for additional information.
*
* @public
*/
export type CatalogRequestOptions = {
export interface CatalogRequestOptions {
token?: string;
};
/**
* Public functions for interacting with the Catalog API.
*
* @public
*/
export interface CatalogApi {
/**
* Gets the Entities from the catalog based on your request and options.
*
* @param request - An object with your filters and fields.
* @param options - An object with your preferred options.
*
* @returns A CatalogListResponse with items typed Catalog Model Entity.
*
*/
getEntities(
request?: CatalogEntitiesRequest,
options?: CatalogRequestOptions,
): Promise<CatalogListResponse<Entity>>;
/**
* Gets the Entity ancestor information from the catalog based on your request and options.
*
* @param request - An object with your filters and fields.
* @param options - An object with your preferred options.
*
* @returns A CatalogEntityAncestorsResponse.
*/
getEntityAncestors(
request: CatalogEntityAncestorsRequest,
options?: CatalogRequestOptions,
): Promise<CatalogEntityAncestorsResponse>;
/**
* Gets a single Entity from the catalog by Entity name.
*
* @param name - A complete Entity name, with the full kind-namespace-name triplet.
* @param options - An object with your preferred options.
*
* @returns A {@link catalog-model#Entity}.
*/
getEntityByName(
name: EntityName,
options?: CatalogRequestOptions,
): Promise<Entity | undefined>;
/**
* Removes a single Entity from the catalog by Entity UID.
*
* @param uid - A string of the Entity UID.
* @param options - An object with your preferred options.
*
*/
removeEntityByUid(
uid: string,
options?: CatalogRequestOptions,
): Promise<void>;
/**
* Refreshes an Entity in the catalog.
*
* @param entityRef - A string in the form of 'Kind/default:foo'.
* @param options - An object with your preferred options.
*
*/
refreshEntity(
entityRef: string,
options?: CatalogRequestOptions,
): Promise<void>;
// Locations
/**
* Gets a Location object by ID from the catalog.
*
* @param id - A string in of the Location Id.
* @param options - An object with your preferred options.
*
* @returns A {@link catalog-model#Location_2}.
*/
getLocationById(
id: string,
options?: CatalogRequestOptions,
): Promise<Location | undefined>;
/**
* Gets origin location by Entity.
*
* @param entity - An {@link catalog-model#Entity}.
* @param options - An object with your preferred options.
*
* @returns A {@link catalog-model#Location_2}.
*/
getOriginLocationByEntity(
entity: Entity,
options?: CatalogRequestOptions,
): Promise<Location | undefined>;
/**
* Gets Location by Entity.
*
* @param entity - An {@link catalog-model#Entity}.
* @param options - An object with your preferred options.
*
* @returns A {@link catalog-model#Location_2}.
*/
getLocationByEntity(
entity: Entity,
options?: CatalogRequestOptions,
): Promise<Location | undefined>;
/**
* Adds a Location.
*
* @param location - A request type for adding a Location to the catalog.
* @param options - An object with your preferred options.
*
* @returns A AddLocationResponse.
*/
addLocation(
location: AddLocationRequest,
options?: CatalogRequestOptions,
): Promise<AddLocationResponse>;
/**
* Removes a Location by Id.
*
* @param id - A string in of the Location Id.
* @param options - An object with your preferred options.
*
*/
removeLocationById(
id: string,
options?: CatalogRequestOptions,
): Promise<void>;
}
/**
* A request type for adding a Location to the catalog.
* Entity location for a specific entity.
*
* @public
*/
export type Location = {
id: string;
} & LocationSpec;
/**
* The request type for {@link CatalogClient.addLocation}.
*
* @public
*/
@@ -284,13 +257,135 @@ export type AddLocationRequest = {
};
/**
* A response type for adding a Location to the catalog.
* The response type for {@link CatalogClient.addLocation}.
*
* @public
*/
export type AddLocationResponse = {
location: Location;
entities: Entity[];
// Exists is only set in DryRun mode.
// Only set in dryRun mode.
exists?: boolean;
};
/**
* A client for interacting with the Backstage software catalog through its API.
*
* @public
*/
export interface CatalogApi {
/**
* Lists catalog entities.
*
* @param request - Request parameters
* @param options - Additional options
*/
getEntities(
request?: GetEntitiesRequest,
options?: CatalogRequestOptions,
): Promise<GetEntitiesResponse>;
/**
* Gets entity ancestor information, i.e. the hierarchy of parent entities
* whose processing resulted in a given entity appearing in the catalog.
*
* @param request - Request parameters
* @param options - Additional options
*/
getEntityAncestors(
request: GetEntityAncestorsRequest,
options?: CatalogRequestOptions,
): Promise<GetEntityAncestorsResponse>;
/**
* Gets a single entity from the catalog by its ref (kind, namespace, name)
* triplet.
*
* @param name - A complete entity ref
* @param options - Additional options
*/
getEntityByName(
name: EntityName,
options?: CatalogRequestOptions,
): Promise<Entity | undefined>;
/**
* Removes a single entity from the catalog by entity UID.
*
* @param uid - An entity UID
* @param options - Additional options
*/
removeEntityByUid(
uid: string,
options?: CatalogRequestOptions,
): Promise<void>;
/**
* Refreshes (marks for reprocessing) an entity in the catalog.
*
* @param entityRef - An entity ref on string form (e.g.
* 'component/default:my-component')
* @param options - Additional options
*/
refreshEntity(
entityRef: string,
options?: CatalogRequestOptions,
): Promise<void>;
/**
* Gets a summary of field facets of entities in the catalog.
*
* @param request - Request parameters
* @param options - Additional options
*/
getEntityFacets(
request: GetEntityFacetsRequest,
options?: CatalogRequestOptions,
): Promise<GetEntityFacetsResponse>;
// Locations
/**
* Gets a registered location by its ID.
*
* @param id - A location ID
* @param options - Additional options
*/
getLocationById(
id: string,
options?: CatalogRequestOptions,
): Promise<Location | undefined>;
/**
* Gets a registered location by its ref.
*
* @param locationRef - A location ref, e.g. "url:https://github.com/..."
* @param options - Additional options
*/
getLocationByRef(
locationRef: string,
options?: CatalogRequestOptions,
): Promise<Location | undefined>;
/**
* Registers a new location.
*
* @param location - Request parameters
* @param options - Additional options
*/
addLocation(
location: AddLocationRequest,
options?: CatalogRequestOptions,
): Promise<AddLocationResponse>;
/**
* Removes a registered Location by its ID.
*
* @param id - A location ID
* @param options - Additional options
*/
removeLocationById(
id: string,
options?: CatalogRequestOptions,
): Promise<void>;
}
@@ -0,0 +1,43 @@
/*
* Copyright 2022 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
GetEntitiesRequest,
GetEntitiesResponse,
GetEntityAncestorsRequest,
GetEntityAncestorsResponse,
} from './api';
/**
* @public
* @deprecated use GetEntitiesRequest instead
*/
export type CatalogEntitiesRequest = GetEntitiesRequest;
/**
* @public
* @deprecated use GetEntitiesResponse instead
*/
export type CatalogListResponse<_Entity> = GetEntitiesResponse;
/**
* @public
* @deprecated use GetEntityAncestorsRequest instead
*/
export type CatalogEntityAncestorsRequest = GetEntityAncestorsRequest;
/**
* @public
* @deprecated use GetEntityAncestorsResponse instead
*/
export type CatalogEntityAncestorsResponse = GetEntityAncestorsResponse;
@@ -16,8 +16,6 @@
/**
* This is a copy of the DiscoveryApi, to avoid importing core-plugin-api.
*
* @public
*/
export type DiscoveryApi = {
getBaseUrl(pluginId: string): Promise<string>;
@@ -16,8 +16,6 @@
/**
* This is a copy of FetchApi, to avoid importing core-plugin-api.
*
* @public
*/
export type FetchApi = {
fetch: typeof fetch;
+9 -7
View File
@@ -14,17 +14,19 @@
* limitations under the License.
*/
export { CATALOG_FILTER_EXISTS } from './api';
export type {
AddLocationRequest,
AddLocationResponse,
CatalogApi,
CatalogEntitiesRequest,
CatalogListResponse,
CatalogRequestOptions,
CatalogEntityAncestorsRequest,
CatalogEntityAncestorsResponse,
GetEntitiesRequest,
GetEntitiesResponse,
GetEntityAncestorsRequest,
GetEntityAncestorsResponse,
Location,
GetEntityFacetsRequest,
GetEntityFacetsResponse,
} from './api';
export type { DiscoveryApi } from './discovery';
export type { FetchApi } from './fetch';
export { CATALOG_FILTER_EXISTS } from './api';
export * from './deprecated';
export { ENTITY_STATUS_CATALOG_PROCESSING_TYPE } from './status';

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