Merge branch 'master' into github-squash-merge-options

This commit is contained in:
Kyle Leonhard
2022-12-21 11:22:20 -08:00
744 changed files with 13214 additions and 4459 deletions
+15
View File
@@ -1,5 +1,20 @@
# @backstage/plugin-adr-backend
## 0.2.4
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/catalog-client@1.2.0
- @backstage/backend-common@0.17.0
- @backstage/errors@1.1.4
- @backstage/integration@1.4.1
- @backstage/plugin-search-common@1.2.0
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
- @backstage/plugin-adr-common@0.2.4
## 0.2.4-next.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr-backend",
"version": "0.2.4-next.3",
"version": "0.2.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/plugin-adr-common
## 0.2.4
### Patch Changes
- Updated dependencies
- @backstage/integration@1.4.1
- @backstage/plugin-search-common@1.2.0
- @backstage/catalog-model@1.1.4
## 0.2.4-next.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-adr-common",
"description": "Common functionalities for the adr plugin",
"version": "0.2.4-next.3",
"version": "0.2.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+27
View File
@@ -1,5 +1,32 @@
# @backstage/plugin-adr
## 0.2.5
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/integration-react@1.1.8
- @backstage/plugin-catalog-react@1.2.3
- @backstage/plugin-search-react@1.3.1
## 0.2.4
### Patch Changes
- a19cffbeed: Update search links to only have header as linkable text
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/plugin-search-react@1.3.0
- @backstage/core-components@0.12.1
- @backstage/plugin-catalog-react@1.2.2
- @backstage/integration-react@1.1.7
- @backstage/plugin-search-common@1.2.0
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
- @backstage/plugin-adr-common@0.2.4
## 0.2.4-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr",
"version": "0.2.4-next.4",
"version": "0.2.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/plugin-airbrake-backend
## 0.2.12
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/backend-common@0.17.0
- @backstage/config@1.0.5
## 0.2.12-next.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake-backend",
"version": "0.2.12-next.3",
"version": "0.2.12",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+25
View File
@@ -1,5 +1,30 @@
# @backstage/plugin-airbrake
## 0.3.13
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/dev-utils@1.0.10
- @backstage/plugin-catalog-react@1.2.3
## 0.3.12
### Patch Changes
- 2e701b3796: Internal refactor to use `react-router-dom` rather than `react-router`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- 151c0e1477: Remove the `object-hash` dependency
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/test-utils@1.2.3
- @backstage/dev-utils@1.0.9
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
## 0.3.12-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake",
"version": "0.3.12-next.4",
"version": "0.3.12",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+20
View File
@@ -1,5 +1,25 @@
# @backstage/plugin-allure
## 0.1.29
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/plugin-catalog-react@1.2.3
## 0.1.28
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
## 0.1.28-next.4
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-allure",
"description": "A Backstage plugin that integrates with Allure",
"version": "0.1.28-next.4",
"version": "0.1.28",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+21
View File
@@ -1,5 +1,26 @@
# @backstage/plugin-analytics-module-ga
## 0.1.24
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
## 0.1.23
### Patch Changes
- d3fea4ae0a: Internal fixes to avoid implicit usage of globals
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- 9516b0c355: Added support for sending virtual pageviews on `search` events in order to enable
Site Search functionality in GA. For more information consult [README](/plugins/analytics-module-ga/README.md#enabling-site-search)
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/config@1.0.5
- @backstage/theme@0.2.16
## 0.1.23-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-analytics-module-ga",
"version": "0.1.23-next.4",
"version": "0.1.23",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+16
View File
@@ -1,5 +1,21 @@
# @backstage/plugin-apache-airflow
## 0.2.6
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
## 0.2.5
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
## 0.2.5-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-apache-airflow",
"version": "0.2.5-next.4",
"version": "0.2.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+23
View File
@@ -1,5 +1,28 @@
# @backstage/plugin-api-docs
## 0.8.13
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/plugin-catalog@1.7.1
- @backstage/plugin-catalog-react@1.2.3
## 0.8.12
### Patch Changes
- 2e701b3796: Internal refactor to use `react-router-dom` rather than `react-router`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/plugin-catalog@1.7.0
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
## 0.8.12-next.4
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-api-docs",
"description": "A Backstage plugin that helps represent API entities in the frontend",
"version": "0.8.12-next.4",
"version": "0.8.12",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+17
View File
@@ -1,5 +1,22 @@
# @backstage/plugin-apollo-explorer
## 0.1.6
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
## 0.1.5
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/theme@0.2.16
## 0.1.5-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-apollo-explorer",
"version": "0.1.5-next.4",
"version": "0.1.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+13
View File
@@ -1,5 +1,18 @@
# @backstage/plugin-app-backend
## 0.3.39
### Patch Changes
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/backend-common@0.17.0
- @backstage/backend-plugin-api@0.2.0
- @backstage/config-loader@1.1.7
- @backstage/types@1.0.2
- @backstage/config@1.0.5
## 0.3.39-next.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-app-backend",
"description": "A Backstage backend plugin that serves the Backstage frontend app",
"version": "0.3.39-next.3",
"version": "0.3.39",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,7 +30,7 @@ import { ConfigReader } from '@backstage/config';
import getPort from 'get-port';
describe('appPlugin', () => {
beforeAll(() => {
beforeEach(() => {
mockFs({
[resolvePath(process.cwd(), 'node_modules/app')]: {
'package.json': '{}',
@@ -42,7 +42,7 @@ describe('appPlugin', () => {
});
});
afterAll(() => {
afterEach(() => {
mockFs.restore();
});
+14
View File
@@ -1,5 +1,19 @@
# @backstage/plugin-auth-backend
## 0.17.2
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/catalog-client@1.2.0
- @backstage/backend-common@0.17.0
- @backstage/errors@1.1.4
- @backstage/plugin-auth-node@0.2.8
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.17.2-next.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend",
"description": "A Backstage backend plugin that handles authentication",
"version": "0.17.2-next.3",
"version": "0.17.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/plugin-auth-node
## 0.2.8
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/backend-common@0.17.0
- @backstage/errors@1.1.4
- @backstage/config@1.0.5
## 0.2.8-next.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-node",
"version": "0.2.8-next.3",
"version": "0.2.8",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-azure-devops-backend
## 0.3.18
### Patch Changes
- eaccf6d628: Updated installation documentation
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/backend-common@0.17.0
- @backstage/config@1.0.5
- @backstage/plugin-azure-devops-common@0.3.0
## 0.3.18-next.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops-backend",
"version": "0.3.18-next.3",
"version": "0.3.18",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+23
View File
@@ -1,5 +1,28 @@
# @backstage/plugin-azure-devops
## 0.2.4
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/plugin-catalog-react@1.2.3
## 0.2.3
### Patch Changes
- 2e701b3796: Internal refactor to use `react-router-dom` rather than `react-router`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/errors@1.1.4
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
- @backstage/plugin-azure-devops-common@0.3.0
## 0.2.3-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops",
"version": "0.2.3-next.4",
"version": "0.2.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/plugin-azure-sites-backend
## 0.1.1
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/backend-common@0.17.0
- @backstage/config@1.0.5
- @backstage/plugin-azure-sites-common@0.1.0
## 0.1.1-next.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-sites-backend",
"version": "0.1.1-next.3",
"version": "0.1.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+21
View File
@@ -1,5 +1,26 @@
# @backstage/plugin-azure-sites
## 0.1.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/plugin-catalog-react@1.2.3
## 0.1.1
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
- @backstage/plugin-azure-sites-common@0.1.0
## 0.1.1-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-sites",
"version": "0.1.1-next.4",
"version": "0.1.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-badges-backend
## 0.1.33
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.2.0
- @backstage/backend-common@0.17.0
- @backstage/errors@1.1.4
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.1.33-next.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges-backend",
"description": "A Backstage backend plugin that generates README badges for your entities",
"version": "0.1.33-next.3",
"version": "0.1.33",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+22
View File
@@ -1,5 +1,27 @@
# @backstage/plugin-badges
## 0.2.37
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/plugin-catalog-react@1.2.3
## 0.2.36
### Patch Changes
- 2e701b3796: Internal refactor to use `react-router-dom` rather than `react-router`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/errors@1.1.4
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
## 0.2.36-next.4
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges",
"description": "A Backstage plugin that generates README badges for your entities",
"version": "0.2.36-next.4",
"version": "0.2.36",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+13
View File
@@ -1,5 +1,18 @@
# @backstage/plugin-bazaar-backend
## 0.2.2
### Patch Changes
- c507aee8a2: Ensured typescript type checks in migration files.
- 9b1891061c: Column `title` has replaced column `name` for `BazaarProject` in database
- Updated dependencies
- @backstage/backend-common@0.17.0
- @backstage/backend-test-utils@0.1.31
- @backstage/errors@1.1.4
- @backstage/plugin-auth-node@0.2.8
- @backstage/config@1.0.5
## 0.2.2-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar-backend",
"version": "0.2.2-next.4",
"version": "0.2.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+27
View File
@@ -1,5 +1,32 @@
# @backstage/plugin-bazaar
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/cli@0.22.0
- @backstage/plugin-catalog@1.7.1
- @backstage/plugin-catalog-react@1.2.3
## 0.2.1
### Patch Changes
- 9b1891061c: `HomePageBazaarInfoCard` is now displaying `title` instead of `name`. Title is a string that doesn't have to be URL friendly.
The BazaarOverviewCard have the new property `fullHeight`. Link in `BazaarOverviewCard`is moved to header in card.
- 312962da30: Add `title` as optional parameter to `BazaarOverviewCard`
- Updated dependencies
- @backstage/plugin-catalog@1.7.0
- @backstage/core-plugin-api@1.2.0
- @backstage/catalog-client@1.2.0
- @backstage/core-components@0.12.1
- @backstage/cli@0.22.0
- @backstage/errors@1.1.4
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
## 0.2.1-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar",
"version": "0.2.1-next.4",
"version": "0.2.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,13 @@
# @backstage/plugin-bitbucket-cloud-common
## 0.2.2
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/integration@1.4.1
## 0.2.2-next.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-bitbucket-cloud-common",
"description": "Common functionalities for bitbucket-cloud plugins",
"version": "0.2.2-next.1",
"version": "0.2.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+20
View File
@@ -1,5 +1,25 @@
# @backstage/plugin-bitrise
## 0.1.40
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/plugin-catalog-react@1.2.3
## 0.1.39
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/core-components@0.12.1
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
## 0.1.39-next.4
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-bitrise",
"description": "A Backstage plugin that integrates towards Bitrise",
"version": "0.1.39-next.4",
"version": "0.1.39",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,22 @@
# @backstage/plugin-catalog-backend-module-aws
## 0.1.12
### Patch Changes
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/errors@1.1.4
- @backstage/backend-plugin-api@0.2.0
- @backstage/integration@1.4.1
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.1.12-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-aws",
"description": "A Backstage catalog backend module that helps integrate towards AWS",
"version": "0.1.12-next.3",
"version": "0.1.12",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,23 @@
# @backstage/plugin-catalog-backend-module-azure
## 0.1.10
### Patch Changes
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/errors@1.1.4
- @backstage/backend-plugin-api@0.2.0
- @backstage/integration@1.4.1
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.1.10-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-azure",
"description": "A Backstage catalog backend module that helps integrate towards Azure",
"version": "0.1.10-next.3",
"version": "0.1.10",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,27 @@
# @backstage/plugin-catalog-backend-module-bitbucket-cloud
## 0.1.6
### Patch Changes
- ce08e1798e: Refresh (potentially) updated catalog files on `repo:push` more efficiently.
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- 4eb0bce299: Fix repo:push topic not matching `BitbucketCloudEventRouter`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/catalog-client@1.2.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/backend-plugin-api@0.2.0
- @backstage/plugin-events-node@0.2.0
- @backstage/integration@1.4.1
- @backstage/plugin-bitbucket-cloud-common@0.2.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
- @backstage/plugin-catalog-common@1.0.9
## 0.1.6-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud",
"description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud",
"version": "0.1.6-next.3",
"version": "0.1.6",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,22 @@
# @backstage/plugin-catalog-backend-module-bitbucket-server
## 0.1.4
### Patch Changes
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/errors@1.1.4
- @backstage/backend-plugin-api@0.2.0
- @backstage/integration@1.4.1
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.1.4-next.3
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-server",
"version": "0.1.4-next.3",
"version": "0.1.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,20 @@
# @backstage/plugin-catalog-backend-module-bitbucket
## 0.2.6
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-common@0.17.0
- @backstage/errors@1.1.4
- @backstage/integration@1.4.1
- @backstage/plugin-bitbucket-cloud-common@0.2.2
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.2.6-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket",
"description": "A Backstage catalog backend module that helps integrate towards Bitbucket",
"version": "0.2.6-next.3",
"version": "0.2.6",
"deprecated": true,
"main": "src/index.ts",
"types": "src/index.ts",
@@ -1,5 +1,22 @@
# @backstage/plugin-catalog-backend-module-gerrit
## 0.1.7
### Patch Changes
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/errors@1.1.4
- @backstage/backend-plugin-api@0.2.0
- @backstage/integration@1.4.1
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.1.7-next.3
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-gerrit",
"version": "0.1.7-next.3",
"version": "0.1.7",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,40 @@
# @backstage/plugin-catalog-backend-module-github
## 0.2.2
### Patch Changes
- 70fa5ec3ec: Fixes the assignment of group member references in `GithubMultiOrgProcessor` so membership relations are resolved correctly.
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- fe93cce743: Added the githubCredentialsProvider property to the GithubLocationAnalyzerOptions to be able to override the GithubCredentialsProvider.
- a0fd4af94a: Handle GitHub `push` events at the `GithubEntityProvider` by subscribing to the topic `github.push.`
Implements `EventSubscriber` to receive events for the topic `github.push`.
On `github.push`, the affected repository will be refreshed.
This includes adding new Location entities, refreshing existing ones,
and removing obsolete ones.
Please find more information at
https://backstage.io/docs/integrations/github/discovery#installation-with-events-support
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- 754b5854df: Fix incorrectly exported GithubOrgEntityProvider as a type
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/catalog-client@1.2.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/errors@1.1.4
- @backstage/backend-plugin-api@0.2.0
- @backstage/plugin-events-node@0.2.0
- @backstage/integration@1.4.1
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
- @backstage/plugin-catalog-common@1.0.9
## 0.2.2-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-github",
"description": "A Backstage catalog backend module that helps integrate towards GitHub",
"version": "0.2.2-next.3",
"version": "0.2.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,23 @@
# @backstage/plugin-catalog-backend-module-gitlab
## 0.1.10
### Patch Changes
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/errors@1.1.4
- @backstage/backend-plugin-api@0.2.0
- @backstage/integration@1.4.1
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.1.10-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-gitlab",
"description": "A Backstage catalog backend module that helps integrate towards GitLab",
"version": "0.1.10-next.3",
"version": "0.1.10",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,39 @@
# @backstage/plugin-catalog-backend-module-incremental-ingestion
## 0.1.0
### Minor Changes
- 98c643a1a2: Introduces incremental entity providers, which are used for streaming very large data sources into the catalog.
### Patch Changes
- c507aee8a2: Ensured typescript type checks in migration files.
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- de8a975911: Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
of the one from `node-abort-controller`. This is possible now that the minimum
supported Node.js version of the project is 16.
Note that their interfaces are very slightly different, but typically not in a
way that matters to consumers. If you see any typescript errors as a direct
result from this, they are compatible with each other in the ways that we
interact with them, and should be possible to type-cast across without ill
effects.
- 05a928e296: Updated usages of types from `@backstage/backend-plugin-api`.
- 61d4efe978: Make incremental providers more resilient to failures
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/plugin-permission-common@0.7.2
- @backstage/backend-test-utils@0.1.31
- @backstage/errors@1.1.4
- @backstage/backend-plugin-api@0.2.0
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.1.0-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-incremental-ingestion",
"description": "An entity provider for streaming large asset sources into the catalog",
"version": "0.1.0-next.3",
"version": "0.1.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -14,9 +14,12 @@
* limitations under the License.
*/
import { Logger, loggerToWinstonLogger } from '@backstage/backend-plugin-api';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
import { Config } from '@backstage/config';
import {
ConfigService,
LoggerService,
SchedulerService,
loggerToWinstonLogger,
} from '@backstage/backend-plugin-api';
import { stringifyError } from '@backstage/errors';
import {
EntityProvider,
@@ -46,10 +49,10 @@ export class WrapperProviders {
constructor(
private readonly options: {
config: Config;
logger: Logger;
config: ConfigService;
logger: LoggerService;
client: Knex;
scheduler: PluginTaskScheduler;
scheduler: SchedulerService;
applyDatabaseMigrations?: typeof applyDatabaseMigrations;
},
) {}
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-backend-module-ldap
## 0.5.6
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-tasks@0.4.0
- @backstage/errors@1.1.4
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.5.6-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-ldap",
"description": "A Backstage catalog backend module that helps integrate towards LDAP",
"version": "0.5.6-next.3",
"version": "0.5.6",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend-module-msgraph
## 0.4.5
### Patch Changes
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/backend-tasks@0.4.0
- @backstage/backend-plugin-api@0.2.0
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.4.5-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-msgraph",
"description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph",
"version": "0.4.5-next.3",
"version": "0.4.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend-module-openapi
## 0.1.5
### Patch Changes
- dd995cdc72: Enabled support of resolving `$refs` in all kind of yaml documents, not only OpenAPI. This implicitly adds `$ref` resolving support for AsyncAPI specs. Thus, the `openApiPlaceholderResolver` has been renamed to `jsonSchemaRefPlaceholderResolver`.
- Updated dependencies
- @backstage/plugin-catalog-backend@1.6.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/integration@1.4.1
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.1.5-next.3
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-openapi",
"description": "A Backstage catalog backend module that helps with OpenAPI specifications",
"version": "0.1.5-next.3",
"version": "0.1.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+67
View File
@@ -1,5 +1,72 @@
# @backstage/plugin-catalog-backend
## 1.6.0
### Minor Changes
- 16891a212c: Added new `POST /entities/by-refs` endpoint, which allows you to efficiently
batch-fetch entities by their entity ref. This can be useful e.g. in graphql
resolvers or similar contexts where you need to fetch many entities at the same
time.
- 273ba3a77f: Deprecated Prometheus metrics in favour of OpenTelemtry metrics.
- c395abb5b2: The catalog no longer stops after the first processor `validateEntityKind`
method returns `true` when validating entity kind shapes. Instead, it continues
through all registered processors that have this method, and requires that _at
least one_ of them returned true.
The old behavior of stopping early made it harder to extend existing core kinds
with additional fields, since the `BuiltinKindsEntityProcessor` is always
present at the top of the processing chain and ensures that your additional
validation code would never be run.
This is technically a breaking change, although it should not affect anybody
under normal circumstances, except if you had problematic validation code that
you were unaware that it was not being run. That code may now start to exhibit
those problems.
If you need to disable this new behavior, `CatalogBuilder` as used in your
`packages/backend/src/plugins/catalog.ts` file now has a
`useLegacySingleProcessorValidation()` method to go back to the old behavior.
```diff
const builder = await CatalogBuilder.create(env);
+builder.useLegacySingleProcessorValidation();
```
- 3072ebfdd7: The search table also holds the original entity value now and the facets endpoint fetches the filtered entity data from the search table.
### Patch Changes
- ba13ff663c: Added a new `catalog.rules[].location` configuration that makes it possible to configure catalog rules to only apply to specific locations, either via exact match or a glob pattern.
- d8593ce0e6: Do not use deprecated `LocationSpec` from the `@backstage/plugin-catalog-node` package
- c507aee8a2: Ensured typescript type checks in migration files.
- 2a8e3cc0b5: Optimize `Stitcher` process to be more memory efficient
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
- eacc8e2b55: Make it possible for entity providers to supply only entity refs, instead of full entities, in `delta` mutation deletions.
- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries
- 5b3e2afa45: Fixed deprecated use of `substr` into `substring`.
- 71147d5c16: Internal code reorganization.
- 93870e4df1: Track the last time the final entity changed with new timestamp "last updated at" data in final entities database, which gets updated with the time when final entity is updated.
- 20a5161f04: Adds MySQL support for the catalog-backend
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- e982f77fe3: Registered shutdown hook in experimental catalog plugin.
- b3fac9c107: Ignore attempts at emitting the current entity as a child of itself.
- Updated dependencies
- @backstage/catalog-client@1.2.0
- @backstage/backend-common@0.17.0
- @backstage/plugin-catalog-node@1.3.0
- @backstage/plugin-permission-common@0.7.2
- @backstage/plugin-permission-node@0.7.2
- @backstage/errors@1.1.4
- @backstage/backend-plugin-api@0.2.0
- @backstage/integration@1.4.1
- @backstage/types@1.0.2
- @backstage/plugin-search-common@1.2.0
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
- @backstage/plugin-catalog-common@1.0.9
- @backstage/plugin-scaffolder-common@1.2.3
## 1.6.0-next.3
### Patch Changes
@@ -0,0 +1,39 @@
/*
* Copyright 2022 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// @ts-check
/**
* @param { import("knex").Knex } knex
*/
exports.up = async function up(knex) {
await knex.schema.table('final_entities', table => {
table
.dateTime('last_updated_at')
.nullable()
.comment('The time when final_entity changed');
});
};
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = async function down(knex) {
await knex.schema.table('final_entities', table => {
table.dropColumn('last_updated_at');
});
};
+2 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend",
"description": "The Backstage backend plugin that provides the Backstage catalog",
"version": "1.6.0-next.3",
"version": "1.6.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -47,6 +47,7 @@
"@backstage/plugin-scaffolder-common": "workspace:^",
"@backstage/plugin-search-common": "workspace:^",
"@backstage/types": "workspace:^",
"@opentelemetry/api": "^1.3.0",
"@types/express": "^4.17.6",
"codeowners-utils": "^1.0.2",
"core-js": "^3.6.5",
@@ -38,6 +38,14 @@ export type EntityPagination = {
after?: string;
};
/**
* A sorting rule for entities.
*/
export type EntityOrder = {
field: string;
order: 'asc' | 'desc';
};
/**
* Matches rows in the search table.
* @public
@@ -71,6 +79,7 @@ export type PageInfo =
export type EntitiesRequest = {
filter?: EntityFilter;
fields?: (entity: Entity) => Entity;
order?: EntityOrder[];
pagination?: EntityPagination;
authorizationToken?: string;
};
@@ -462,12 +462,17 @@ describe('DefaultProcessingDatabase', () => {
knexTx<DbRefreshStateReferencesRow>(
'refresh_state_references',
).select(),
).resolves.toEqual([
expect.objectContaining({
source_entity_ref: 'location:default/fakelocation',
target_entity_ref: 'component:default/1',
}),
]);
).resolves.toEqual(
step.expectConflict
? []
: [
// eslint-disable-next-line jest/no-conditional-expect
expect.objectContaining({
source_entity_ref: 'location:default/fakelocation',
target_entity_ref: 'component:default/1',
}),
],
);
expect(mockLogger.error).not.toHaveBeenCalled();
}
@@ -314,7 +314,6 @@ export class DefaultProcessingDatabase implements ProcessingDatabase {
// Keeps track of the entities that we end up inserting to update refresh_state_references afterwards
const stateReferences = new Array<string>();
const conflictingStateReferences = new Array<string>();
// Upsert all of the unprocessed entities into the refresh_state table, by
// their entity ref.
@@ -357,13 +356,11 @@ export class DefaultProcessingDatabase implements ProcessingDatabase {
this.options.logger.warn(
`Detected conflicting entityRef ${entityRef} already referenced by ${conflictingKey} and now also ${locationKey}`,
);
conflictingStateReferences.push(entityRef);
}
}
// Replace all references for the originating entity or source and then create new ones
await tx<DbRefreshStateReferencesRow>('refresh_state_references')
.whereNotIn('target_entity_ref', conflictingStateReferences)
.andWhere({ source_entity_ref: options.sourceEntityRef })
.delete();
await tx.batchInsert(
@@ -610,6 +610,23 @@ describe('DefaultProviderDatabase', () => {
}),
]),
);
let references = await knex<DbRefreshStateReferencesRow>(
'refresh_state_references',
).select();
expect(references).toEqual([
{
id: 1,
source_key: 'lols',
source_entity_ref: null,
target_entity_ref: 'component:default/a',
},
{
id: 2,
source_key: 'lols',
source_entity_ref: null,
target_entity_ref: 'component:default/b',
},
]);
await db.transaction(async tx => {
await db.replaceUnprocessedEntities(tx, {
@@ -653,6 +670,23 @@ describe('DefaultProviderDatabase', () => {
}),
]),
);
references = await knex<DbRefreshStateReferencesRow>(
'refresh_state_references',
).select();
expect(references).toEqual([
{
id: 2,
source_key: 'lols',
source_entity_ref: null,
target_entity_ref: 'component:default/b',
},
{
id: 3,
source_key: 'lols',
source_entity_ref: null,
target_entity_ref: 'component:default/a',
},
]);
},
60_000,
);
@@ -161,6 +161,11 @@ export class DefaultProviderDatabase implements ProviderDatabase {
});
}
await tx<DbRefreshStateReferencesRow>('refresh_state_references')
.where('target_entity_ref', entityRef)
.andWhere({ source_key: options.sourceKey })
.delete();
if (ok) {
await tx<DbRefreshStateReferencesRow>(
'refresh_state_references',
@@ -66,6 +66,7 @@ export type DbFinalEntitiesRow = {
hash: string;
stitch_ticket: string;
final_entity?: string;
last_updated_at?: string | Date;
};
export type DbSearchRow = {
@@ -100,4 +100,82 @@ describe('migrations', () => {
},
60_000,
);
it.each(databases.eachSupportedId())(
'20221201085245_add_last_updated_at_in_final_entities.js, %p',
async databaseId => {
const knex = await databases.init(databaseId);
await migrateUntilBefore(
knex,
'20221201085245_add_last_updated_at_in_final_entities.js',
);
await knex
.insert([
{
entity_id: 'my-id',
entity_ref: 'k:ns/n',
unprocessed_entity: JSON.stringify({}),
processed_entity: JSON.stringify({
apiVersion: 'a',
kind: 'k',
metadata: {
name: 'n',
namespace: 'ns',
},
spec: {
k: 'v',
},
}),
errors: '[]',
next_update_at: knex.fn.now(),
last_discovery_at: knex.fn.now(),
},
])
.into('refresh_state');
await knex
.insert({
entity_id: 'my-id',
hash: 'd1c0c56d5fea4238e4c091d9dde4cb42d05a6b7e',
stitch_ticket: '52367ed7-120b-405f-b7e0-cdd90f956312',
final_entity:
'{"apiVersion":"a","kind":"k","metadata":{"name":"n","namespace":"ns","uid":"my-id","etag":"d1c0c56d5fea4238e4c091d9dde4cb42d05a6b7e"},"spec":{"k":"v"},"relations":[{"type":"looksAt","targetRef":"k:ns/other"}]}',
})
.into('final_entities');
await migrateUpOnce(knex);
await expect(knex('final_entities')).resolves.toEqual(
expect.arrayContaining([
{
entity_id: 'my-id',
hash: 'd1c0c56d5fea4238e4c091d9dde4cb42d05a6b7e',
stitch_ticket: '52367ed7-120b-405f-b7e0-cdd90f956312',
final_entity:
'{"apiVersion":"a","kind":"k","metadata":{"name":"n","namespace":"ns","uid":"my-id","etag":"d1c0c56d5fea4238e4c091d9dde4cb42d05a6b7e"},"spec":{"k":"v"},"relations":[{"type":"looksAt","targetRef":"k:ns/other"}]}',
last_updated_at: null,
},
]),
);
await migrateDownOnce(knex);
await expect(knex('final_entities')).resolves.toEqual(
expect.arrayContaining([
{
entity_id: 'my-id',
hash: 'd1c0c56d5fea4238e4c091d9dde4cb42d05a6b7e',
stitch_ticket: '52367ed7-120b-405f-b7e0-cdd90f956312',
final_entity:
'{"apiVersion":"a","kind":"k","metadata":{"name":"n","namespace":"ns","uid":"my-id","etag":"d1c0c56d5fea4238e4c091d9dde4cb42d05a6b7e"},"spec":{"k":"v"},"relations":[{"type":"looksAt","targetRef":"k:ns/other"}]}',
},
]),
);
await knex.destroy();
},
60_000,
);
});
@@ -23,6 +23,7 @@ import { assertError, serializeError, stringifyError } from '@backstage/errors';
import { Hash } from 'crypto';
import stableStringify from 'fast-json-stable-stringify';
import { Logger } from 'winston';
import { metrics } from '@opentelemetry/api';
import { ProcessingDatabase, RefreshStateItem } from '../database/types';
import { createCounterMetric, createSummaryMetric } from '../util/metrics';
import {
@@ -257,62 +258,123 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine {
// Helps wrap the timing and logging behaviors
function progressTracker() {
const stitchedEntities = createCounterMetric({
// prom-client metrics are deprecated in favour of OpenTelemetry metrics.
const promStitchedEntities = createCounterMetric({
name: 'catalog_stitched_entities_count',
help: 'Amount of entities stitched',
help: 'Amount of entities stitched. DEPRECATED, use OpenTelemetry metrics instead',
});
const processedEntities = createCounterMetric({
const promProcessedEntities = createCounterMetric({
name: 'catalog_processed_entities_count',
help: 'Amount of entities processed',
help: 'Amount of entities processed, DEPRECATED, use OpenTelemetry metrics instead',
labelNames: ['result'],
});
const processingDuration = createSummaryMetric({
const promProcessingDuration = createSummaryMetric({
name: 'catalog_processing_duration_seconds',
help: 'Time spent executing the full processing flow',
help: 'Time spent executing the full processing flow, DEPRECATED, use OpenTelemetry metrics instead',
labelNames: ['result'],
});
const processorsDuration = createSummaryMetric({
const promProcessorsDuration = createSummaryMetric({
name: 'catalog_processors_duration_seconds',
help: 'Time spent executing catalog processors',
help: 'Time spent executing catalog processors, DEPRECATED, use OpenTelemetry metrics instead',
labelNames: ['result'],
});
const processingQueueDelay = createSummaryMetric({
const promProcessingQueueDelay = createSummaryMetric({
name: 'catalog_processing_queue_delay_seconds',
help: 'The amount of delay between being scheduled for processing, and the start of actually being processed',
help: 'The amount of delay between being scheduled for processing, and the start of actually being processed, DEPRECATED, use OpenTelemetry metrics instead',
});
const meter = metrics.getMeter('default');
const stitchedEntities = meter.createCounter(
'catalog.stitched.entities.count',
{
description: 'Amount of entities stitched',
},
);
const processedEntities = meter.createCounter(
'catalog.processed.entities.count',
{ description: 'Amount of entities processed' },
);
const processingDuration = meter.createHistogram(
'catalog.processing.duration',
{
description: 'Time spent executing the full processing flow',
unit: 'seconds',
},
);
const processorsDuration = meter.createHistogram(
'catalog.processors.duration',
{
description: 'Time spent executing catalog processors',
unit: 'seconds',
},
);
const processingQueueDelay = meter.createHistogram(
'catalog.processing.queue.delay',
{
description:
'The amount of delay between being scheduled for processing, and the start of actually being processed',
unit: 'seconds',
},
);
function processStart(item: RefreshStateItem, logger: Logger) {
const startTime = process.hrtime();
const endOverallTimer = promProcessingDuration.startTimer();
const endProcessorsTimer = promProcessorsDuration.startTimer();
logger.debug(`Processing ${item.entityRef}`);
if (item.nextUpdateAt) {
processingQueueDelay.observe(-item.nextUpdateAt.diffNow().as('seconds'));
const seconds = -item.nextUpdateAt.diffNow().as('seconds');
promProcessingQueueDelay.observe(seconds);
processingQueueDelay.record(seconds);
}
const endOverallTimer = processingDuration.startTimer();
const endProcessorsTimer = processorsDuration.startTimer();
function endTime() {
const delta = process.hrtime(startTime);
return delta[0] + delta[1] / 1e9;
}
function markProcessorsCompleted(result: EntityProcessingResult) {
endProcessorsTimer({ result: result.ok ? 'ok' : 'failed' });
processorsDuration.record(endTime(), {
result: result.ok ? 'ok' : 'failed',
});
}
function markSuccessfulWithNoChanges() {
endOverallTimer({ result: 'unchanged' });
processedEntities.inc({ result: 'unchanged' }, 1);
promProcessedEntities.inc({ result: 'unchanged' }, 1);
processingDuration.record(endTime(), { result: 'unchanged' });
processedEntities.add(1, { result: 'unchanged' });
}
function markSuccessfulWithErrors() {
endOverallTimer({ result: 'errors' });
processedEntities.inc({ result: 'errors' }, 1);
promProcessedEntities.inc({ result: 'errors' }, 1);
processingDuration.record(endTime(), { result: 'errors' });
processedEntities.add(1, { result: 'errors' });
}
function markSuccessfulWithChanges(stitchedCount: number) {
endOverallTimer({ result: 'changed' });
stitchedEntities.inc(stitchedCount);
processedEntities.inc({ result: 'changed' }, 1);
promStitchedEntities.inc(stitchedCount);
promProcessedEntities.inc({ result: 'changed' }, 1);
processingDuration.record(endTime(), { result: 'changed' });
stitchedEntities.add(stitchedCount);
processedEntities.add(1, { result: 'changed' });
}
function markFailed(error: Error) {
processedEntities.inc({ result: 'failed' }, 1);
promProcessedEntities.inc({ result: 'failed' }, 1);
processedEntities.add(1, { result: 'failed' });
logger.warn(`Processing of ${item.entityRef} failed`, error);
}
@@ -258,13 +258,22 @@ describe('DefaultCatalogProcessingOrchestrator', () => {
},
};
const child: Entity = {
apiVersion: '1',
kind: 'Component',
metadata: {
name: 'Test2',
namespace: 'test1',
},
};
it('enforces catalog rules', async () => {
const integrations = ScmIntegrations.fromConfig(new ConfigReader({}));
const processor: jest.Mocked<CatalogProcessor> = {
getProcessorName: jest.fn(),
validateEntityKind: jest.fn(async () => true),
readLocation: jest.fn(async (_l, _o, emit) => {
emit(processingResult.entity({ type: 't', target: 't' }, entity));
emit(processingResult.entity({ type: 't', target: 't' }, child));
return true;
}),
};
@@ -300,7 +309,7 @@ describe('DefaultCatalogProcessingOrchestrator', () => {
getProcessorName: jest.fn(),
validateEntityKind: jest.fn(async () => true),
readLocation: jest.fn(async (_l, _o, emit) => {
emit(processingResult.entity({ type: 't', target: 't' }, entity));
emit(processingResult.entity({ type: 't', target: 't' }, child));
return true;
}),
};
@@ -187,7 +187,7 @@ export class DefaultCatalogProcessingOrchestrator
res = await processor.preProcessEntity(
res,
context.location,
context.collector.onEmit,
context.collector.forProcessor(processor),
context.originLocation,
context.cache.forProcessor(processor),
);
@@ -300,7 +300,7 @@ export class DefaultCatalogProcessingOrchestrator
for (const maybeRelativeTarget of targets) {
if (type === 'file' && maybeRelativeTarget.endsWith(path.sep)) {
context.collector.onEmit(
context.collector.generic()(
processingResult.inputError(
context.location,
`LocationEntityProcessor cannot handle ${type} type location with target ${context.location.target} that ends with a path separator`,
@@ -326,7 +326,7 @@ export class DefaultCatalogProcessingOrchestrator
presence,
},
presence === 'optional',
context.collector.onEmit,
context.collector.forProcessor(processor),
this.options.parser,
context.cache.forProcessor(processor, target),
);
@@ -365,7 +365,7 @@ export class DefaultCatalogProcessingOrchestrator
res = await processor.postProcessEntity(
res,
context.location,
context.collector.onEmit,
context.collector.forProcessor(processor),
context.cache.forProcessor(processor),
);
} catch (e) {
@@ -19,10 +19,12 @@ import {
ANNOTATION_LOCATION,
ANNOTATION_ORIGIN_LOCATION,
stringifyLocationRef,
stringifyEntityRef,
} from '@backstage/catalog-model';
import { assertError } from '@backstage/errors';
import { Logger } from 'winston';
import {
CatalogProcessor,
CatalogProcessorResult,
DeferredEntity,
EntityRelationSpec,
@@ -50,8 +52,17 @@ export class ProcessorOutputCollector {
private readonly parentEntity: Entity,
) {}
get onEmit(): (i: CatalogProcessorResult) => void {
return i => this.receive(i);
generic(): (i: CatalogProcessorResult) => void {
return i => this.receive(this.logger, i);
}
forProcessor(
processor: CatalogProcessor,
): (i: CatalogProcessorResult) => void {
const logger = this.logger.child({
processor: processor.getProcessorName(),
});
return i => this.receive(logger, i);
}
results() {
@@ -64,9 +75,9 @@ export class ProcessorOutputCollector {
};
}
private receive(i: CatalogProcessorResult) {
private receive(logger: Logger, i: CatalogProcessorResult) {
if (this.done) {
this.logger.warn(
logger.warn(
`Item of type "${
i.type
}" was emitted after processing had completed. Stack trace: ${
@@ -84,11 +95,24 @@ export class ProcessorOutputCollector {
entity = validateEntityEnvelope(i.entity);
} catch (e) {
assertError(e);
this.logger.debug(`Envelope validation failed at ${location}, ${e}`);
logger.debug(`Envelope validation failed at ${location}, ${e}`);
this.errors.push(e);
return;
}
// The processor contract says you should return the "trunk" (current)
// entity, not emit it. But it happens that this is misunderstood or
// accidentally forgotten. This can lead to circular references which at
// best is wasteful, so we try to be helpful by ignoring such emitted
// entities.
const entityRef = stringifyEntityRef(entity);
if (entityRef === stringifyEntityRef(this.parentEntity)) {
logger.warn(
`Ignored emitted entity ${entityRef} whose ref was identical to the one being processed. This commonly indicates mistakenly emitting the input entity instead of returning it.`,
);
return;
}
// Note that at this point, we have only validated the envelope part of
// the entity data. Annotations are not part of that, so we have to be
// defensive. If the annotations were malformed (e.g. were not a valid
@@ -28,6 +28,7 @@ import {
import { Stitcher } from '../stitching/Stitcher';
import { buildEntitySearch } from '../stitching/buildEntitySearch';
import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog';
import { EntitiesRequest } from '../catalog/types';
describe('DefaultEntitiesCatalog', () => {
const databases = TestDatabases.create({
@@ -254,7 +255,7 @@ describe('DefaultEntitiesCatalog', () => {
describe('entities', () => {
it.each(databases.eachSupportedId())(
'should return correct entity for simple filter',
'should return correct entity for simple filter, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
const entity1: Entity = {
@@ -284,10 +285,11 @@ describe('DefaultEntitiesCatalog', () => {
expect(entities.length).toBe(1);
expect(entities[0]).toEqual(entity2);
},
60_000,
);
it.each(databases.eachSupportedId())(
'should return correct entity for negation filter',
'should return correct entity for negation filter, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
const entity1: Entity = {
@@ -319,10 +321,11 @@ describe('DefaultEntitiesCatalog', () => {
expect(entities.length).toBe(1);
expect(entities[0]).toEqual(entity1);
},
60_000,
);
it.each(databases.eachSupportedId())(
'should return correct entities for nested filter',
'should return correct entities for nested filter, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
const entity1: Entity = {
@@ -388,10 +391,11 @@ describe('DefaultEntitiesCatalog', () => {
expect(entities).toContainEqual(entity2);
expect(entities).toContainEqual(entity4);
},
60_000,
);
it.each(databases.eachSupportedId())(
'should return correct entities for complex negation filter',
'should return correct entities for complex negation filter, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
const entity1: Entity = {
@@ -429,10 +433,11 @@ describe('DefaultEntitiesCatalog', () => {
expect(entities.length).toBe(1);
expect(entities).toContainEqual(entity1);
},
60_000,
);
it.each(databases.eachSupportedId())(
'should return no matches for an empty values array',
'should return no matches for an empty values array, %p',
// NOTE: An empty values array is not a sensible input in a realistic scenario.
async databaseId => {
const { knex } = await createDatabase(databaseId);
@@ -461,6 +466,7 @@ describe('DefaultEntitiesCatalog', () => {
expect(entities.length).toBe(0);
},
60_000,
);
it.each(databases.eachSupportedId())(
@@ -517,12 +523,105 @@ describe('DefaultEntitiesCatalog', () => {
},
]);
},
60_000,
);
it.each(databases.eachSupportedId())(
'can order and combine with filtering, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
const entity1: Entity = {
apiVersion: 'a',
kind: 'k',
metadata: { name: 'n1' },
spec: { a: 'foo' },
};
const entity2: Entity = {
apiVersion: 'a',
kind: 'k',
metadata: { name: 'n2' },
spec: { a: 'bar' },
};
const entity3: Entity = {
apiVersion: 'a',
kind: 'k',
metadata: { name: 'n3' },
spec: { a: 'bar', b: 'lonely' },
};
const entity4: Entity = {
apiVersion: 'a',
kind: 'k',
metadata: { name: 'n4' },
spec: { a: 'baz', b: 'only' },
};
await addEntityToSearch(knex, entity1);
await addEntityToSearch(knex, entity2);
await addEntityToSearch(knex, entity3);
await addEntityToSearch(knex, entity4);
const catalog = new DefaultEntitiesCatalog(knex, stitcher);
function f(request: EntitiesRequest): Promise<string[]> {
return catalog
.entities(request)
.then(response => response.entities.map(e => e.metadata.name));
}
await expect(
f({ order: [{ field: 'metadata.name', order: 'asc' }] }),
).resolves.toEqual(['n1', 'n2', 'n3', 'n4']);
await expect(
f({ order: [{ field: 'metadata.name', order: 'desc' }] }),
).resolves.toEqual(['n4', 'n3', 'n2', 'n1']);
await expect(
f({
order: [
{ field: 'spec.a', order: 'asc' },
{ field: 'metadata.name', order: 'desc' },
],
}),
).resolves.toEqual(['n3', 'n2', 'n4', 'n1']);
await expect(
f({
filter: { not: { key: 'spec.b', values: ['lonely'] } },
order: [
{ field: 'spec.a', order: 'asc' },
{ field: 'metadata.name', order: 'desc' },
],
}),
).resolves.toEqual(['n2', 'n4', 'n1']);
// only n3 and n4 has spec.b, nulls (no match) always goes last no matter the order
await expect(
f({
order: [
{ field: 'spec.b', order: 'asc' },
{ field: 'metadata.name', order: 'asc' },
],
}),
).resolves.toEqual(['n3', 'n4', 'n1', 'n2']);
// only n3 and n4 has spec.b, nulls (no match) always goes last no matter the order
await expect(
f({
order: [
{ field: 'spec.b', order: 'desc' },
{ field: 'metadata.name', order: 'asc' },
],
}),
).resolves.toEqual(['n4', 'n3', 'n1', 'n2']);
},
60_000,
);
});
describe('entitiesBatch', () => {
it.each(databases.eachSupportedId())(
'queries for entities by ref, including duplicates, and gracefully returns null for missing entities',
'queries for entities by ref, including duplicates, and gracefully returns null for missing entities, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
@@ -571,12 +670,13 @@ describe('DefaultEntitiesCatalog', () => {
'k:default/two',
]);
},
60_000,
);
});
describe('removeEntityByUid', () => {
it.each(databases.eachSupportedId())(
'also clears parent hashes',
'also clears parent hashes, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
@@ -659,12 +759,13 @@ describe('DefaultEntitiesCatalog', () => {
new Set(['k:default/unrelated1', 'k:default/unrelated2']),
);
},
60_000,
);
});
describe('facets', () => {
it.each(databases.eachSupportedId())(
'can filter and collect properly',
'can filter and collect properly, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
@@ -697,10 +798,11 @@ describe('DefaultEntitiesCatalog', () => {
},
});
},
60_000,
);
it.each(databases.eachSupportedId())(
'can match on annotations and labels with dots in them',
'can match on annotations and labels with dots in them, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
@@ -743,10 +845,11 @@ describe('DefaultEntitiesCatalog', () => {
},
});
},
60_000,
);
it.each(databases.eachSupportedId())(
'can match on strings in arrays',
'can match on strings in arrays, %p',
async databaseId => {
const { knex } = await createDatabase(databaseId);
@@ -784,6 +887,7 @@ describe('DefaultEntitiesCatalog', () => {
},
});
},
60_000,
);
});
});
@@ -97,7 +97,7 @@ function addCondition(
// 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<DbSearchRow>('search')
.select(entityIdField)
.select('search.entity_id')
.where({ key: filter.key.toLowerCase() })
.andWhere(function keyFilter() {
if (filter.values) {
@@ -178,14 +178,48 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog {
let entitiesQuery =
db<DbFinalEntitiesRow>('final_entities').select('final_entities.*');
request?.order?.forEach(({ field }, index) => {
const alias = `order_${index}`;
entitiesQuery = entitiesQuery.leftOuterJoin(
{ [alias]: 'search' },
function search(inner) {
inner
.on(`${alias}.entity_id`, 'final_entities.entity_id')
.andOn(`${alias}.key`, db.raw('?', [field]));
},
);
});
entitiesQuery = entitiesQuery.whereNotNull('final_entities.final_entity');
if (request?.filter) {
entitiesQuery = parseFilter(request.filter, entitiesQuery, db);
entitiesQuery = parseFilter(
request.filter,
entitiesQuery,
db,
false,
'final_entities.entity_id',
);
}
// TODO: move final_entities to use entity_ref
entitiesQuery = entitiesQuery
.whereNotNull('final_entities.final_entity')
.orderBy('entity_id', 'asc');
request?.order?.forEach(({ order }, index) => {
if (db.client.config.client === 'pg') {
// pg correctly orders by the column value and handling nulls in one go
entitiesQuery = entitiesQuery.orderBy([
{ column: `order_${index}.value`, order, nulls: 'last' },
]);
} else {
// sqlite and mysql translate the above statement ONLY into "order by (value is null) asc"
// no matter what the order is, for some reason, so we have to manually add back the statement
// that translates to "order by value <order>" while avoiding to give an order
entitiesQuery = entitiesQuery.orderBy([
{ column: `order_${index}.value`, order: undefined, nulls: 'last' },
{ column: `order_${index}.value`, order },
]);
}
});
entitiesQuery = entitiesQuery.orderBy('final_entities.entity_id', 'asc'); // stable sort
const { limit, offset } = parsePagination(request?.pagination);
if (limit !== undefined) {
@@ -41,6 +41,7 @@ import {
parseEntityTransformParams,
} from './request';
import { parseEntityFacetParams } from './request/parseEntityFacetParams';
import { parseEntityOrderParams } from './request/parseEntityOrderParams';
import { LocationService, RefreshOptions, RefreshService } from './types';
import {
disallowReadonlyMode,
@@ -113,6 +114,7 @@ export async function createRouter(
const { entities, pageInfo } = await entitiesCatalog.entities({
filter: parseEntityFilterParams(req.query),
fields: parseEntityTransformParams(req.query),
order: parseEntityOrderParams(req.query),
pagination: parseEntityPaginationParams(req.query),
authorizationToken: getBearerToken(req.header('authorization')),
});
@@ -0,0 +1,42 @@
/*
* Copyright 2021 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 { parseEntityOrderParams } from './parseEntityOrderParams';
describe('parseEntityOrderParams', () => {
it('handles missing parameter', () => {
expect(parseEntityOrderParams({})).toBeUndefined();
});
it('handles parameters with various orders', () => {
expect(
parseEntityOrderParams({ order: ['asc:a', 'desc:b', 'asc:c:d'] }),
).toEqual([
{ field: 'a', order: 'asc' },
{ field: 'b', order: 'desc' },
{ field: 'c:d', order: 'asc' },
]);
});
it.each(['', ':', 'ascii:', 'ascii:ebcdic', ':colon'])(
'rejects missing/bad order or key, %p',
order => {
expect(() => parseEntityOrderParams({ order: [order] })).toThrow(
`Invalid order parameter "${order}", expected "<asc or desc>:<field name>"`,
);
},
);
});
@@ -0,0 +1,37 @@
/*
* Copyright 2021 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 { InputError } from '@backstage/errors';
import { EntityOrder } from '../../catalog/types';
import { parseStringsParam } from './common';
export function parseEntityOrderParams(
params: Record<string, unknown>,
): EntityOrder[] | undefined {
return parseStringsParam(params.order, 'order')?.map(item => {
const match = item.match(/^(asc|desc):(.+)$/);
if (!match) {
throw new InputError(
`Invalid order parameter "${item}", expected "<asc or desc>:<field name>"`,
);
}
return {
order: match[1] as 'asc' | 'desc',
field: match[2],
};
});
}
@@ -110,6 +110,8 @@ describe('Stitcher', () => {
});
expect(entity.metadata.etag).toEqual(entities[0].hash);
const last_updated_at = entities[0].last_updated_at;
expect(last_updated_at).not.toBeNull();
const firstHash = entities[0].hash;
const search = await db<DbSearchRow>('search');
@@ -127,7 +129,12 @@ describe('Stitcher', () => {
original_value: 'a',
value: 'a',
},
{ entity_id: 'my-id', key: 'kind', original_value: 'k', value: 'k' },
{
entity_id: 'my-id',
key: 'kind',
original_value: 'k',
value: 'k',
},
{
entity_id: 'my-id',
key: 'metadata.name',
@@ -227,7 +234,12 @@ describe('Stitcher', () => {
original_value: 'a',
value: 'a',
},
{ entity_id: 'my-id', key: 'kind', original_value: 'k', value: 'k' },
{
entity_id: 'my-id',
key: 'kind',
original_value: 'k',
value: 'k',
},
{
entity_id: 'my-id',
key: 'metadata.name',
@@ -207,11 +207,12 @@ export class Stitcher {
.update({
final_entity: JSON.stringify(entity),
hash,
last_updated_at: this.database.fn.now(),
})
.where('entity_id', entityId)
.where('stitch_ticket', ticket)
.onConflict('entity_id')
.merge(['final_entity', 'hash']);
.merge(['final_entity', 'hash', 'last_updated_at']);
if (amountOfRowsChanged === 0) {
this.logger.debug(
+9
View File
@@ -1,5 +1,14 @@
# @backstage/plugin-catalog-common
## 1.0.9
### Patch Changes
- Updated dependencies
- @backstage/plugin-permission-common@0.7.2
- @backstage/plugin-search-common@1.2.0
- @backstage/catalog-model@1.1.4
## 1.0.9-next.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-common",
"description": "Common functionalities for the catalog plugin",
"version": "1.0.9-next.3",
"version": "1.0.9",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+16
View File
@@ -1,5 +1,21 @@
# @internal/plugin-catalog-customized
## 0.0.6
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog@1.7.1
- @backstage/plugin-catalog-react@1.2.3
## 0.0.5
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog@1.7.0
- @backstage/plugin-catalog-react@1.2.2
## 0.0.5-next.4
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@internal/plugin-catalog-customized",
"description": "The internal Backstage Customizable plugin for browsing the Backstage catalog",
"version": "0.0.5-next.4",
"version": "0.0.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+23
View File
@@ -1,5 +1,28 @@
# @backstage/plugin-catalog-graph
## 0.2.25
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.2
- @backstage/plugin-catalog-react@1.2.3
## 0.2.24
### Patch Changes
- cb716004ef: Internal refactor to improve tests
- 2e701b3796: Internal refactor to use `react-router-dom` rather than `react-router`.
- 454f2e90db: Set the default `maxDepth` prop for `EntityRelationsGraph` to a smaller value to provide better readability.
- Updated dependencies
- @backstage/core-plugin-api@1.2.0
- @backstage/catalog-client@1.2.0
- @backstage/core-components@0.12.1
- @backstage/plugin-catalog-react@1.2.2
- @backstage/catalog-model@1.1.4
- @backstage/theme@0.2.16
## 0.2.24-next.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-graph",
"version": "0.2.24-next.4",
"version": "0.2.24",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/plugin-catalog-graphql
## 0.3.16
### Patch Changes
- 3280711113: Updated dependency `msw` to `^0.49.0`.
- Updated dependencies
- @backstage/types@1.0.2
- @backstage/catalog-model@1.1.4
- @backstage/config@1.0.5
## 0.3.16-next.1
### Patch Changes

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