Merge remote-tracking branch 'backstage/master' into erikengervall/plugin-release-manager-as-a-service

This commit is contained in:
Erik Engervall
2021-05-07 11:52:38 +02:00
149 changed files with 1889 additions and 808 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-explore': patch
---
Add "Organization" tab with a diagram
-56
View File
@@ -1,56 +0,0 @@
---
'@backstage/plugin-scaffolder-backend': minor
---
Migrate the plugin to use the `ContainerRunner` interface instead of `runDockerContainer(…)`.
It also provides the `ContainerRunner` to the individual templaters instead of to the `createRouter` function.
To apply this change to an existing backend application, add the following to `src/plugins/scaffolder.ts`:
```diff
- import { SingleHostDiscovery } from '@backstage/backend-common';
+ import {
+ DockerContainerRunner,
+ SingleHostDiscovery,
+ } from '@backstage/backend-common';
export default async function createPlugin({
logger,
config,
database,
reader,
}: PluginEnvironment): Promise<Router> {
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
+ const cookiecutterTemplater = new CookieCutter({ containerRunner });
- const cookiecutterTemplater = new CookieCutter();
+ const craTemplater = new CreateReactAppTemplater({ containerRunner });
- const craTemplater = new CreateReactAppTemplater();
const templaters = new Templaters();
templaters.register('cookiecutter', cookiecutterTemplater);
templaters.register('cra', craTemplater);
const preparers = await Preparers.fromConfig(config, { logger });
const publishers = await Publishers.fromConfig(config, { logger });
- const dockerClient = new Docker();
const discovery = SingleHostDiscovery.fromConfig(config);
const catalogClient = new CatalogClient({ discoveryApi: discovery });
return await createRouter({
preparers,
templaters,
publishers,
logger,
config,
- dockerClient,
database,
catalogClient,
reader,
});
}
```
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/cli': patch
'@backstage/create-app': patch
'@backstage/plugin-catalog-graphql': patch
---
chore: bump `ts-node` versions to 9.1.1
@@ -1,5 +0,0 @@
---
'@backstage/plugin-cost-insights': minor
---
make change ratio optional
-58
View File
@@ -1,58 +0,0 @@
---
'@backstage/backend-common': minor
---
Refactor the `runDockerContainer(…)` function to an interface-based api.
This gives the option to replace the docker runtime in the future.
Packages and plugins that previously used the `dockerode` as argument should be migrated to use the new `ContainerRunner` interface instead.
```diff
import {
- runDockerContainer,
+ ContainerRunner,
PluginEndpointDiscovery,
} from '@backstage/backend-common';
- import Docker from 'dockerode';
type RouterOptions = {
// ...
- dockerClient: Docker,
+ containerRunner: ContainerRunner;
};
export async function createRouter({
// ...
- dockerClient,
+ containerRunner,
}: RouterOptions): Promise<express.Router> {
// ...
+ await containerRunner.runContainer({
- await runDockerContainer({
image: 'docker',
// ...
- dockerClient,
});
// ...
}
```
To keep the `dockerode` based runtime, use the `DockerContainerRunner` implementation:
```diff
+ import {
+ ContainerRunner,
+ DockerContainerRunner
+ } from '@backstage/backend-common';
- import { runDockerContainer } from '@backstage/backend-common';
+ const containerRunner: ContainerRunner = new DockerContainerRunner({dockerClient});
+ await containerRunner.runContainer({
- await runDockerContainer({
image: 'docker',
// ...
- dockerClient,
});
```
-61
View File
@@ -1,61 +0,0 @@
---
'@backstage/plugin-techdocs-backend': minor
---
Migrate the plugin to use the `ContainerRunner` interface instead of `runDockerContainer(…)`.
It also provides the `ContainerRunner` to the generators instead of to the `createRouter` function.
To apply this change to an existing backend application, add the following to `src/plugins/techdocs.ts`:
```diff
+ import { DockerContainerRunner } from '@backstage/backend-common';
// ...
export default async function createPlugin({
logger,
config,
discovery,
reader,
}: PluginEnvironment): Promise<Router> {
// Preparers are responsible for fetching source files for documentation.
const preparers = await Preparers.fromConfig(config, {
logger,
reader,
});
+ // Docker client (conditionally) used by the generators, based on techdocs.generators config.
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
// Generators are used for generating documentation sites.
const generators = await Generators.fromConfig(config, {
logger,
+ containerRunner,
});
// Publisher is used for
// 1. Publishing generated files to storage
// 2. Fetching files from storage and passing them to TechDocs frontend.
const publisher = await Publisher.fromConfig(config, {
logger,
discovery,
});
// checks if the publisher is working and logs the result
await publisher.getReadiness();
- // Docker client (conditionally) used by the generators, based on techdocs.generators config.
- const dockerClient = new Docker();
return await createRouter({
preparers,
generators,
publisher,
- dockerClient,
logger,
config,
discovery,
});
}
```
-10
View File
@@ -1,10 +0,0 @@
---
'@backstage/backend-common': patch
'@backstage/create-app': patch
'@backstage/integration': patch
'@backstage/plugin-catalog-import': patch
'@backstage/plugin-github-actions': patch
'@backstage/plugin-scaffolder-backend': patch
---
The default `@octokit/rest` dependency was bumped to `"^18.5.3"`.
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/cli': patch
'@backstage/core': patch
---
Fix some transitive dependency warnings in yarn
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-react': patch
---
Fetch relations in batches in `useRelatedEntities`
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/core': patch
'@backstage/plugin-catalog-import': patch
---
Bump react-hook-form version to be the same for the entire project.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder': patch
---
Show error on task page if task does not exist.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend': patch
---
Expose `BitbucketRepositoryParser` introduced in [#5295](https://github.com/backstage/backstage/pull/5295)
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/theme': patch
---
Remove extra bottom padding in InfoCard content
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/cli': patch
---
Added lax option to backstage-cli app:build command
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Fix GithubPR built-in action `credentialsProvider.getCredentials` URL.
Adding Documentation for GitHub PR built-in action.
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/plugin-kubernetes': patch
'@backstage/plugin-kubernetes-backend': patch
---
Adds @backstage/plugin-kubernetes-common library to share types between kubernetes frontend and backend.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
bump `jsonschema` from 1.2.7 to 1.4.0
-27
View File
@@ -1,27 +0,0 @@
---
'@backstage/techdocs-common': minor
---
Migrate the package to use the `ContainerRunner` interface instead of `runDockerContainer(…)`.
It also no longer provides the `ContainerRunner` as an input to the `GeneratorBase#run(…)` function, but expects it as a constructor parameter instead.
If you use the `TechdocsGenerator` you need to update the usage:
```diff
+ const containerRunner = new DockerContainerRunner({ dockerClient });
- const generator = new TechdocsGenerator(logger, config);
+ const techdocsGenerator = new TechdocsGenerator({
+ logger,
+ containerRunner,
+ config,
+ });
await this.generator.run({
inputDir: preparedDir,
outputDir,
- dockerClient: this.dockerClient,
parsedLocationAnnotation,
etag: newEtag,
});
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-tech-radar': patch
---
Update README for composability
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend': patch
---
Add support for non-organization accounts in GitHub Discovery
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-scaffolder': patch
---
Close eventSource upon completion of a scaffolder task
@@ -1,5 +0,0 @@
---
'@backstage/plugin-techdocs': patch
---
Fix navigation in a page using the table of contents.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-techdocs': patch
---
Make git config optional for techdocs feedback links
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-proxy-backend': patch
---
Prefix proxy routes with `/` if not present in configuration
-9
View File
@@ -1,9 +0,0 @@
---
'@backstage/catalog-model': patch
'@backstage/cli': patch
'@backstage/config-loader': patch
'@backstage/config': patch
'@backstage/plugin-scaffolder': patch
---
Bump `json-schema` dependency from `0.2.5` to `0.3.0`.
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/techdocs-common': patch
---
Adding optional config to enable S3-like API for tech-docs using s3ForcePathStyle option.
This allows providers like LocalStack, Minio and Wasabi (+possibly others) to be used to host tech docs.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/catalog-client': patch
---
Allow `filter` parameter to be specified multiple times
-115
View File
@@ -1,115 +0,0 @@
---
'@backstage/create-app': patch
---
The `scaffolder-backend` and `techdocs-backend` plugins have been updated.
In order to update, you need to apply the following changes to your existing backend application:
`@backstage/plugin-techdocs-backend`:
```diff
// packages/backend/src/plugin/techdocs.ts
+ import { DockerContainerRunner } from '@backstage/backend-common';
// ...
export default async function createPlugin({
logger,
config,
discovery,
reader,
}: PluginEnvironment): Promise<Router> {
// Preparers are responsible for fetching source files for documentation.
const preparers = await Preparers.fromConfig(config, {
logger,
reader,
});
+ // Docker client (conditionally) used by the generators, based on techdocs.generators config.
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
// Generators are used for generating documentation sites.
const generators = await Generators.fromConfig(config, {
logger,
+ containerRunner,
});
// Publisher is used for
// 1. Publishing generated files to storage
// 2. Fetching files from storage and passing them to TechDocs frontend.
const publisher = await Publisher.fromConfig(config, {
logger,
discovery,
});
// checks if the publisher is working and logs the result
await publisher.getReadiness();
- // Docker client (conditionally) used by the generators, based on techdocs.generators config.
- const dockerClient = new Docker();
return await createRouter({
preparers,
generators,
publisher,
- dockerClient,
logger,
config,
discovery,
});
}
```
`@backstage/plugin-scaffolder-backend`:
```diff
// packages/backend/src/plugin/scaffolder.ts
- import { SingleHostDiscovery } from '@backstage/backend-common';
+ import {
+ DockerContainerRunner,
+ SingleHostDiscovery,
+ } from '@backstage/backend-common';
export default async function createPlugin({
logger,
config,
database,
reader,
}: PluginEnvironment): Promise<Router> {
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
+ const cookiecutterTemplater = new CookieCutter({ containerRunner });
- const cookiecutterTemplater = new CookieCutter();
+ const craTemplater = new CreateReactAppTemplater({ containerRunner });
- const craTemplater = new CreateReactAppTemplater();
const templaters = new Templaters();
templaters.register('cookiecutter', cookiecutterTemplater);
templaters.register('cra', craTemplater);
const preparers = await Preparers.fromConfig(config, { logger });
const publishers = await Publishers.fromConfig(config, { logger });
- const dockerClient = new Docker();
const discovery = SingleHostDiscovery.fromConfig(config);
const catalogClient = new CatalogClient({ discoveryApi: discovery });
return await createRouter({
preparers,
templaters,
publishers,
logger,
config,
- dockerClient,
database,
catalogClient,
reader,
});
}
```
+31
View File
@@ -1,5 +1,36 @@
# example-app
## 0.2.27
### Patch Changes
- Updated dependencies [6f1b82b14]
- Updated dependencies [38ca05168]
- Updated dependencies [f65adcde7]
- Updated dependencies [81c54d1f2]
- Updated dependencies [80888659b]
- Updated dependencies [7b8272fb7]
- Updated dependencies [8aedbb4af]
- Updated dependencies [fc79a6dd3]
- Updated dependencies [f53fba29f]
- Updated dependencies [b2e2ec753]
- Updated dependencies [9314a8592]
- Updated dependencies [2e05277e0]
- Updated dependencies [4075c6367]
- Updated dependencies [d8b81fd28]
- @backstage/plugin-cost-insights@0.9.0
- @backstage/plugin-catalog-import@0.5.5
- @backstage/plugin-github-actions@0.4.5
- @backstage/cli@0.6.10
- @backstage/core@0.7.8
- @backstage/plugin-catalog-react@0.1.5
- @backstage/theme@0.2.7
- @backstage/plugin-kubernetes@0.4.3
- @backstage/plugin-tech-radar@0.3.10
- @backstage/plugin-scaffolder@0.9.3
- @backstage/plugin-techdocs@0.9.1
- @backstage/catalog-model@0.7.8
## 0.2.26
### Patch Changes
+13 -13
View File
@@ -1,42 +1,42 @@
{
"name": "example-app",
"version": "0.2.26",
"version": "0.2.27",
"private": true,
"bundled": true,
"dependencies": {
"@backstage/catalog-model": "^0.7.7",
"@backstage/cli": "^0.6.9",
"@backstage/core": "^0.7.7",
"@backstage/catalog-model": "^0.7.8",
"@backstage/cli": "^0.6.10",
"@backstage/core": "^0.7.8",
"@backstage/integration-react": "^0.1.1",
"@backstage/plugin-api-docs": "^0.4.12",
"@backstage/plugin-badges": "^0.2.0",
"@backstage/plugin-catalog": "^0.5.6",
"@backstage/plugin-catalog-import": "^0.5.4",
"@backstage/plugin-catalog-react": "^0.1.3",
"@backstage/plugin-catalog-import": "^0.5.5",
"@backstage/plugin-catalog-react": "^0.1.5",
"@backstage/plugin-circleci": "^0.2.13",
"@backstage/plugin-cloudbuild": "^0.2.13",
"@backstage/plugin-code-coverage": "^0.1.2",
"@backstage/plugin-cost-insights": "^0.8.5",
"@backstage/plugin-cost-insights": "^0.9.0",
"@backstage/plugin-explore": "^0.3.4",
"@backstage/plugin-gcp-projects": "^0.2.5",
"@backstage/plugin-github-actions": "^0.4.4",
"@backstage/plugin-github-actions": "^0.4.5",
"@backstage/plugin-graphiql": "^0.2.10",
"@backstage/plugin-jenkins": "^0.4.2",
"@backstage/plugin-kafka": "^0.2.6",
"@backstage/plugin-kubernetes": "^0.4.2",
"@backstage/plugin-kubernetes": "^0.4.3",
"@backstage/plugin-lighthouse": "^0.2.15",
"@backstage/plugin-newrelic": "^0.2.6",
"@backstage/plugin-org": "^0.3.12",
"@backstage/plugin-pagerduty": "0.3.3",
"@backstage/plugin-rollbar": "^0.3.4",
"@backstage/plugin-scaffolder": "^0.9.2",
"@backstage/plugin-scaffolder": "^0.9.3",
"@backstage/plugin-search": "^0.3.5",
"@backstage/plugin-sentry": "^0.3.9",
"@backstage/plugin-tech-radar": "^0.3.9",
"@backstage/plugin-techdocs": "^0.9.0",
"@backstage/plugin-tech-radar": "^0.3.10",
"@backstage/plugin-techdocs": "^0.9.1",
"@backstage/plugin-todo": "^0.1.0",
"@backstage/plugin-user-settings": "^0.2.8",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@octokit/rest": "^18.5.3",
+68
View File
@@ -1,5 +1,73 @@
# @backstage/backend-common
## 0.7.0
### Minor Changes
- e0bfd3d44: Refactor the `runDockerContainer(…)` function to an interface-based api.
This gives the option to replace the docker runtime in the future.
Packages and plugins that previously used the `dockerode` as argument should be migrated to use the new `ContainerRunner` interface instead.
```diff
import {
- runDockerContainer,
+ ContainerRunner,
PluginEndpointDiscovery,
} from '@backstage/backend-common';
- import Docker from 'dockerode';
type RouterOptions = {
// ...
- dockerClient: Docker,
+ containerRunner: ContainerRunner;
};
export async function createRouter({
// ...
- dockerClient,
+ containerRunner,
}: RouterOptions): Promise<express.Router> {
// ...
+ await containerRunner.runContainer({
- await runDockerContainer({
image: 'docker',
// ...
- dockerClient,
});
// ...
}
```
To keep the `dockerode` based runtime, use the `DockerContainerRunner` implementation:
```diff
+ import {
+ ContainerRunner,
+ DockerContainerRunner
+ } from '@backstage/backend-common';
- import { runDockerContainer } from '@backstage/backend-common';
+ const containerRunner: ContainerRunner = new DockerContainerRunner({dockerClient});
+ await containerRunner.runContainer({
- await runDockerContainer({
image: 'docker',
// ...
- dockerClient,
});
```
### Patch Changes
- 38ca05168: The default `@octokit/rest` dependency was bumped to `"^18.5.3"`.
- Updated dependencies [38ca05168]
- Updated dependencies [d8b81fd28]
- @backstage/integration@0.5.2
- @backstage/config-loader@0.6.1
- @backstage/config@0.1.5
## 0.6.3
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.6.3",
"version": "0.7.0",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -30,10 +30,10 @@
},
"dependencies": {
"@backstage/cli-common": "^0.1.1",
"@backstage/config": "^0.1.4",
"@backstage/config-loader": "^0.6.0",
"@backstage/config": "^0.1.5",
"@backstage/config-loader": "^0.6.1",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.1",
"@backstage/integration": "^0.5.2",
"@google-cloud/storage": "^5.8.0",
"@octokit/rest": "^18.5.3",
"@types/cors": "^2.8.6",
@@ -73,7 +73,7 @@
}
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/test-utils": "^0.1.10",
"@types/archiver": "^5.1.0",
"@types/compression": "^1.7.0",
+36
View File
@@ -1,5 +1,41 @@
# example-backend
## 0.2.27
### Patch Changes
- Updated dependencies [e0bfd3d44]
- Updated dependencies [e0bfd3d44]
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [b219821a0]
- Updated dependencies [69eefb5ae]
- Updated dependencies [f53fba29f]
- Updated dependencies [75c8cec39]
- Updated dependencies [227439a72]
- Updated dependencies [cdb3426e5]
- Updated dependencies [d8b81fd28]
- Updated dependencies [d1b1306d9]
- @backstage/plugin-scaffolder-backend@0.11.0
- @backstage/backend-common@0.7.0
- @backstage/plugin-techdocs-backend@0.8.0
- @backstage/plugin-catalog-backend@0.8.2
- @backstage/plugin-kubernetes-backend@0.3.6
- @backstage/plugin-proxy-backend@0.2.7
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
- @backstage/catalog-client@0.3.11
- example-app@0.2.27
- @backstage/plugin-app-backend@0.3.12
- @backstage/plugin-auth-backend@0.3.9
- @backstage/plugin-badges-backend@0.1.3
- @backstage/plugin-code-coverage-backend@0.1.4
- @backstage/plugin-graphql-backend@0.1.7
- @backstage/plugin-kafka-backend@0.2.4
- @backstage/plugin-rollbar-backend@0.1.10
- @backstage/plugin-search-backend@0.1.4
- @backstage/plugin-todo-backend@0.1.4
## 0.2.25
### Patch Changes
+21 -21
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.2.25",
"version": "0.2.27",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -27,30 +27,30 @@
"migrate:create": "knex migrate:make -x ts"
},
"dependencies": {
"@backstage/backend-common": "^0.6.3",
"@backstage/catalog-client": "^0.3.9",
"@backstage/catalog-model": "^0.7.5",
"@backstage/config": "^0.1.4",
"@backstage/plugin-app-backend": "^0.3.10",
"@backstage/plugin-auth-backend": "^0.3.7",
"@backstage/plugin-badges-backend": "^0.1.1",
"@backstage/plugin-catalog-backend": "^0.8.0",
"@backstage/plugin-code-coverage-backend": "^0.1.2",
"@backstage/plugin-graphql-backend": "^0.1.6",
"@backstage/plugin-kubernetes-backend": "^0.3.5",
"@backstage/plugin-kafka-backend": "^0.2.3",
"@backstage/plugin-proxy-backend": "^0.2.6",
"@backstage/plugin-rollbar-backend": "^0.1.9",
"@backstage/plugin-scaffolder-backend": "^0.10.0",
"@backstage/plugin-search-backend": "^0.1.3",
"@backstage/backend-common": "^0.7.0",
"@backstage/catalog-client": "^0.3.11",
"@backstage/catalog-model": "^0.7.8",
"@backstage/config": "^0.1.5",
"@backstage/plugin-app-backend": "^0.3.12",
"@backstage/plugin-auth-backend": "^0.3.9",
"@backstage/plugin-badges-backend": "^0.1.3",
"@backstage/plugin-catalog-backend": "^0.8.2",
"@backstage/plugin-code-coverage-backend": "^0.1.4",
"@backstage/plugin-graphql-backend": "^0.1.7",
"@backstage/plugin-kubernetes-backend": "^0.3.6",
"@backstage/plugin-kafka-backend": "^0.2.4",
"@backstage/plugin-proxy-backend": "^0.2.7",
"@backstage/plugin-rollbar-backend": "^0.1.10",
"@backstage/plugin-scaffolder-backend": "^0.11.0",
"@backstage/plugin-search-backend": "^0.1.4",
"@backstage/plugin-search-backend-node": "^0.1.3",
"@backstage/plugin-techdocs-backend": "^0.7.0",
"@backstage/plugin-todo-backend": "^0.1.3",
"@backstage/plugin-techdocs-backend": "^0.8.0",
"@backstage/plugin-todo-backend": "^0.1.4",
"@gitbeaker/node": "^28.0.2",
"@octokit/rest": "^18.5.3",
"azure-devops-node-api": "^10.1.1",
"dockerode": "^3.2.1",
"example-app": "^0.2.25",
"example-app": "^0.2.27",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"knex": "^0.95.1",
@@ -60,7 +60,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@types/dockerode": "^3.2.1",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5"
+4 -3
View File
@@ -20,6 +20,7 @@ import {
createRouter,
NextCatalogBuilder,
runPeriodically,
createNextRouter,
} from '@backstage/plugin-catalog-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
@@ -36,18 +37,18 @@ export default async function createPlugin(
const builder = new NextCatalogBuilder(env);
const {
entitiesCatalog,
locationsCatalog,
locationAnalyzer,
processingEngine,
locationService,
} = await builder.build();
// TODO(jhaals): run and manage in background.
await processingEngine.start();
return await createRouter({
return await createNextRouter({
entitiesCatalog,
locationsCatalog,
locationAnalyzer,
locationService,
logger: env.logger,
config: env.config,
});
+9
View File
@@ -1,5 +1,14 @@
# @backstage/catalog-client
## 0.3.11
### Patch Changes
- d1b1306d9: Allow `filter` parameter to be specified multiple times
- Updated dependencies [d8b81fd28]
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
## 0.3.10
### Patch Changes
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-client",
"version": "0.3.10",
"version": "0.3.11",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,13 +29,13 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/catalog-model": "^0.7.7",
"@backstage/config": "^0.1.4",
"@backstage/catalog-model": "^0.7.8",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"cross-fetch": "^3.0.6"
},
"devDependencies": {
"@backstage/cli": "^0.6.8",
"@backstage/cli": "^0.6.10",
"@types/jest": "^26.0.7",
"msw": "^0.21.2"
},
+8
View File
@@ -1,5 +1,13 @@
# @backstage/catalog-model
## 0.7.8
### Patch Changes
- d8b81fd28: Bump `json-schema` dependency from `0.2.5` to `0.3.0`.
- Updated dependencies [d8b81fd28]
- @backstage/config@0.1.5
## 0.7.7
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-model",
"version": "0.7.7",
"version": "0.7.8",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,7 +29,7 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.3",
"@backstage/config": "^0.1.5",
"@types/json-schema": "^7.0.5",
"@types/yup": "^0.29.8",
"ajv": "^7.0.3",
@@ -39,7 +39,7 @@
"yup": "^0.29.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.8",
"@backstage/cli": "^0.6.10",
"@types/express": "^4.17.6",
"@types/jest": "^26.0.7",
"@types/lodash": "^4.14.151",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/cli
## 0.6.10
### Patch Changes
- f65adcde7: Fix some transitive dependency warnings in yarn
- fc79a6dd3: Added lax option to backstage-cli app:build command
- d8b81fd28: Bump `json-schema` dependency from `0.2.5` to `0.3.0`.
- Updated dependencies [d8b81fd28]
- @backstage/config-loader@0.6.1
- @backstage/config@0.1.5
## 0.6.9
### Patch Changes
+8 -8
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
"version": "0.6.9",
"version": "0.6.10",
"private": false,
"publishConfig": {
"access": "public"
@@ -31,8 +31,8 @@
"@babel/core": "^7.4.4",
"@babel/plugin-transform-modules-commonjs": "^7.4.4",
"@backstage/cli-common": "^0.1.1",
"@backstage/config": "^0.1.4",
"@backstage/config-loader": "^0.6.0",
"@backstage/config": "^0.1.5",
"@backstage/config-loader": "^0.6.1",
"@hot-loader/react-dom": "^16.13.0",
"@lerna/package-graph": "^4.0.0",
"@lerna/project": "^4.0.0",
@@ -117,12 +117,12 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/backend-common": "^0.6.3",
"@backstage/config": "^0.1.4",
"@backstage/core": "^0.7.6",
"@backstage/backend-common": "^0.7.0",
"@backstage/config": "^0.1.5",
"@backstage/core": "^0.7.8",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@types/diff": "^5.0.0",
"@types/express": "^4.17.6",
"@types/fs-extra": "^9.0.1",
@@ -143,7 +143,7 @@
"del": "^5.1.0",
"mock-fs": "^4.13.0",
"nodemon": "^2.0.2",
"ts-node": "^8.6.2"
"ts-node": "^9.1.1"
},
"files": [
"asset-types",
+8
View File
@@ -1,5 +1,13 @@
# @backstage/config-loader
## 0.6.1
### Patch Changes
- d8b81fd28: Bump `json-schema` dependency from `0.2.5` to `0.3.0`.
- Updated dependencies [d8b81fd28]
- @backstage/config@0.1.5
## 0.6.0
### Minor Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/config-loader",
"description": "Config loading functionality used by Backstage backend, and CLI",
"version": "0.6.0",
"version": "0.6.1",
"private": false,
"publishConfig": {
"access": "public",
@@ -31,7 +31,7 @@
},
"dependencies": {
"@backstage/cli-common": "^0.1.1",
"@backstage/config": "^0.1.1",
"@backstage/config": "^0.1.5",
"@types/json-schema": "^7.0.6",
"ajv": "^7.0.3",
"fs-extra": "^9.0.0",
+6
View File
@@ -1,5 +1,11 @@
# @backstage/config
## 0.1.5
### Patch Changes
- d8b81fd28: Bump `json-schema` dependency from `0.2.5` to `0.3.0`.
## 0.1.4
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/config",
"description": "Config API used by Backstage core, backend, and CLI",
"version": "0.1.4",
"version": "0.1.5",
"private": false,
"publishConfig": {
"access": "public",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/core
## 0.7.8
### Patch Changes
- f65adcde7: Fix some transitive dependency warnings in yarn
- 80888659b: Bump react-hook-form version to be the same for the entire project.
- Updated dependencies [7b8272fb7]
- Updated dependencies [d8b81fd28]
- @backstage/theme@0.2.7
- @backstage/config@0.1.5
## 0.7.7
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core",
"description": "Core API used by Backstage plugins and apps",
"version": "0.7.7",
"version": "0.7.8",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,10 +29,10 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.4",
"@backstage/config": "^0.1.5",
"@backstage/core-api": "^0.2.17",
"@backstage/errors": "^0.1.1",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -70,7 +70,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
+157
View File
@@ -1,5 +1,162 @@
# @backstage/create-app
## 0.3.21
### Patch Changes
- 38ca05168: The default `@octokit/rest` dependency was bumped to `"^18.5.3"`.
- e0bfd3d44: The `scaffolder-backend` and `techdocs-backend` plugins have been updated.
In order to update, you need to apply the following changes to your existing backend application:
`@backstage/plugin-techdocs-backend`:
```diff
// packages/backend/src/plugin/techdocs.ts
+ import { DockerContainerRunner } from '@backstage/backend-common';
// ...
export default async function createPlugin({
logger,
config,
discovery,
reader,
}: PluginEnvironment): Promise<Router> {
// Preparers are responsible for fetching source files for documentation.
const preparers = await Preparers.fromConfig(config, {
logger,
reader,
});
+ // Docker client (conditionally) used by the generators, based on techdocs.generators config.
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
// Generators are used for generating documentation sites.
const generators = await Generators.fromConfig(config, {
logger,
+ containerRunner,
});
// Publisher is used for
// 1. Publishing generated files to storage
// 2. Fetching files from storage and passing them to TechDocs frontend.
const publisher = await Publisher.fromConfig(config, {
logger,
discovery,
});
// checks if the publisher is working and logs the result
await publisher.getReadiness();
- // Docker client (conditionally) used by the generators, based on techdocs.generators config.
- const dockerClient = new Docker();
return await createRouter({
preparers,
generators,
publisher,
- dockerClient,
logger,
config,
discovery,
});
}
```
`@backstage/plugin-scaffolder-backend`:
```diff
// packages/backend/src/plugin/scaffolder.ts
- import { SingleHostDiscovery } from '@backstage/backend-common';
+ import {
+ DockerContainerRunner,
+ SingleHostDiscovery,
+ } from '@backstage/backend-common';
export default async function createPlugin({
logger,
config,
database,
reader,
}: PluginEnvironment): Promise<Router> {
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
+ const cookiecutterTemplater = new CookieCutter({ containerRunner });
- const cookiecutterTemplater = new CookieCutter();
+ const craTemplater = new CreateReactAppTemplater({ containerRunner });
- const craTemplater = new CreateReactAppTemplater();
const templaters = new Templaters();
templaters.register('cookiecutter', cookiecutterTemplater);
templaters.register('cra', craTemplater);
const preparers = await Preparers.fromConfig(config, { logger });
const publishers = await Publishers.fromConfig(config, { logger });
- const dockerClient = new Docker();
const discovery = SingleHostDiscovery.fromConfig(config);
const catalogClient = new CatalogClient({ discoveryApi: discovery });
return await createRouter({
preparers,
templaters,
publishers,
logger,
config,
- dockerClient,
database,
catalogClient,
reader,
});
}
```
- Updated dependencies [e0bfd3d44]
- Updated dependencies [e0bfd3d44]
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [f65adcde7]
- Updated dependencies [80888659b]
- Updated dependencies [b219821a0]
- Updated dependencies [7b8272fb7]
- Updated dependencies [8aedbb4af]
- Updated dependencies [fc79a6dd3]
- Updated dependencies [69eefb5ae]
- Updated dependencies [75c8cec39]
- Updated dependencies [b2e2ec753]
- Updated dependencies [227439a72]
- Updated dependencies [9314a8592]
- Updated dependencies [2e05277e0]
- Updated dependencies [4075c6367]
- Updated dependencies [cdb3426e5]
- Updated dependencies [d8b81fd28]
- Updated dependencies [d1b1306d9]
- @backstage/plugin-scaffolder-backend@0.11.0
- @backstage/backend-common@0.7.0
- @backstage/plugin-techdocs-backend@0.8.0
- @backstage/plugin-catalog-import@0.5.5
- @backstage/plugin-github-actions@0.4.5
- @backstage/cli@0.6.10
- @backstage/core@0.7.8
- @backstage/plugin-catalog-backend@0.8.2
- @backstage/theme@0.2.7
- @backstage/plugin-tech-radar@0.3.10
- @backstage/plugin-scaffolder@0.9.3
- @backstage/plugin-techdocs@0.9.1
- @backstage/plugin-proxy-backend@0.2.7
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
- @backstage/catalog-client@0.3.11
- @backstage/plugin-app-backend@0.3.12
- @backstage/plugin-auth-backend@0.3.9
- @backstage/plugin-rollbar-backend@0.1.10
## 0.3.20
### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "Create app package for Backstage",
"version": "0.3.20",
"version": "0.3.21",
"private": false,
"publishConfig": {
"access": "public"
@@ -41,7 +41,7 @@
"@types/inquirer": "^7.3.1",
"@types/react-dev-utils": "^9.0.4",
"@types/recursive-readdir": "^2.2.0",
"ts-node": "^8.6.2"
"ts-node": "^9.1.1"
},
"peerDependencies": {
"@backstage/backend-common": "*",
+1 -1
View File
@@ -30,7 +30,7 @@
"commander": "^6.1.0",
"fs-extra": "^9.0.0",
"github-slugger": "^1.3.0",
"ts-node": "^8.6.2",
"ts-node": "^9.1.1",
"typescript": "^4.0.3"
},
"devDependencies": {
+1 -1
View File
@@ -34,7 +34,7 @@
"handlebars": "^4.7.3",
"pgtools": "^0.3.0",
"tree-kill": "^1.2.2",
"ts-node": "^8.6.2",
"ts-node": "^9.1.1",
"zombie": "^6.1.4"
},
"nodemonConfig": {
+8
View File
@@ -1,5 +1,13 @@
# @backstage/integration
## 0.5.2
### Patch Changes
- 38ca05168: The default `@octokit/rest` dependency was bumped to `"^18.5.3"`.
- Updated dependencies [d8b81fd28]
- @backstage/config@0.1.5
## 0.5.1
### Patch Changes
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration",
"version": "0.5.1",
"version": "0.5.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,7 +29,7 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.2",
"@backstage/config": "^0.1.5",
"cross-fetch": "^3.0.6",
"git-url-parse": "^11.4.4",
"@octokit/rest": "^18.5.3",
@@ -37,8 +37,8 @@
"luxon": "^1.25.0"
},
"devDependencies": {
"@backstage/cli": "^0.6.7",
"@backstage/config-loader": "^0.6.0",
"@backstage/cli": "^0.6.10",
"@backstage/config-loader": "^0.6.1",
"@backstage/test-utils": "^0.1.10",
"@types/jest": "^26.0.7",
"@types/luxon": "^1.25.0",
+40
View File
@@ -1,5 +1,45 @@
# @backstage/techdocs-common
## 0.6.0
### Minor Changes
- e0bfd3d44: Migrate the package to use the `ContainerRunner` interface instead of `runDockerContainer(…)`.
It also no longer provides the `ContainerRunner` as an input to the `GeneratorBase#run(…)` function, but expects it as a constructor parameter instead.
If you use the `TechdocsGenerator` you need to update the usage:
```diff
+ const containerRunner = new DockerContainerRunner({ dockerClient });
- const generator = new TechdocsGenerator(logger, config);
+ const techdocsGenerator = new TechdocsGenerator({
+ logger,
+ containerRunner,
+ config,
+ });
await this.generator.run({
inputDir: preparedDir,
outputDir,
- dockerClient: this.dockerClient,
parsedLocationAnnotation,
etag: newEtag,
});
```
### Patch Changes
- e9e56b01a: Adding optional config to enable S3-like API for tech-docs using s3ForcePathStyle option.
This allows providers like LocalStack, Minio and Wasabi (+possibly others) to be used to host tech docs.
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [d8b81fd28]
- @backstage/backend-common@0.7.0
- @backstage/integration@0.5.2
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
## 0.5.1
### Patch Changes
+6 -6
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/techdocs-common",
"description": "Common functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli",
"version": "0.5.1",
"version": "0.6.0",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -38,11 +38,11 @@
"dependencies": {
"@azure/identity": "^1.2.2",
"@azure/storage-blob": "^12.4.0",
"@backstage/backend-common": "^0.6.0",
"@backstage/catalog-model": "^0.7.7",
"@backstage/config": "^0.1.4",
"@backstage/backend-common": "^0.7.0",
"@backstage/catalog-model": "^0.7.8",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.1",
"@backstage/integration": "^0.5.2",
"@google-cloud/storage": "^5.6.0",
"@types/express": "^4.17.6",
"aws-sdk": "^2.840.0",
@@ -60,7 +60,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.6.8",
"@backstage/cli": "^0.6.10",
"@types/fs-extra": "^9.0.5",
"@types/git-url-parse": "^9.0.0",
"@types/js-yaml": "^4.0.0",
+6
View File
@@ -1,5 +1,11 @@
# @backstage/theme
## 0.2.7
### Patch Changes
- 7b8272fb7: Remove extra bottom padding in InfoCard content
## 0.2.6
### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/theme",
"description": "material-ui theme for use with Backstage.",
"version": "0.2.6",
"version": "0.2.7",
"private": false,
"publishConfig": {
"access": "public",
@@ -31,7 +31,7 @@
"@material-ui/core": "^4.11.0"
},
"devDependencies": {
"@backstage/cli": "^0.6.9"
"@backstage/cli": "^0.6.10"
},
"files": [
"dist"
+3 -3
View File
@@ -31,9 +31,9 @@
"dependencies": {
"@asyncapi/react-component": "^0.23.0",
"@backstage/catalog-model": "^0.7.7",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/plugin-catalog-react": "^0.1.4",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-icons/font": "^1.0.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -49,7 +49,7 @@
"swagger-ui-react": "^3.37.2"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-app-backend
## 0.3.12
### Patch Changes
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [d8b81fd28]
- @backstage/backend-common@0.7.0
- @backstage/config-loader@0.6.1
- @backstage/config@0.1.5
## 0.3.11
### Patch Changes
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-app-backend",
"version": "0.3.11",
"version": "0.3.12",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,9 +29,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.6.2",
"@backstage/config-loader": "^0.6.0",
"@backstage/config": "^0.1.4",
"@backstage/backend-common": "^0.7.0",
"@backstage/config-loader": "^0.6.1",
"@backstage/config": "^0.1.5",
"@types/express": "^4.17.6",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
@@ -40,7 +40,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.6.7",
"@backstage/cli": "^0.6.10",
"@types/supertest": "^2.0.8",
"msw": "^0.20.5",
"supertest": "^6.1.3"
+13
View File
@@ -1,5 +1,18 @@
# @backstage/plugin-auth-backend
## 0.3.9
### Patch Changes
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [d8b81fd28]
- Updated dependencies [d1b1306d9]
- @backstage/backend-common@0.7.0
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
- @backstage/catalog-client@0.3.11
## 0.3.8
### Patch Changes
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend",
"version": "0.3.8",
"version": "0.3.9",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,10 +29,10 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.6.2",
"@backstage/catalog-client": "^0.3.9",
"@backstage/catalog-model": "^0.7.6",
"@backstage/config": "^0.1.4",
"@backstage/backend-common": "^0.7.0",
"@backstage/catalog-client": "^0.3.11",
"@backstage/catalog-model": "^0.7.8",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"@backstage/test-utils": "^0.1.10",
"@types/express": "^4.17.6",
@@ -68,7 +68,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.6.7",
"@backstage/cli": "^0.6.10",
"@types/body-parser": "^1.19.0",
"@types/cookie-parser": "^1.4.2",
"@types/express-session": "^1.17.2",
+13
View File
@@ -1,5 +1,18 @@
# @backstage/plugin-badges-backend
## 0.1.3
### Patch Changes
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [d8b81fd28]
- Updated dependencies [d1b1306d9]
- @backstage/backend-common@0.7.0
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
- @backstage/catalog-client@0.3.11
## 0.1.2
### Patch Changes
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-badges-backend",
"version": "0.1.2",
"version": "0.1.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,10 +30,10 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.6.2",
"@backstage/catalog-client": "^0.3.6",
"@backstage/catalog-model": "^0.7.6",
"@backstage/config": "^0.1.3",
"@backstage/backend-common": "^0.7.0",
"@backstage/catalog-client": "^0.3.11",
"@backstage/catalog-model": "^0.7.8",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"@types/express": "^4.17.6",
"badge-maker": "^3.3.0",
@@ -45,7 +45,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.6.7",
"@backstage/cli": "^0.6.10",
"@types/supertest": "^2.0.8",
"supertest": "^6.1.3"
},
+3 -3
View File
@@ -21,10 +21,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.7.6",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/errors": "^0.1.1",
"@backstage/plugin-catalog-react": "^0.1.3",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -34,7 +34,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
+3 -3
View File
@@ -21,9 +21,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.7.2",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/plugin-catalog-react": "^0.1.2",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -37,7 +37,7 @@
"recharts": "^1.8.5"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
+14
View File
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend
## 0.8.2
### Patch Changes
- b219821a0: Expose `BitbucketRepositoryParser` introduced in [#5295](https://github.com/backstage/backstage/pull/5295)
- 227439a72: Add support for non-organization accounts in GitHub Discovery
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [d8b81fd28]
- @backstage/backend-common@0.7.0
- @backstage/integration@0.5.2
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
## 0.8.1
### Patch Changes
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend",
"version": "0.8.1",
"version": "0.8.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,11 +30,11 @@
},
"dependencies": {
"@azure/msal-node": "^1.0.0-beta.3",
"@backstage/backend-common": "^0.6.3",
"@backstage/catalog-model": "^0.7.7",
"@backstage/config": "^0.1.4",
"@backstage/backend-common": "^0.7.0",
"@backstage/catalog-model": "^0.7.8",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.1",
"@backstage/integration": "^0.5.2",
"@backstage/plugin-search-backend-node": "^0.1.4",
"@backstage/search-common": "^0.1.1",
"@octokit/graphql": "^4.5.8",
@@ -63,7 +63,7 @@
"yup": "^0.29.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/test-utils": "^0.1.9",
"@types/core-js": "^2.5.4",
"@types/git-url-parse": "^9.0.0",
@@ -97,11 +97,8 @@ export class DefaultCatalogProcessingOrchestrator
async process(
request: EntityProcessingRequest,
): Promise<EntityProcessingResult> {
const { entity } = request;
const result = await this.processSingleEntity(entity);
return result;
// TODO: implement dryRun/eager
return this.processSingleEntity(request.entity);
}
private async processSingleEntity(
@@ -63,11 +63,12 @@ import {
} from '../ingestion/processors/PlaceholderProcessor';
import { defaultEntityDataParser } from '../ingestion/processors/util/parse';
import { LocationAnalyzer } from '../ingestion/types';
import { CatalogProcessingEngine } from '../next/types';
import { CatalogProcessingEngine, LocationService } from '../next/types';
import { ConfigLocationEntityProvider } from './ConfigLocationEntityProvider';
import { DefaultProcessingDatabase } from './database/DefaultProcessingDatabase';
import { DefaultCatalogProcessingEngine } from './DefaultCatalogProcessingEngine';
import { DefaultCatalogProcessingOrchestrator } from './DefaultCatalogProcessingOrchestrator';
import { DefaultLocationService } from './DefaultLocationService';
import { DefaultLocationStore } from './DefaultLocationStore';
import { NextEntitiesCatalog } from './NextEntitiesCatalog';
import { Stitcher } from './Stitcher';
@@ -233,6 +234,7 @@ export class NextCatalogBuilder {
locationsCatalog: LocationsCatalog;
locationAnalyzer: LocationAnalyzer;
processingEngine: CatalogProcessingEngine;
locationService: LocationService;
}> {
const { config, database, logger } = this.env;
@@ -274,12 +276,16 @@ export class NextCatalogBuilder {
const locationsCatalog = new DatabaseLocationsCatalog(db);
const locationAnalyzer = new RepoLocationAnalyzer(logger);
const locationService = new DefaultLocationService(
locationStore,
orchestrator,
);
return {
entitiesCatalog,
locationsCatalog,
locationAnalyzer,
processingEngine,
locationService,
};
}
@@ -18,37 +18,128 @@ import { Knex } from 'knex';
import { DbFinalEntitiesRow } from './Stitcher';
import { EntitiesCatalog } from '../catalog';
import { EntitiesRequest, EntitiesResponse } from '../catalog/types';
import { DbRefreshStateRow } from './database/DefaultProcessingDatabase';
import {
DbEntitiesSearchRow,
DbPageInfo,
EntityPagination,
} from '../database/types';
import { InputError } from '@backstage/errors';
function parsePagination(
input?: EntityPagination,
): { limit?: number; offset?: number } {
if (!input) {
return {};
}
let { limit, offset } = input;
if (input.after !== undefined) {
let cursor;
try {
const json = Buffer.from(input.after, 'base64').toString('utf8');
cursor = JSON.parse(json);
} catch {
throw new InputError('Malformed after cursor, could not be parsed');
}
if (cursor.limit !== undefined) {
if (!Number.isInteger(cursor.limit)) {
throw new InputError('Malformed after cursor, limit was not an number');
}
limit = cursor.limit;
}
if (cursor.offset !== undefined) {
if (!Number.isInteger(cursor.offset)) {
throw new InputError('Malformed after cursor, offset was not a number');
}
offset = cursor.offset;
}
}
return { limit, offset };
}
function stringifyPagination(input: { limit: number; offset: number }) {
const json = JSON.stringify({ limit: input.limit, offset: input.offset });
const base64 = Buffer.from(json, 'utf8').toString('base64');
return base64;
}
export class NextEntitiesCatalog implements EntitiesCatalog {
constructor(private readonly database: Knex) {}
async entities(request?: EntitiesRequest): Promise<EntitiesResponse> {
if (request?.fields) {
throw new Error('Fields extraction is not implemented');
}
if (request?.pagination) {
throw new Error('Pagination is not implemented');
}
if (request?.filter) {
throw new Error('Filters are not implemented');
const db = this.database;
let entitiesQuery = db<DbFinalEntitiesRow>('final_entities');
for (const singleFilter of request?.filter?.anyOf ?? []) {
entitiesQuery = entitiesQuery.orWhere(function singleFilterFn() {
for (const { key, matchValueIn } of singleFilter.allOf) {
// NOTE(freben): This used to be a set of OUTER JOIN, which may seem to
// make a lot of sense. However, it had abysmal performance on sqlite
// when datasets grew large, so we're using IN instead.
const matchQuery = db<DbEntitiesSearchRow>('search')
.select('entity_id')
.where(function keyFilter() {
this.andWhere({ key: key.toLowerCase() });
if (matchValueIn) {
if (matchValueIn.length === 1) {
this.andWhere({ value: matchValueIn[0].toLowerCase() });
} else if (matchValueIn.length > 1) {
this.andWhere(
'value',
'in',
matchValueIn.map(v => v.toLowerCase()),
);
}
}
});
this.andWhere('entity_id', 'in', matchQuery);
}
});
}
const dbResponse = await this.database<DbFinalEntitiesRow>(
'final_entities',
).select();
// TODO: move final_entities to use entity_Ref
entitiesQuery = entitiesQuery
.select('final_entities.*')
.orderBy('entity_id', 'asc');
const entities = dbResponse.map(e => JSON.parse(e.final_entity));
const { limit, offset } = parsePagination(request?.pagination);
if (limit !== undefined) {
entitiesQuery = entitiesQuery.limit(limit + 1);
}
if (offset !== undefined) {
entitiesQuery = entitiesQuery.offset(offset);
}
let rows = await entitiesQuery;
let pageInfo: DbPageInfo;
if (limit === undefined || rows.length <= limit) {
pageInfo = { hasNextPage: false };
} else {
rows = rows.slice(0, -1);
pageInfo = {
hasNextPage: true,
endCursor: stringifyPagination({
limit,
offset: (offset ?? 0) + limit,
}),
};
}
return {
entities,
pageInfo: {
hasNextPage: false,
},
entities: rows.map(e => JSON.parse(e.final_entity)),
pageInfo,
};
}
async removeEntityByUid(_uid: string): Promise<void> {
throw new Error('Not implemented');
async removeEntityByUid(uid: string): Promise<void> {
await this.database<DbRefreshStateRow>('refresh_state')
.where('entity_id', uid)
.delete();
}
async batchAddOrUpdateEntities(): Promise<never> {
@@ -0,0 +1,164 @@
/*
* Copyright 2020 Spotify AB
*
* 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 { errorHandler } from '@backstage/backend-common';
import {
analyzeLocationSchema,
locationSpecSchema,
} from '@backstage/catalog-model';
import { Config } from '@backstage/config';
import { NotFoundError } from '@backstage/errors';
import express from 'express';
import Router from 'express-promise-router';
import { Logger } from 'winston';
import yn from 'yn';
import { EntitiesCatalog } from '../catalog';
import { LocationAnalyzer } from '../ingestion/types';
import {
basicEntityFilter,
parseEntityFilterParams,
parseEntityPaginationParams,
parseEntityTransformParams,
} from '../service/request';
import { LocationService } from './types';
import { disallowReadonlyMode, validateRequestBody } from '../service/util';
export interface RouterOptions {
entitiesCatalog?: EntitiesCatalog;
locationAnalyzer?: LocationAnalyzer;
locationService: LocationService;
logger: Logger;
config: Config;
}
export async function createNextRouter(
options: RouterOptions,
): Promise<express.Router> {
const {
entitiesCatalog,
locationAnalyzer,
locationService,
config,
logger,
} = options;
const router = Router();
router.use(express.json());
const readonlyEnabled =
config.getOptionalBoolean('catalog.readonly') || false;
if (readonlyEnabled) {
logger.info('Catalog is running in readonly mode');
}
if (entitiesCatalog) {
router
.get('/entities', async (req, res) => {
const { entities, pageInfo } = await entitiesCatalog.entities({
filter: parseEntityFilterParams(req.query),
fields: parseEntityTransformParams(req.query),
pagination: parseEntityPaginationParams(req.query),
});
// Add a Link header to the next page
if (pageInfo.hasNextPage) {
const url = new URL(`http://ignored${req.url}`);
url.searchParams.delete('offset');
url.searchParams.set('after', pageInfo.endCursor);
res.setHeader('link', `<${url.pathname}${url.search}>; rel="next"`);
}
// TODO(freben): encode the pageInfo in the response
res.json(entities);
})
.get('/entities/by-uid/:uid', async (req, res) => {
const { uid } = req.params;
const { entities } = await entitiesCatalog.entities({
filter: basicEntityFilter({ 'metadata.uid': uid }),
});
if (!entities.length) {
throw new NotFoundError(`No entity with uid ${uid}`);
}
res.status(200).json(entities[0]);
})
.delete('/entities/by-uid/:uid', async (req, res) => {
const { uid } = req.params;
await entitiesCatalog.removeEntityByUid(uid);
res.status(204).end();
})
.get('/entities/by-name/:kind/:namespace/:name', async (req, res) => {
const { kind, namespace, name } = req.params;
const { entities } = await entitiesCatalog.entities({
filter: basicEntityFilter({
kind: kind,
'metadata.namespace': namespace,
'metadata.name': name,
}),
});
if (!entities.length) {
throw new NotFoundError(
`No entity named '${name}' found, with kind '${kind}' in namespace '${namespace}'`,
);
}
res.status(200).json(entities[0]);
});
}
if (locationService) {
router
.post('/locations', async (req, res) => {
const input = await validateRequestBody(req, locationSpecSchema);
const dryRun = yn(req.query.dryRun, { default: false });
// when in dryRun addLocation is effectively a read operation so we don't
// need to disallow readonly
if (!dryRun) {
disallowReadonlyMode(readonlyEnabled);
}
const output = await locationService.createLocation(input, dryRun);
res.status(201).json(output);
})
.get('/locations', async (_req, res) => {
const output = await locationService.listLocations();
res.status(200).json(output);
})
.get('/locations/:id', async (req, res) => {
const { id } = req.params;
const output = await locationService.getLocation(id);
res.status(200).json(output);
})
.delete('/locations/:id', async (req, res) => {
disallowReadonlyMode(readonlyEnabled);
const { id } = req.params;
await locationService.deleteLocation(id);
res.status(204).end();
});
}
if (locationAnalyzer) {
router.post('/analyze-location', async (req, res) => {
const input = await validateRequestBody(req, analyzeLocationSchema);
const output = await locationAnalyzer.analyzeLocation(input);
res.status(200).json(output);
});
}
router.use(errorHandler());
return router;
}
+2 -2
View File
@@ -84,14 +84,14 @@ export class Stitcher {
relationTarget: 'relations.target_entity_ref',
})
.from('refresh_state')
.leftJoin('incoming_references', {})
.where({ 'refresh_state.entity_ref': entityRef })
.crossJoin(tx.raw('incoming_references'))
.leftOuterJoin('final_entities', {
'final_entities.entity_id': 'refresh_state.entity_id',
})
.leftOuterJoin('relations', {
'relations.source_entity_ref': 'refresh_state.entity_ref',
})
.where({ 'refresh_state.entity_ref': entityRef })
.orderBy('relationType', 'asc')
.orderBy('relationTarget', 'asc');
@@ -15,3 +15,4 @@
*/
export { NextCatalogBuilder } from './NextCatalogBuilder';
export { createNextRouter } from './NextRouter';
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-catalog-graphql
## 0.2.8
### Patch Changes
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [d8b81fd28]
- @backstage/backend-common@0.7.0
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
## 0.2.7
### Patch Changes
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-graphql",
"version": "0.2.7",
"version": "0.2.8",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,9 +30,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.6.0",
"@backstage/catalog-model": "^0.7.1",
"@backstage/config": "^0.1.4",
"@backstage/backend-common": "^0.7.0",
"@backstage/catalog-model": "^0.7.8",
"@backstage/config": "^0.1.5",
"@graphql-modules/core": "^0.7.17",
"apollo-server": "^2.16.1",
"cross-fetch": "^3.0.6",
@@ -42,7 +42,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.6.5",
"@backstage/cli": "^0.6.10",
"@backstage/test-utils": "^0.1.9",
"@graphql-codegen/cli": "^1.21.3",
"@graphql-codegen/typescript": "^1.17.7",
@@ -52,7 +52,7 @@
"eslint-plugin-graphql": "^4.0.0",
"msw": "^0.21.2",
"supertest": "^6.1.3",
"ts-node": "^8.10.2"
"ts-node": "^9.1.1"
},
"files": [
"dist"
+21
View File
@@ -1,5 +1,26 @@
# @backstage/plugin-catalog-import
## 0.5.5
### Patch Changes
- 38ca05168: The default `@octokit/rest` dependency was bumped to `"^18.5.3"`.
- 80888659b: Bump react-hook-form version to be the same for the entire project.
- 8aedbb4af: Fixes a typo and minor wording changes to the catalog import UI
- Updated dependencies [38ca05168]
- Updated dependencies [f65adcde7]
- Updated dependencies [81c54d1f2]
- Updated dependencies [80888659b]
- Updated dependencies [7b8272fb7]
- Updated dependencies [d8b81fd28]
- Updated dependencies [d1b1306d9]
- @backstage/integration@0.5.2
- @backstage/core@0.7.8
- @backstage/plugin-catalog-react@0.1.5
- @backstage/theme@0.2.7
- @backstage/catalog-model@0.7.8
- @backstage/catalog-client@0.3.11
## 0.5.4
### Patch Changes
+8 -8
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-import",
"version": "0.5.4",
"version": "0.5.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,13 +30,13 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/catalog-model": "^0.7.6",
"@backstage/catalog-client": "^0.3.9",
"@backstage/core": "^0.7.7",
"@backstage/integration": "^0.5.0",
"@backstage/catalog-model": "^0.7.8",
"@backstage/catalog-client": "^0.3.11",
"@backstage/core": "^0.7.8",
"@backstage/integration": "^0.5.2",
"@backstage/integration-react": "^0.1.1",
"@backstage/plugin-catalog-react": "^0.1.4",
"@backstage/theme": "^0.2.6",
"@backstage/plugin-catalog-react": "^0.1.5",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -53,7 +53,7 @@
"yaml": "^1.10.0"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
@@ -275,7 +275,7 @@ export function defaultGenerateStepper(
}
/>
<FormHelperText>
WARNING: This may fail is no CODEOWNERS file is found at
WARNING: This may fail if no CODEOWNERS file is found at
the target location.
</FormHelperText>
</>
@@ -176,10 +176,9 @@ export const StepPrepareCreatePullRequest = ({
return (
<>
<Typography>
You entered a link to a {analyzeResult.integrationType} repository but
we didn't found a <code>catalog-info.yaml</code>. Use this form to
create a Pull Request that creates an initial{' '}
<code>catalog-info.yaml</code>.
You entered a link to a {analyzeResult.integrationType} repository but a{' '}
<code>catalog-info.yaml</code> could not be found. Use this form to open
a Pull Request that creates one.
</Typography>
<PreparePullRequestForm<FormData>
+13
View File
@@ -1,5 +1,18 @@
# @backstage/plugin-catalog-react
## 0.1.5
### Patch Changes
- 81c54d1f2: Fetch relations in batches in `useRelatedEntities`
- Updated dependencies [f65adcde7]
- Updated dependencies [80888659b]
- Updated dependencies [d8b81fd28]
- Updated dependencies [d1b1306d9]
- @backstage/core@0.7.8
- @backstage/catalog-model@0.7.8
- @backstage/catalog-client@0.3.11
## 0.1.4
### Patch Changes
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-react",
"version": "0.1.4",
"version": "0.1.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -28,9 +28,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/catalog-client": "^0.3.9",
"@backstage/catalog-model": "^0.7.5",
"@backstage/core": "^0.7.3",
"@backstage/catalog-client": "^0.3.11",
"@backstage/catalog-model": "^0.7.8",
"@backstage/core": "^0.7.8",
"@material-ui/core": "^4.11.0",
"@types/react": "^16.9",
"lodash": "^4.17.15",
@@ -40,7 +40,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.6",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.9",
"@testing-library/jest-dom": "^5.10.1",
+3 -3
View File
@@ -32,12 +32,12 @@
"dependencies": {
"@backstage/catalog-client": "^0.3.10",
"@backstage/catalog-model": "^0.7.7",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.1",
"@backstage/integration-react": "^0.1.1",
"@backstage/plugin-catalog-react": "^0.1.4",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -52,7 +52,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@microsoft/microsoft-graph-types": "^1.25.0",
+3 -3
View File
@@ -32,9 +32,9 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.7.3",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/plugin-catalog-react": "^0.1.2",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -50,7 +50,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
+3 -3
View File
@@ -32,8 +32,8 @@
"dependencies": {
"@backstage/catalog-model": "^0.7.3",
"@backstage/plugin-catalog-react": "^0.1.2",
"@backstage/core": "^0.7.7",
"@backstage/theme": "^0.2.6",
"@backstage/core": "^0.7.8",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -47,7 +47,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
@@ -1,5 +1,19 @@
# @backstage/plugin-code-coverage-backend
## 0.1.4
### Patch Changes
- Updated dependencies [e0bfd3d44]
- Updated dependencies [38ca05168]
- Updated dependencies [d8b81fd28]
- Updated dependencies [d1b1306d9]
- @backstage/backend-common@0.7.0
- @backstage/integration@0.5.2
- @backstage/catalog-model@0.7.8
- @backstage/config@0.1.5
- @backstage/catalog-client@0.3.11
## 0.1.3
### Patch Changes
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-code-coverage-backend",
"version": "0.1.3",
"version": "0.1.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -19,12 +19,12 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.6.3",
"@backstage/catalog-client": "^0.3.10",
"@backstage/catalog-model": "^0.7.7",
"@backstage/config": "^0.1.4",
"@backstage/backend-common": "^0.7.0",
"@backstage/catalog-client": "^0.3.11",
"@backstage/catalog-model": "^0.7.8",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.1",
"@backstage/integration": "^0.5.2",
"@types/express": "^4.17.6",
"cross-fetch": "^3.0.6",
"express": "^4.17.1",
@@ -36,7 +36,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@types/express-xml-bodyparser": "^0.3.2",
"@types/supertest": "^2.0.8",
"msw": "^0.21.2",
+3 -3
View File
@@ -22,10 +22,10 @@
"dependencies": {
"@backstage/catalog-model": "^0.7.7",
"@backstage/config": "^0.1.4",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/errors": "^0.1.1",
"@backstage/plugin-catalog-react": "^0.1.4",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/styles": "^4.11.0",
@@ -39,7 +39,7 @@
"recharts": "^1.8.5"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
+3 -3
View File
@@ -21,9 +21,9 @@
},
"dependencies": {
"@backstage/config": "^0.1.4",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/errors": "^0.1.1",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -34,7 +34,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
+16
View File
@@ -1,5 +1,21 @@
# @backstage/plugin-cost-insights
## 0.9.0
### Minor Changes
- 6f1b82b14: make change ratio optional
### Patch Changes
- Updated dependencies [f65adcde7]
- Updated dependencies [80888659b]
- Updated dependencies [7b8272fb7]
- Updated dependencies [d8b81fd28]
- @backstage/core@0.7.8
- @backstage/theme@0.2.7
- @backstage/config@0.1.5
## 0.8.5
### Patch Changes
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-cost-insights",
"version": "0.8.5",
"version": "0.9.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,9 +30,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.3",
"@backstage/core": "^0.7.7",
"@backstage/theme": "^0.2.6",
"@backstage/config": "^0.1.5",
"@backstage/core": "^0.7.8",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -55,7 +55,7 @@
"yup": "^0.29.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
+3 -3
View File
@@ -31,10 +31,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.7.5",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/plugin-catalog-react": "^0.1.4",
"@backstage/plugin-explore-react": "^0.0.4",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -45,7 +45,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
@@ -16,6 +16,7 @@
import { TabbedLayout } from '@backstage/core';
import React from 'react';
import { DomainExplorerContent } from '../DomainExplorerContent';
import { GroupsExplorerContent } from '../GroupsExplorerContent';
import { ToolExplorerContent } from '../ToolExplorerContent';
export const ExploreTabs = () => (
@@ -23,6 +24,9 @@ export const ExploreTabs = () => (
<TabbedLayout.Route path="domains" title="Domains">
<DomainExplorerContent />
</TabbedLayout.Route>
<TabbedLayout.Route path="groups" title="Groups">
<GroupsExplorerContent />
</TabbedLayout.Route>
<TabbedLayout.Route path="tools" title="Tools">
<ToolExplorerContent />
</TabbedLayout.Route>
@@ -0,0 +1,69 @@
/*
* Copyright 2020 Spotify AB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ApiProvider, ApiRegistry } from '@backstage/core';
import {
catalogApiRef,
CatalogApi,
entityRouteRef,
} from '@backstage/plugin-catalog-react';
import { Entity } from '@backstage/catalog-model';
import { renderInTestApp } from '@backstage/test-utils';
import React from 'react';
import { GroupsDiagram } from './GroupsDiagram';
describe('<GroupsDiagram />', () => {
beforeAll(() => {
Object.defineProperty(window.SVGElement.prototype, 'getBBox', {
value: () => ({ width: 100, height: 100 }),
configurable: true,
});
});
it('shows groups', async () => {
const catalogApi: Partial<CatalogApi> = {
getEntities: () =>
Promise.resolve({
items: [
{
apiVersion: 'backstage.io/v1alpha1',
kind: 'Group',
metadata: {
name: 'group-a',
namespace: 'my-namespace',
},
spec: {
type: 'organization',
},
},
] as Entity[],
}),
};
const { getByText } = await renderInTestApp(
<ApiProvider apis={ApiRegistry.from([[catalogApiRef, catalogApi]])}>
<GroupsDiagram />
</ApiProvider>,
{
mountedRoutes: {
'/catalog/:namespace/:kind/:name': entityRouteRef,
},
},
);
expect(getByText('my-namespace/group-a')).toBeInTheDocument();
});
});
@@ -0,0 +1,190 @@
/*
* Copyright 2021 Spotify AB
*
* 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 {
RELATION_CHILD_OF,
stringifyEntityRef,
parseEntityRef,
} from '@backstage/catalog-model';
import {
catalogApiRef,
entityRouteRef,
getEntityRelations,
formatEntityRefTitle,
} from '@backstage/plugin-catalog-react';
import {
DependencyGraph,
DependencyGraphTypes,
Progress,
useApi,
ResponseErrorPanel,
Link,
useRouteRef,
configApiRef,
} from '@backstage/core';
import { makeStyles, Typography } from '@material-ui/core';
import ZoomOutMap from '@material-ui/icons/ZoomOutMap';
import React from 'react';
import { useAsync } from 'react-use';
import { BackstageTheme } from '@backstage/theme';
const useStyles = makeStyles((theme: BackstageTheme) => ({
organizationNode: {
fill: 'coral',
stroke: theme.palette.border,
},
groupNode: {
fill: 'yellowgreen',
stroke: theme.palette.border,
},
}));
function RenderNode(props: DependencyGraphTypes.RenderNodeProps<any>) {
const classes = useStyles();
const catalogEntityRoute = useRouteRef(entityRouteRef);
if (props.node.id === 'root') {
return (
<g>
<rect
width={180}
height={80}
rx={20}
className={classes.organizationNode}
/>
<text
x={90}
y={45}
textAnchor="middle"
alignmentBaseline="baseline"
style={{ fontWeight: 'bold' }}
>
{props.node.name}
</text>
</g>
);
}
const ref = parseEntityRef(props.node.id);
return (
<g>
<rect width={180} height={80} rx={20} className={classes.groupNode} />
<Link
to={catalogEntityRoute({
kind: ref.kind,
namespace: ref.namespace,
name: ref.name,
})}
>
<text
x={90}
y={45}
textAnchor="middle"
alignmentBaseline="baseline"
style={{ fontWeight: 'bold' }}
>
{props.node.name}
</text>
</Link>
</g>
);
}
/**
* Dynamically generates a diagram of groups registered in the catalog.
*/
export function GroupsDiagram() {
const nodes = new Array<{ id: string; kind: string; name: string }>();
const edges = new Array<{ from: string; to: string; label: string }>();
const configApi = useApi(configApiRef);
const catalogApi = useApi(catalogApiRef);
const organizationName =
configApi.getOptionalString('organization.name') ?? 'Backstage';
const { loading, error, value: catalogResponse } = useAsync(() => {
return catalogApi.getEntities({
filter: {
kind: ['Group'],
},
});
}, [catalogApi]);
if (loading) {
return <Progress />;
} else if (error) {
return <ResponseErrorPanel error={error} />;
}
// the root of this diagram is the organization
nodes.push({
id: 'root',
kind: 'Organization',
name: organizationName,
});
for (const catalogItem of catalogResponse?.items || []) {
const currentItemId = stringifyEntityRef(catalogItem);
nodes.push({
id: stringifyEntityRef(catalogItem),
kind: catalogItem.kind,
name: formatEntityRefTitle(catalogItem, { defaultKind: 'Group' }),
});
// Edge to parent
const catalogItemRelations_childOf = getEntityRelations(
catalogItem,
RELATION_CHILD_OF,
);
// if no parent is found, link the node to the root
if (catalogItemRelations_childOf.length === 0) {
edges.push({
from: currentItemId,
to: 'root',
label: '',
});
}
catalogItemRelations_childOf.forEach(relation => {
edges.push({
from: currentItemId,
to: stringifyEntityRef(relation),
label: '',
});
});
}
return (
<>
<DependencyGraph
nodes={nodes}
edges={edges}
nodeMargin={10}
direction={DependencyGraphTypes.Direction.RIGHT_LEFT}
renderNode={RenderNode}
/>
<Typography
variant="caption"
style={{ display: 'block', textAlign: 'right' }}
>
<ZoomOutMap style={{ verticalAlign: 'bottom' }} /> Use pinch &amp; zoom
to move around the diagram.
</Typography>
</>
);
}
@@ -0,0 +1,103 @@
/*
* Copyright 2020 Spotify AB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Entity } from '@backstage/catalog-model';
import { ApiProvider, ApiRegistry } from '@backstage/core';
import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react';
import { renderInTestApp } from '@backstage/test-utils';
import { waitFor } from '@testing-library/react';
import React from 'react';
import { GroupsExplorerContent } from '../GroupsExplorerContent';
describe('<GroupsExplorerContent />', () => {
const catalogApi: jest.Mocked<typeof catalogApiRef.T> = {
addLocation: jest.fn(_a => new Promise(() => {})),
getEntities: jest.fn(),
getOriginLocationByEntity: jest.fn(),
getLocationByEntity: jest.fn(),
getLocationById: jest.fn(),
removeLocationById: jest.fn(),
removeEntityByUid: jest.fn(),
getEntityByName: jest.fn(),
};
const Wrapper = ({ children }: { children?: React.ReactNode }) => (
<ApiProvider apis={ApiRegistry.with(catalogApiRef, catalogApi)}>
{children}
</ApiProvider>
);
beforeEach(() => {
jest.resetAllMocks();
Object.defineProperty(window.SVGElement.prototype, 'getBBox', {
value: () => ({ width: 100, height: 100 }),
configurable: true,
});
});
it('renders a groups diagram', async () => {
const entities: Entity[] = [
{
apiVersion: 'backstage.io/v1alpha1',
kind: 'Group',
metadata: {
name: 'group-a',
namespace: 'my-namespace',
},
spec: {
type: 'organization',
},
},
];
catalogApi.getEntities.mockResolvedValue({ items: entities });
const { getByText } = await renderInTestApp(
<Wrapper>
<GroupsExplorerContent />
</Wrapper>,
{
mountedRoutes: {
'/catalog/:namespace/:kind/:name': entityRouteRef,
},
},
);
await waitFor(() => {
expect(getByText('my-namespace/group-a')).toBeInTheDocument();
});
});
it('renders a friendly error if it cannot collect domains', async () => {
const catalogError = new Error('Network timeout');
catalogApi.getEntities.mockRejectedValueOnce(catalogError);
const { getByText } = await renderInTestApp(
<Wrapper>
<GroupsExplorerContent />
</Wrapper>,
{
mountedRoutes: {
'/catalog/:namespace/:kind/:name': entityRouteRef,
},
},
);
await waitFor(() =>
expect(getByText(/Warning: Network timeout/)).toBeInTheDocument(),
);
});
});
@@ -0,0 +1,30 @@
/*
* Copyright 2021 Spotify AB
*
* 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 { Content, ContentHeader, SupportButton } from '@backstage/core';
import React from 'react';
import { GroupsDiagram } from './GroupsDiagram';
export const GroupsExplorerContent = () => {
return (
<Content noPadding>
<ContentHeader title="Groups">
<SupportButton>Explore your groups.</SupportButton>
</ContentHeader>
<GroupsDiagram />
</Content>
);
};
@@ -0,0 +1,16 @@
/*
* Copyright 2021 Spotify AB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export { GroupsExplorerContent } from './GroupsExplorerContent';
+3 -3
View File
@@ -32,10 +32,10 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.7.3",
"@backstage/core": "^0.7.7",
"@backstage/core": "^0.7.8",
"@backstage/errors": "^0.1.1",
"@backstage/plugin-catalog-react": "^0.1.1",
"@backstage/theme": "^0.2.6",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -47,7 +47,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",
+3 -3
View File
@@ -30,8 +30,8 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/core": "^0.7.7",
"@backstage/theme": "^0.2.6",
"@backstage/core": "^0.7.8",
"@backstage/theme": "^0.2.7",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -41,7 +41,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.6.9",
"@backstage/cli": "^0.6.10",
"@backstage/dev-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.10",
"@testing-library/jest-dom": "^5.10.1",

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