Merge branch 'plugin/add-rename-dynatrace-plugins' of https://github.com/johannes-b/backstage into plugin/add-rename-dynatrace-plugins

This commit is contained in:
Johannes Bräuer
2024-03-27 14:46:17 +01:00
618 changed files with 5476 additions and 2015 deletions
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-catalog-backend': minor
'@backstage/plugin-catalog-node': minor
---
Added the ability to inject custom permissions from modules, on `CatalogBuilder` and `CatalogPermissionExtensionPoint`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-nomad': patch
---
Added an optional ESLint rule - no-top-level-material-ui-4-imports -in nomad plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for plugins/nomad.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-github-issues': minor
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `github-issues` plugin to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-newrelic': patch
---
Added an optional ESLint rule - no-top-level-material-ui-4-imports -in cloudbuild plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for plugins/newrelic.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-app-api': patch
---
Temporarily revert the rate limiting
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-unprocessed': patch
---
Internal update that injects custom permissions into the catalog using its extension point
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-permission-backend': patch
---
Properly forward causes of errors from upstream backends in the `PermissionIntegrationClient`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-proxy-backend': patch
---
Allow unauthenticated requests.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-tech-radar': patch
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `tech-radar` plugin to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-microsoft-calendar': patch
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `microsoft-calender` plugin to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-newrelic-dashboard': patch
---
Added an optional ESLint rule - no-top-level-material-ui-4-imports -in new relic plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for plugins/newrelic-dashboard
+5
View File
@@ -0,0 +1,5 @@
---
'@techdocs/cli': patch
---
Fix how the cli server mocks the new auth cookie endpoint.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Fixed an issue causing actions to fail when retrieving auth credentials
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-gitops-profiles': patch
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `gitops-profiles` plugin to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/catalog-client': patch
---
Added missing commas to the example of `queryEntities`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-firehydrant': patch
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `firehydrant` plugin to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-graphql-voyager': patch
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `graphql-voyager` plugin to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-jenkins-backend': patch
---
Fixed an issue where the `httpAuth` service turned out to be undefined
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-auth-backend': patch
'@backstage/plugin-auth-node': patch
---
Only consider entities of kind `User` when using `findCatalogUser` with a filter query, unless an explicit `kind` filter is provided.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-cluster': patch
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `kubernetes-cluster` plugin to migrate the Material UI imports.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/integration-aws-node': patch
'@backstage/plugin-catalog-backend-module-aws': patch
---
Updated dependency `aws-sdk-client-mock-jest` to `^4.0.0`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': patch
---
`EntitySearchBar` and `EntityTextFilter` have been updated accordingly to persist the status as query params, following the same pattern as the other server side
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-github-deployments': patch
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `github-deployments` plugin to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-cloudbuild': minor
---
Added a new column to `EntityCloudbuildContent` displaying the trigger name for each build.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-entity-validation': patch
---
Added ESLint rule `no-top-level-material-ui-4-imports` in the `entity-validation` plugin to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Updated backend plugin template to work better with new backend system
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-gocd': patch
---
Added an optional ESLint rule - no-top-level-material-ui-4-imports - which has an auto fix function to migrate the imports and used it to migrate the Material UI imports.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend-module-guest-provider': patch
---
Add installation instructions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': patch
---
`CatalogIndexPage` now uses `EntitySearchBar` for text-based filtering of entities, saving the search text in the query parameters and debouncing the server requests.
@@ -34,6 +34,7 @@ Blackbox
bool
boolean
Brex
broadcasted
bugfixes
builtins
callout
@@ -330,6 +331,7 @@ reusability
Reusability
roadmaps
rollbar
rollout
Roboto
Rollbar
Rollup
+1 -1
View File
@@ -76,7 +76,7 @@ jobs:
- name: Cache Manifests File
if: ${{ steps.event.outputs.ACTION != 'closed' }}
uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: manifests.rendered.yml
key: ${{ steps.hash.outputs.MANIFESTS_FILE_HASH }}
+1 -1
View File
@@ -51,7 +51,7 @@ jobs:
- run: yarn build-storybook
- uses: chromaui/action@306092d42c0743800aadf544ee263cbc56598b1b # v11
- uses: chromaui/action@ea1eee60c663ccb7e5d4cfd7a05fcc3a25b7c494 # v11
with:
token: ${{ secrets.GITHUB_TOKEN }}
# projectToken intentionally shared to allow collaborators to run Chromatic on forks
File diff suppressed because one or more lines are too long
-783
View File
File diff suppressed because one or more lines are too long
+875
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -10,4 +10,4 @@ plugins:
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: '@yarnpkg/plugin-workspace-tools'
yarnPath: .yarn/releases/yarn-3.2.3.cjs
yarnPath: .yarn/releases/yarn-3.8.1.cjs
+1 -1
View File
@@ -155,7 +155,7 @@ The `notification-backend` shall provide necessary parameters for paging and fil
The notification frontend plugin provides a UI for viewing notifications, which in the initial implementation can be as simple as needed. The only requirement is that a user is able to view recent notifications and distinguish between read and unread notifications. The frontend plugin also subscribes to the notifications signal channel and alerts the user when a new notification is received.
Both the individual and broadcasted messages are rendered together in a single list. There will be a filter choosing of of those types or `all`.
Both the individual and broadcasted messages are rendered together in a single list. There will be a filter choosing among those types or `all`.
### Architecture Overview
Binary file not shown.

Before

Width:  |  Height:  |  Size: 635 KiB

After

Width:  |  Height:  |  Size: 515 KiB

+1 -1
View File
@@ -12,7 +12,7 @@ code, template in some variables, and then publish the template to some
locations like GitHub or GitLab.
<video width="100%" height="100%" controls>
<source src="https://backstage.io/blog/assets/2020-08-05/feature.mp4" type="video/mp4" />
<source src="/video/software-templates.mp4" type="video/mp4" />
</video>
## Getting Started
+3 -3
View File
@@ -41,16 +41,16 @@ standalone mode. You can do a first-light test of your service:
```sh
cd plugins/carmen-backend
LEGACY_BACKEND_START=true yarn start
yarn start
```
> Note: `LEGACY_BACKEND_START=true` is needed while we transition fully to the [New Backend System](../backend-system/index.md). The templates have not been migrated yet; you can track this in [issue 21288](https://github.com/backstage/backstage/issues/21288)
> Note: this documentation assumes you are using the latest version of Backstage and the new backend system. If you are not please upgrade and migrate your backend using the [Migration Guide](../backend-system/building-backends/08-migrating.md)
This will think for a bit, and then say `Listening on :7007`. In a different
terminal window, now run
```sh
curl localhost:7007/carmen/health
curl localhost:7007/api/carmen/health
```
This should return `{"status":"ok"}`. Success! Press `Ctrl + c` to stop it
@@ -7,7 +7,7 @@ authorURL: https://twitter.com/stalund
**TL;DR** Today we are announcing a new Backstage feature: Software Templates. Simplify setup, standardize tooling, and deploy with the click of a button. Using automated templates, your engineers can spin up a new microservice, website, or other software component with your organizations best practices built-in, right from the start.
<video width="100%" height="100%" controls>
<source src="/blog/assets/2020-08-05/feature.mp4" type="video/mp4" />
<source src="/video/software-templates.mp4" type="video/mp4" />
</video>
{/* truncate */}
+10
View File
@@ -0,0 +1,10 @@
---
title: Coder
author: Coder
authorUrl: https://www.coder.com
category: Development
description: Create and manage Coder workspaces from Backstage!
documentation: https://github.com/coder/backstage-plugins/blob/main/plugins/backstage-plugin-coder/README.md
iconUrl: /img/coder.png
npmPackageName: '@coder/backstage-plugin-coder'
addedDate: '2024-03-15'
+10
View File
@@ -0,0 +1,10 @@
---
title: Dev Containers
author: Coder
authorUrl: https://www.coder.com
category: Development
description: Automatically launch fully-contained dev environments with Dev Containers, right from Backstage!
documentation: https://github.com/coder/backstage-plugins/blob/main/plugins/backstage-plugin-devcontainers-react/README.md
iconUrl: /img/devcontainers.png
npmPackageName: '@coder/backstage-plugin-devcontainers-react'
addedDate: '2024-03-15'
Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

+7 -7
View File
@@ -5903,7 +5903,7 @@ __metadata:
"fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>":
version: 2.3.2
resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=18f3a7"
resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=df0bf1"
dependencies:
node-gyp: latest
conditions: os=darwin
@@ -10263,7 +10263,7 @@ __metadata:
"resolve@patch:resolve@^1.1.6#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>":
version: 1.22.1
resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin<compat/resolve>::version=1.22.1&hash=07638b"
resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin<compat/resolve>::version=1.22.1&hash=c3c19d"
dependencies:
is-core-module: ^2.9.0
path-parse: ^1.0.7
@@ -11285,11 +11285,11 @@ __metadata:
"typescript@patch:typescript@~5.1.0#~builtin<compat/typescript>":
version: 5.1.6
resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin<compat/typescript>::version=5.1.6&hash=a1c5e5"
resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin<compat/typescript>::version=5.1.6&hash=5da071"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 21e88b0a0c0226f9cb9fd25b9626fb05b4c0f3fddac521844a13e1f30beb8f14e90bd409a9ac43c812c5946d714d6e0dee12d5d02dfc1c562c5aacfa1f49b606
checksum: f53bfe97f7c8b2b6d23cf572750d4e7d1e0c5fff1c36d859d0ec84556a827b8785077bc27676bf7e71fae538e517c3ecc0f37e7f593be913d884805d931bc8be
languageName: node
linkType: hard
@@ -11652,8 +11652,8 @@ __metadata:
linkType: hard
"webpack-dev-middleware@npm:^5.3.1":
version: 5.3.3
resolution: "webpack-dev-middleware@npm:5.3.3"
version: 5.3.4
resolution: "webpack-dev-middleware@npm:5.3.4"
dependencies:
colorette: ^2.0.10
memfs: ^3.4.3
@@ -11662,7 +11662,7 @@ __metadata:
schema-utils: ^4.0.0
peerDependencies:
webpack: ^4.0.0 || ^5.0.0
checksum: dd332cc6da61222c43d25e5a2155e23147b777ff32fdf1f1a0a8777020c072fbcef7756360ce2a13939c3f534c06b4992a4d659318c4a7fe2c0530b52a8a6621
checksum: 90cf3e27d0714c1a745454a1794f491b7076434939340605b9ee8718ba2b85385b120939754e9fdbd6569811e749dee53eec319e0d600e70e0b0baffd8e3fb13
languageName: node
linkType: hard
+5 -6
View File
@@ -1,6 +1,6 @@
{
"name": "root",
"version": "1.24.0",
"version": "1.24.2",
"private": true,
"repository": {
"type": "git",
@@ -23,8 +23,8 @@
"build:plugins-report": "node ./scripts/build-plugins-report",
"clean": "backstage-cli repo clean",
"create-plugin": "echo \"use 'yarn new' instead\"",
"dev": "concurrently 'yarn start' 'yarn start-backend'",
"dev:next": "concurrently 'yarn start:next' 'yarn start-backend:next'",
"dev": "yarn workspaces foreach -A --include example-backend --include example-app --parallel -v -i run start",
"dev:next": "yarn workspaces foreach -A --include example-backend-next --include example-app-next --parallel -v -i run start",
"docker-build": "yarn tsc && yarn workspace example-backend build && yarn workspace example-backend build-image",
"fix": "backstage-cli repo fix",
"postinstall": "husky || true",
@@ -42,7 +42,7 @@
"start": "yarn workspace example-app start",
"start-backend": "yarn workspace example-backend start",
"start-backend:next": "yarn workspace example-backend-next start",
"start:lighthouse": "concurrently 'yarn start' 'yarn start-backend:next'",
"start:lighthouse": "yarn workspaces foreach -A --include example-backend-next --include example-app --parallel -v -i run start",
"start:microsite": "cd microsite/ && yarn start",
"start:next": "yarn workspace example-app-next start",
"storybook": "yarn --cwd storybook && yarn --cwd storybook start",
@@ -110,7 +110,6 @@
"@types/node": "^18.17.8",
"@types/webpack": "^5.28.0",
"command-exists": "^1.2.9",
"concurrently": "^8.0.0",
"cross-env": "^7.0.0",
"e2e-test": "workspace:*",
"eslint": "^8.6.0",
@@ -130,7 +129,7 @@
"sort-package-json": "^2.8.0",
"typescript": "~5.1.0"
},
"packageManager": "yarn@3.2.3",
"packageManager": "yarn@3.8.1",
"engines": {
"node": "18 || 20"
}
+11
View File
@@ -1,5 +1,16 @@
# @backstage/app-defaults
## 1.5.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.14.2
- @backstage/core-app-api@1.12.2
- @backstage/core-plugin-api@1.9.1
- @backstage/theme@0.5.2
- @backstage/plugin-permission-react@0.4.21
## 1.5.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/app-defaults",
"version": "1.5.1",
"version": "1.5.2",
"description": "Provides the default wiring of a Backstage App",
"backstage": {
"role": "web-library"
@@ -1,5 +1,13 @@
# app-next-example-plugin
## 0.0.8
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.14.2
- @backstage/frontend-plugin-api@0.6.2
## 0.0.7
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "app-next-example-plugin",
"version": "0.0.7",
"version": "0.0.8",
"description": "Backstage internal example plugin",
"backstage": {
"role": "frontend-plugin"
+76
View File
@@ -1,5 +1,81 @@
# example-app-next
## 0.0.8
### Patch Changes
- Updated dependencies
- @backstage/plugin-newrelic@0.3.47
- @backstage/plugin-tech-radar@0.7.1
- @backstage/plugin-entity-feedback@0.2.15
- @backstage/plugin-pagerduty@0.7.4
- @backstage/plugin-microsoft-calendar@0.1.14
- @backstage/plugin-gcp-projects@0.3.48
- @backstage/plugin-newrelic-dashboard@0.3.7
- @backstage/plugin-catalog-unprocessed-entities@0.2.1
- @backstage/core-components@0.14.2
- @backstage/plugin-scaffolder-react@1.8.2
- @backstage/plugin-apache-airflow@0.2.22
- @backstage/plugin-catalog-import@0.10.8
- @backstage/plugin-github-actions@0.6.13
- @backstage/plugin-octopus-deploy@0.2.14
- @backstage/plugin-techdocs-react@1.2.1
- @backstage/core-app-api@1.12.2
- @backstage/plugin-catalog-graph@0.4.2
- @backstage/plugin-catalog-react@1.11.1
- @backstage/plugin-code-coverage@0.2.25
- @backstage/plugin-cost-insights@0.12.21
- @backstage/plugin-tech-insights@0.3.24
- @backstage/plugin-user-settings@0.8.3
- @backstage/plugin-azure-devops@0.4.1
- @backstage/plugin-search-react@1.7.8
- @backstage/plugin-azure-sites@0.1.21
- @backstage/plugin-cloudbuild@0.4.2
- @backstage/plugin-lighthouse@0.4.17
- @backstage/plugin-scaffolder@1.19.1
- @backstage/plugin-stackstorm@0.1.13
- @backstage/plugin-dynatrace@10.0.1
- @backstage/plugin-gcalendar@0.3.25
- @backstage/plugin-shortcuts@0.3.21
- @backstage/plugin-airbrake@0.3.32
- @backstage/plugin-devtools@0.1.11
- @backstage/plugin-graphiql@0.3.5
- @backstage/plugin-linguist@0.1.17
- @backstage/plugin-playlist@0.2.6
- @backstage/plugin-puppetdb@0.1.15
- @backstage/plugin-techdocs@1.10.2
- @backstage/plugin-catalog@1.18.1
- @backstage/plugin-explore@0.4.18
- @backstage/plugin-jenkins@0.9.7
- @backstage/plugin-rollbar@0.4.32
- @backstage/plugin-badges@0.2.56
- @backstage/plugin-search@1.4.8
- @backstage/plugin-sentry@0.5.17
- @backstage/plugin-kafka@0.3.32
- @backstage/plugin-gocd@0.1.38
- @backstage/plugin-home@0.7.1
- @backstage/plugin-adr@0.6.15
- @backstage/plugin-org@0.6.22
- @backstage/cli@0.26.1
- @backstage/app-defaults@1.5.2
- app-next-example-plugin@0.0.8
- @backstage/frontend-app-api@0.6.2
- @backstage/frontend-plugin-api@0.6.2
- @backstage/integration-react@1.1.25
- @backstage/plugin-api-docs@0.11.2
- @backstage/plugin-app-visualizer@0.1.3
- @backstage/plugin-kubernetes@0.11.7
- @backstage/plugin-techdocs-module-addons-contrib@1.1.7
- @backstage/plugin-todo@0.2.36
- @backstage/core-compat-api@0.2.2
- @backstage/core-plugin-api@1.9.1
- @backstage/catalog-model@1.4.5
- @backstage/theme@0.5.2
- @backstage/plugin-catalog-common@1.0.22
- @backstage/plugin-linguist-common@0.1.2
- @backstage/plugin-permission-react@0.4.21
- @backstage/plugin-search-common@1.2.11
## 0.0.7
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
"version": "0.0.7",
"version": "0.0.8",
"private": true,
"repository": {
"type": "git",
+79
View File
@@ -1,5 +1,84 @@
# example-app
## 0.2.94
### Patch Changes
- Updated dependencies
- @backstage/plugin-nomad@0.1.13
- @backstage/plugin-newrelic@0.3.47
- @backstage/plugin-tech-radar@0.7.1
- @backstage/plugin-entity-feedback@0.2.15
- @backstage/plugin-pagerduty@0.7.4
- @backstage/plugin-microsoft-calendar@0.1.14
- @backstage/plugin-gcp-projects@0.3.48
- @backstage/plugin-newrelic-dashboard@0.3.7
- @backstage/plugin-catalog-unprocessed-entities@0.2.1
- @backstage/plugin-kubernetes-cluster@0.0.8
- @backstage/core-components@0.14.2
- @backstage/plugin-scaffolder-react@1.8.2
- @backstage/plugin-apache-airflow@0.2.22
- @backstage/plugin-catalog-import@0.10.8
- @backstage/plugin-github-actions@0.6.13
- @backstage/plugin-octopus-deploy@0.2.14
- @backstage/plugin-stack-overflow@0.1.27
- @backstage/plugin-techdocs-react@1.2.1
- @backstage/core-app-api@1.12.2
- @backstage/plugin-catalog-graph@0.4.2
- @backstage/plugin-catalog-react@1.11.1
- @backstage/plugin-code-coverage@0.2.25
- @backstage/plugin-cost-insights@0.12.21
- @backstage/plugin-notifications@0.1.1
- @backstage/plugin-tech-insights@0.3.24
- @backstage/plugin-user-settings@0.8.3
- @backstage/plugin-azure-devops@0.4.1
- @backstage/plugin-search-react@1.7.8
- @backstage/plugin-azure-sites@0.1.21
- @backstage/plugin-cloudbuild@0.4.2
- @backstage/plugin-lighthouse@0.4.17
- @backstage/plugin-scaffolder@1.19.1
- @backstage/plugin-stackstorm@0.1.13
- @backstage/plugin-dynatrace@10.0.1
- @backstage/plugin-gcalendar@0.3.25
- @backstage/plugin-shortcuts@0.3.21
- @backstage/plugin-airbrake@0.3.32
- @backstage/plugin-devtools@0.1.11
- @backstage/plugin-graphiql@0.3.5
- @backstage/plugin-linguist@0.1.17
- @backstage/plugin-playlist@0.2.6
- @backstage/plugin-puppetdb@0.1.15
- @backstage/plugin-techdocs@1.10.2
- @backstage/plugin-catalog@1.18.1
- @backstage/plugin-explore@0.4.18
- @backstage/plugin-jenkins@0.9.7
- @backstage/plugin-rollbar@0.4.32
- @backstage/plugin-badges@0.2.56
- @backstage/plugin-search@1.4.8
- @backstage/plugin-sentry@0.5.17
- @backstage/plugin-kafka@0.3.32
- @backstage/plugin-gocd@0.1.38
- @backstage/plugin-home@0.7.1
- @backstage/plugin-adr@0.6.15
- @backstage/plugin-org@0.6.22
- @backstage/cli@0.26.1
- @backstage/app-defaults@1.5.2
- @backstage/frontend-app-api@0.6.2
- @backstage/integration-react@1.1.25
- @backstage/plugin-api-docs@0.11.2
- @backstage/plugin-github-pull-requests-board@0.1.26
- @backstage/plugin-kubernetes@0.11.7
- @backstage/plugin-signals@0.0.3
- @backstage/plugin-techdocs-module-addons-contrib@1.1.7
- @backstage/plugin-todo@0.2.36
- @backstage/core-plugin-api@1.9.1
- @backstage/catalog-model@1.4.5
- @backstage/config@1.2.0
- @backstage/theme@0.5.2
- @backstage/plugin-catalog-common@1.0.22
- @backstage/plugin-linguist-common@0.1.2
- @backstage/plugin-permission-react@0.4.21
- @backstage/plugin-search-common@1.2.11
## 0.2.93
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app",
"version": "0.2.93",
"version": "0.2.94",
"backstage": {
"role": "frontend"
},
+18
View File
@@ -1,5 +1,23 @@
# @backstage/backend-app-api
## 0.6.1
### Patch Changes
- de1f45d: Temporarily revert the rate limiting
- Updated dependencies
- @backstage/backend-common@0.21.5
- @backstage/plugin-auth-node@0.4.10
- @backstage/backend-tasks@0.5.20
- @backstage/plugin-permission-node@0.7.26
- @backstage/backend-plugin-api@0.6.15
- @backstage/cli-common@0.1.13
- @backstage/cli-node@0.2.4
- @backstage/config@1.2.0
- @backstage/config-loader@1.7.0
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
## 0.6.0
### Minor Changes
-19
View File
@@ -14,8 +14,6 @@
* limitations under the License.
*/
import { HumanDuration } from '@backstage/types';
export interface Config {
backend?: {
auth?: {
@@ -35,23 +33,6 @@ export interface Config {
*/
dangerouslyDisableDefaultAuthPolicy?: boolean;
};
/** @visibility frontend */
rateLimit?:
| false
| {
/**
* Limit each IP to max requests per window, defaults to 60 requests.
*/
max?: number;
/**
* The duration for which the rate limit is enforced, defaults to 1 minute.
*/
window?: HumanDuration;
/**
* Disable the rate limit verification.
*/
disable?: true;
};
};
/** Discovery options. */
+1 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-app-api",
"description": "Core API used by Backstage backend apps",
"version": "0.6.0",
"version": "0.6.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -64,7 +64,6 @@
"cors": "^2.8.5",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"express-rate-limit": "^7.2.0",
"fs-extra": "^11.2.0",
"helmet": "^6.0.0",
"jose": "^5.0.0",
@@ -21,21 +21,18 @@ import request from 'supertest';
import { createCredentialsBarrier } from './createCredentialsBarrier';
import { mockCredentials, mockServices } from '@backstage/backend-test-utils';
import { MiddlewareFactory } from '../../../http';
import { CacheService } from '@backstage/backend-plugin-api';
import { JsonObject } from '@backstage/types';
const errorMiddleware = MiddlewareFactory.create({
config: mockServices.rootConfig(),
logger: mockServices.rootLogger(),
}).error();
function setup(options?: { cache?: CacheService; config?: JsonObject }) {
function setup() {
const barrier = createCredentialsBarrier({
httpAuth: mockServices.httpAuth({
defaultCredentials: mockCredentials.none(),
}),
config: mockServices.rootConfig({ data: options?.config }),
cache: options?.cache ?? mockServices.cache.mock(),
config: mockServices.rootConfig(),
});
const app = express();
@@ -176,188 +173,3 @@ describe('createCredentialsBarrier', () => {
await request(app).get('/other').send().expect(200);
});
});
it('do not limit authenticated requests', async () => {
const now = Date.now();
jest.useFakeTimers({ now });
const cacheMock = mockServices.cache.mock();
const twoMinutesInMilliseconds = 2 * 60 * 1000;
const resetTime = now + twoMinutesInMilliseconds;
cacheMock.get.mockResolvedValue({ totalHits: 2, resetTime });
const max = 2;
const configMock = {
backend: {
rateLimit: {
unauthorized: {
max, // 2 requests per window
window: { minutes: 2 }, // rate limit window expiration time,
},
},
},
};
const { app, barrier } = setup({
cache: cacheMock,
config: configMock,
});
// exceed the rate limit for authenticated requests
for (let i = 0; i < max + 1; i += 1) {
await request(app)
.get('/')
.set('authorization', mockCredentials.user.header())
.send()
.expect(200);
}
barrier.addAuthPolicy({ allow: 'user-cookie', path: '/' });
for (let i = 0; i < max + 1; i += 1) {
await request(app)
.get('/')
.set('cookie', mockCredentials.limitedUser.cookie())
.send()
.expect(200);
}
jest.useRealTimers();
});
it('limit the number of unauthenticated requests', async () => {
const now = Date.now();
jest.useFakeTimers({ now });
const cacheMock = mockServices.cache.mock();
const twoMinutesInMilliseconds = 2 * 60 * 1000;
const resetTime = now + twoMinutesInMilliseconds;
cacheMock.get
.mockResolvedValueOnce(undefined) // Request 1
.mockResolvedValueOnce({ totalHits: 1, resetTime }) // Request 2
.mockResolvedValueOnce({ totalHits: 2, resetTime }) // Request 3
.mockResolvedValueOnce(undefined); // Request 4
const configMock = {
backend: {
rateLimit: {
unauthorized: {
max: 2, // 2 requests per window
window: { minutes: 2 }, // rate limit window expiration time,
},
},
},
};
const { app, barrier } = setup({
cache: cacheMock,
config: configMock,
});
barrier.addAuthPolicy({ allow: 'unauthenticated', path: '/public' });
const randomIp = '48.105.15.17';
// Enable trust proxy to get the real IP from the X-Forwarded-For header
app.enable('trust proxy');
await request(app)
.get('/public')
.set('X-Forwarded-For', randomIp)
.send()
.expect(200);
await request(app)
.get('/public')
.set('X-Forwarded-For', randomIp)
.send()
.expect(200);
await request(app)
.get('/public')
.set('X-Forwarded-For', randomIp)
.send()
.expect(429);
await request(app)
.get('/public')
.set('X-Forwarded-For', randomIp)
.send()
.expect(200);
expect(cacheMock.get).toHaveBeenCalledTimes(4);
expect(cacheMock.set).toHaveBeenNthCalledWith(
1,
`unauthorized_rate_limit_${randomIp}`, // unauthorized_rate_limit_ is the default prefix for the rate limit store
{ resetTime, totalHits: 1 },
{ ttl: twoMinutesInMilliseconds },
);
expect(cacheMock.set).toHaveBeenNthCalledWith(
2,
`unauthorized_rate_limit_${randomIp}`,
{ resetTime, totalHits: 2 },
{ ttl: twoMinutesInMilliseconds },
);
expect(cacheMock.set).toHaveBeenNthCalledWith(
3,
`unauthorized_rate_limit_${randomIp}`,
{ resetTime, totalHits: 3 },
{ ttl: twoMinutesInMilliseconds },
);
expect(cacheMock.set).toHaveBeenNthCalledWith(
4,
`unauthorized_rate_limit_${randomIp}`,
{ resetTime, totalHits: 1 },
{ ttl: twoMinutesInMilliseconds },
);
jest.useRealTimers();
});
it('skip limiting requests when the rate limit is disabled', async () => {
const now = Date.now();
jest.useFakeTimers({ now });
const max = 2;
const cacheMock = mockServices.cache.mock();
const twoMinutesInMilliseconds = 2 * 60 * 1000;
const resetTime = now + twoMinutesInMilliseconds;
// Simulate that the totalHits exceeds the configured max value
cacheMock.get.mockResolvedValue({ totalHits: max + 1, resetTime });
const { app: app1, barrier: barrier1 } = setup({
cache: cacheMock,
config: {
backend: {
rateLimit: {
unauthorized: {
max,
window: { minutes: 2 },
disabled: true,
},
},
},
},
});
barrier1.addAuthPolicy({ allow: 'unauthenticated', path: '/public' });
for (let i = 0; i < max + 1; i += 1) {
await request(app1)
.get('/public')
.set('authorization', mockCredentials.user.header())
.send()
.expect(200);
}
// Simulate that the totalHits exceeds the default max value
cacheMock.get.mockResolvedValue({ totalHits: 61, resetTime });
const { app: app2, barrier: barrier2 } = setup({
cache: cacheMock,
config: {
backend: {
rateLimit: {
unauthorized: false,
},
},
},
});
barrier2.addAuthPolicy({ allow: 'unauthenticated', path: '/public' });
await request(app2).get('/public').send().expect(200);
jest.useRealTimers();
});
@@ -15,17 +15,12 @@
*/
import {
CacheService,
HttpAuthService,
HttpRouterServiceAuthPolicy,
RootConfigService,
} from '@backstage/backend-plugin-api';
import { durationToMilliseconds } from '@backstage/types';
import { RequestHandler } from 'express';
import { pathToRegexp } from 'path-to-regexp';
import { rateLimit } from 'express-rate-limit';
import { readDurationFromConfig } from '@backstage/config';
import { RateLimitStore } from './rateLimitStore';
export function createPathPolicyPredicate(policyPath: string) {
if (policyPath === '/' || policyPath === '*') {
@@ -44,12 +39,11 @@ export function createPathPolicyPredicate(policyPath: string) {
export function createCredentialsBarrier(options: {
httpAuth: HttpAuthService;
config: RootConfigService;
cache: CacheService;
}): {
middleware: RequestHandler;
addAuthPolicy: (policy: HttpRouterServiceAuthPolicy) => void;
} {
const { httpAuth, config, cache } = options;
const { httpAuth, config } = options;
const disableDefaultAuthPolicy = config.getOptionalBoolean(
'backend.auth.dangerouslyDisableDefaultAuthPolicy',
@@ -65,49 +59,13 @@ export function createCredentialsBarrier(options: {
const unauthenticatedPredicates = new Array<(path: string) => boolean>();
const cookiePredicates = new Array<(path: string) => boolean>();
const rateLimitConfig = config.getOptional('backend.rateLimit.unauthorized');
const disabled =
rateLimitConfig === false ||
(typeof rateLimitConfig === 'object' &&
config?.getOptionalBoolean('backend.rateLimit.unauthorized.disabled') ===
true);
const duration =
typeof rateLimitConfig === 'object' &&
config?.has('backend.rateLimit.unauthorized.window')
? readDurationFromConfig(
config.getConfig('backend.rateLimit.unauthorized.window'),
)
: undefined;
const windowMs = duration ? durationToMilliseconds(duration) : 1 * 60 * 1000;
const max =
typeof rateLimitConfig === 'object' &&
config?.has('backend.rateLimit.unauthorized.max')
? config.getNumber('backend.rateLimit.unauthorized.max')
: 60;
// Default rate limit is 60 requests per 1 minute
const limiter = rateLimit({
windowMs,
limit: max,
standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
legacyHeaders: false, // Disable the `X-RateLimit-*` headers,
store: RateLimitStore.fromOptions({ cache }),
skip() {
return disabled;
},
});
const middleware: RequestHandler = (req, res, next) => {
const middleware: RequestHandler = (req, _, next) => {
const allowsUnauthenticated = unauthenticatedPredicates.some(predicate =>
predicate(req.path),
);
if (allowsUnauthenticated) {
limiter(req, res, next);
next();
return;
}
@@ -39,32 +39,20 @@ export const httpRouterServiceFactory = createServiceFactory(
(options?: HttpRouterFactoryOptions) => ({
service: coreServices.httpRouter,
deps: {
cache: coreServices.cache,
plugin: coreServices.pluginMetadata,
config: coreServices.rootConfig,
lifecycle: coreServices.lifecycle,
rootHttpRouter: coreServices.rootHttpRouter,
httpAuth: coreServices.httpAuth,
},
async factory({
httpAuth,
config,
cache,
plugin,
rootHttpRouter,
lifecycle,
}) {
async factory({ httpAuth, config, plugin, rootHttpRouter, lifecycle }) {
const getPath = options?.getPath ?? (id => `/api/${id}`);
const path = getPath(plugin.getId());
const router = PromiseRouter();
rootHttpRouter.use(path, router);
const credentialsBarrier = createCredentialsBarrier({
httpAuth,
config,
cache,
});
const credentialsBarrier = createCredentialsBarrier({ httpAuth, config });
router.use(createLifecycleMiddleware({ lifecycle }));
router.use(credentialsBarrier.middleware);
@@ -1,187 +0,0 @@
/*
* Copyright 2024 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 { ServiceMock, mockServices } from '@backstage/backend-test-utils';
import { RateLimitStore } from './rateLimitStore';
import { CacheService } from '@backstage/backend-plugin-api';
describe('RateLimitStore', () => {
let cacheServiceMock: ServiceMock<CacheService>;
let rateLimitStore: RateLimitStore;
beforeEach(() => {
jest.useFakeTimers({ now: Date.parse('2024-03-15T08:39:11.869Z') });
jest.clearAllMocks();
cacheServiceMock = mockServices.cache.mock();
rateLimitStore = RateLimitStore.fromOptions({
prefix: 'rl_',
cache: cacheServiceMock,
});
});
afterEach(() => {
jest.useRealTimers();
});
it('should initialize with default options', () => {
expect(rateLimitStore.windowMs).toBe(1 * 60 * 1000);
});
it('should initialize with custom options', () => {
rateLimitStore.init({ windowMs: 10 * 60 * 1000 });
expect(rateLimitStore.windowMs).toBe(10 * 60 * 1000);
});
it('should get rate limit info for existing key', async () => {
const key = 'existingKey';
const existingValue = {
totalHits: 5,
resetTime: new Date(),
};
cacheServiceMock.get.mockResolvedValue({
totalHits: existingValue.totalHits,
resetTime: existingValue.resetTime.getTime(),
});
const returnedValue = await rateLimitStore.get(key);
expect(returnedValue).toEqual(existingValue);
expect(cacheServiceMock.get).toHaveBeenCalledWith(
rateLimitStore.prefixKey(key),
);
});
it('should get default rate limit info for non-existing key', async () => {
const key = 'nonExistingKey';
const defaultValue = {
totalHits: 0,
resetTime: new Date(Date.now() + rateLimitStore.windowMs),
};
cacheServiceMock.get.mockResolvedValue(undefined);
const returnedValue = await rateLimitStore.get(key);
expect(returnedValue).toEqual(defaultValue);
expect(cacheServiceMock.get).toHaveBeenCalledWith(
rateLimitStore.prefixKey(key),
);
});
it('should increment rate limit for existing key', async () => {
const key = 'exisitingKey';
const existingValue = {
totalHits: 5,
resetTime: new Date(),
};
cacheServiceMock.get.mockResolvedValue({
totalHits: existingValue.totalHits,
resetTime: existingValue.resetTime.getTime(),
});
const incrementedValue = await rateLimitStore.increment(key);
expect(incrementedValue.totalHits).toBe(existingValue.totalHits + 1);
expect(incrementedValue.resetTime).toEqual(existingValue.resetTime);
expect(cacheServiceMock.set).toHaveBeenCalledWith(
rateLimitStore.prefixKey(key),
{
totalHits: existingValue.totalHits + 1,
resetTime: existingValue.resetTime.getTime(),
},
{ ttl: rateLimitStore.windowMs },
);
});
it('should increment rate limit for non-existing key', async () => {
const key = 'nonExistingKey';
cacheServiceMock.get.mockResolvedValue(undefined);
const incrementedValue = await rateLimitStore.increment(key);
expect(incrementedValue.totalHits).toBe(1);
expect(incrementedValue.resetTime).toBeInstanceOf(Date);
expect(cacheServiceMock.set).toHaveBeenCalledWith(
rateLimitStore.prefixKey(key),
{
totalHits: incrementedValue.totalHits,
resetTime: incrementedValue.resetTime?.getTime(),
},
{ ttl: rateLimitStore.windowMs },
);
});
it('should decrement rate limit for existing key', async () => {
const key = 'exisitingKey';
const existingValue = {
totalHits: 5,
resetTime: new Date(),
};
cacheServiceMock.get.mockResolvedValue({
totalHits: existingValue.totalHits,
resetTime: existingValue.resetTime.getTime(),
});
await rateLimitStore.decrement(key);
expect(cacheServiceMock.set).toHaveBeenCalledWith(
rateLimitStore.prefixKey(key),
{
totalHits: existingValue.totalHits - 1,
resetTime: existingValue.resetTime.getTime(),
},
{ ttl: rateLimitStore.windowMs },
);
});
it('should not decrement rate limit below zero', async () => {
const key = 'testKey';
const existingValue = {
totalHits: 0,
resetTime: new Date(),
};
cacheServiceMock.get.mockResolvedValue({
totalHits: existingValue.totalHits,
resetTime: existingValue.resetTime.getTime(),
});
await rateLimitStore.decrement(key);
expect(cacheServiceMock.set).toHaveBeenCalledWith(
rateLimitStore.prefixKey(key),
{
totalHits: 0,
resetTime: existingValue.resetTime.getTime(),
},
{ ttl: rateLimitStore.windowMs },
);
});
it('should reset rate limit for existing key', async () => {
const key = 'exitingKey';
await rateLimitStore.resetKey(key);
expect(cacheServiceMock.delete).toHaveBeenCalledWith(
rateLimitStore.prefixKey(key),
);
});
});
@@ -1,119 +0,0 @@
/*
* Copyright 2024 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 { CacheService } from '@backstage/backend-plugin-api';
import type {
Store,
Options,
IncrementResponse,
ClientRateLimitInfo,
} from 'express-rate-limit';
type CacheStoreOptions = {
/**
* Optional field to differentiate hit countswhen multiple rate-limits are in use
*/
prefix?: string;
/**
* The cache service to use for storing the hit counts.
*/
cache: CacheService;
};
type CacheStoreValue = {
totalHits: number;
resetTime: number;
};
/**
* A `Store` that stores the hit count for each client.
*/
export class RateLimitStore implements Store {
/**
* The duration of time before which all hit counts are reset (in milliseconds).
* default: 60 requests per minute
*/
windowMs: number = 1 * 60 * 1000;
prefix: string;
#cache: CacheService;
private constructor(options: CacheStoreOptions) {
this.prefix = options.prefix ?? 'unauthorized_rate_limit_';
this.#cache = options.cache;
}
static fromOptions(options: CacheStoreOptions): RateLimitStore {
return new RateLimitStore(options);
}
#getDefaultValue() {
return { totalHits: 0, resetTime: Date.now() + this.windowMs };
}
init(options: Partial<Options>): void {
if (options.windowMs) {
this.windowMs = options.windowMs;
}
}
prefixKey(key: string): string {
return `${this.prefix}${key}`;
}
async get(key: string): Promise<ClientRateLimitInfo | undefined> {
const value =
(await this.#cache.get<CacheStoreValue>(this.prefixKey(key))) ??
this.#getDefaultValue();
return {
totalHits: value.totalHits,
resetTime: new Date(value.resetTime),
};
}
async increment(key: string): Promise<IncrementResponse> {
const value =
(await this.#cache.get<CacheStoreValue>(this.prefixKey(key))) ??
this.#getDefaultValue();
const totalHits = value.totalHits + 1;
const resetTime = value.resetTime;
await this.#cache.set(
this.prefixKey(key),
{ totalHits, resetTime },
{ ttl: this.windowMs },
);
return {
totalHits,
resetTime: new Date(resetTime),
};
}
async decrement(key: string): Promise<void> {
const value =
(await this.#cache.get<CacheStoreValue>(this.prefixKey(key))) ??
this.#getDefaultValue();
const totalHits = value.totalHits > 0 ? value.totalHits - 1 : 0;
const resetTime = value.resetTime;
await this.#cache.set(
this.prefixKey(key),
{ totalHits, resetTime },
{ ttl: this.windowMs },
);
}
async resetKey(key: string): Promise<void> {
await this.#cache.delete(this.prefixKey(key));
}
}
+18
View File
@@ -1,5 +1,23 @@
# @backstage/backend-common
## 0.21.5
### Patch Changes
- 81a995f: Updated dependency `aws-sdk-client-mock` to `^4.0.0`.
- Updated dependencies
- @backstage/backend-app-api@0.6.1
- @backstage/integration-aws-node@0.1.11
- @backstage/plugin-auth-node@0.4.10
- @backstage/backend-dev-utils@0.1.4
- @backstage/backend-plugin-api@0.6.15
- @backstage/cli-common@0.1.13
- @backstage/config@1.2.0
- @backstage/config-loader@1.7.0
- @backstage/errors@1.2.4
- @backstage/integration@1.9.1
- @backstage/types@1.1.1
## 0.21.4
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.21.4",
"version": "0.21.5",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+8
View File
@@ -1,5 +1,13 @@
# @backstage/backend-defaults
## 0.2.15
### Patch Changes
- Updated dependencies
- @backstage/backend-app-api@0.6.1
- @backstage/backend-common@0.21.5
## 0.2.14
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-defaults",
"description": "Backend defaults used by Backstage backend apps",
"version": "0.2.14",
"version": "0.2.15",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -1,5 +1,38 @@
# @backstage/backend-dynamic-feature-service
## 0.2.6
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.20.0
- @backstage/backend-app-api@0.6.1
- @backstage/backend-common@0.21.5
- @backstage/plugin-auth-node@0.4.10
- @backstage/backend-tasks@0.5.20
- @backstage/plugin-events-backend@0.3.1
- @backstage/plugin-events-node@0.3.1
- @backstage/plugin-permission-node@0.7.26
- @backstage/plugin-scaffolder-node@0.4.1
- @backstage/plugin-search-backend-node@1.2.19
- @backstage/backend-plugin-api@0.6.15
- @backstage/cli-common@0.1.13
- @backstage/cli-node@0.2.4
- @backstage/config@1.2.0
- @backstage/config-loader@1.7.0
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
- @backstage/plugin-app-node@0.1.15
- @backstage/plugin-permission-common@0.7.13
- @backstage/plugin-search-common@1.2.11
## 0.2.5
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.19.0
## 0.2.4
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-dynamic-feature-service",
"description": "Backstage dynamic feature service",
"version": "0.2.4",
"version": "0.2.6",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+72
View File
@@ -1,5 +1,77 @@
# example-backend-next
## 0.0.23
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.20.0
- @backstage/plugin-kubernetes-backend@0.16.2
- @backstage/plugin-catalog-backend-module-unprocessed@0.4.2
- @backstage/plugin-permission-backend@0.5.39
- @backstage/plugin-catalog-backend-module-openapi@0.1.33
- @backstage/plugin-auth-backend@0.22.2
- @backstage/plugin-azure-devops-backend@0.6.2
- @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.9
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.13
- @backstage/plugin-jenkins-backend@0.4.2
- @backstage/plugin-lighthouse-backend@0.4.8
- @backstage/plugin-linguist-backend@0.5.13
- @backstage/plugin-scaffolder-backend@1.22.2
- @backstage/plugin-search-backend-module-catalog@0.1.20
- @backstage/plugin-search-backend-module-techdocs@0.1.20
- @backstage/plugin-todo-backend@0.3.14
- @backstage/backend-defaults@0.2.15
- @backstage/plugin-app-backend@0.3.63
- @backstage/plugin-adr-backend@0.4.12
- @backstage/plugin-auth-node@0.4.10
- @backstage/plugin-badges-backend@0.3.12
- @backstage/plugin-entity-feedback-backend@0.2.12
- @backstage/plugin-notifications-backend@0.1.1
- @backstage/plugin-playlist-backend@0.3.19
- @backstage/plugin-techdocs-backend@1.10.2
- @backstage/backend-tasks@0.5.20
- @backstage/plugin-auth-backend-module-guest-provider@0.1.1
- @backstage/plugin-devtools-backend@0.3.1
- @backstage/plugin-nomad-backend@0.1.17
- @backstage/plugin-permission-node@0.7.26
- @backstage/plugin-proxy-backend@0.4.13
- @backstage/plugin-scaffolder-backend-module-github@0.2.5
- @backstage/plugin-search-backend@1.5.5
- @backstage/plugin-search-backend-module-explore@0.1.19
- @backstage/plugin-search-backend-node@1.2.19
- @backstage/plugin-signals-backend@0.1.1
- @backstage/plugin-sonarqube-backend@0.2.17
- @backstage/backend-plugin-api@0.6.15
- @backstage/catalog-model@1.4.5
- @backstage/plugin-auth-backend-module-github-provider@0.1.12
- @backstage/plugin-permission-backend-module-allow-all-policy@0.1.12
- @backstage/plugin-permission-common@0.7.13
## 0.0.22
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.19.0
- @backstage/plugin-catalog-backend-module-unprocessed@0.4.1
- @backstage/plugin-permission-backend@0.5.38
- @backstage/plugin-catalog-backend-module-openapi@0.1.32
- @backstage/plugin-auth-backend@0.22.1
- @backstage/plugin-azure-devops-backend@0.6.1
- @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.8
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.12
- @backstage/plugin-jenkins-backend@0.4.1
- @backstage/plugin-kubernetes-backend@0.16.1
- @backstage/plugin-lighthouse-backend@0.4.7
- @backstage/plugin-linguist-backend@0.5.12
- @backstage/plugin-scaffolder-backend@1.22.1
- @backstage/plugin-search-backend-module-catalog@0.1.19
- @backstage/plugin-search-backend-module-techdocs@0.1.19
- @backstage/plugin-todo-backend@0.3.13
- @backstage/plugin-auth-backend-module-github-provider@0.1.11
- @backstage/plugin-techdocs-backend@1.10.1
## 0.0.21
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend-next",
"version": "0.0.21",
"version": "0.0.23",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,13 @@
# @backstage/backend-openapi-utils
## 0.1.8
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@0.6.15
- @backstage/errors@1.2.4
## 0.1.7
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-openapi-utils",
"description": "OpenAPI typescript support.",
"version": "0.1.7",
"version": "0.1.8",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/backend-plugin-api
## 0.6.15
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.4.10
- @backstage/backend-tasks@0.5.20
- @backstage/config@1.2.0
- @backstage/types@1.1.1
- @backstage/plugin-permission-common@0.7.13
## 0.6.14
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-plugin-api",
"description": "Core API used by Backstage backend plugins",
"version": "0.6.14",
"version": "0.6.15",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+10
View File
@@ -1,5 +1,15 @@
# @backstage/backend-tasks
## 0.5.20
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.21.5
- @backstage/config@1.2.0
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
## 0.5.19
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
"version": "0.5.19",
"version": "0.5.20",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+13
View File
@@ -1,5 +1,18 @@
# @backstage/backend-test-utils
## 0.3.5
### Patch Changes
- Updated dependencies
- @backstage/backend-app-api@0.6.1
- @backstage/backend-common@0.21.5
- @backstage/plugin-auth-node@0.4.10
- @backstage/backend-plugin-api@0.6.15
- @backstage/config@1.2.0
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
## 0.3.4
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
"version": "0.3.4",
"version": "0.3.5",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
+82
View File
@@ -1,5 +1,87 @@
# example-backend
## 0.2.95
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.20.0
- @backstage/plugin-catalog-node@1.10.0
- @backstage/plugin-kubernetes-backend@0.16.2
- @backstage/plugin-catalog-backend-module-unprocessed@0.4.2
- @backstage/plugin-permission-backend@0.5.39
- @backstage/catalog-client@1.6.2
- @backstage/backend-common@0.21.5
- @backstage/plugin-auth-backend@0.22.2
- @backstage/plugin-azure-devops-backend@0.6.2
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.13
- @backstage/plugin-jenkins-backend@0.4.2
- @backstage/plugin-lighthouse-backend@0.4.8
- @backstage/plugin-linguist-backend@0.5.13
- @backstage/plugin-scaffolder-backend@1.22.2
- @backstage/plugin-search-backend-module-catalog@0.1.20
- @backstage/plugin-search-backend-module-techdocs@0.1.20
- @backstage/plugin-todo-backend@0.3.14
- example-app@0.2.94
- @backstage/plugin-app-backend@0.3.63
- @backstage/plugin-adr-backend@0.4.12
- @backstage/plugin-auth-node@0.4.10
- @backstage/plugin-badges-backend@0.3.12
- @backstage/plugin-code-coverage-backend@0.2.29
- @backstage/plugin-entity-feedback-backend@0.2.12
- @backstage/plugin-playlist-backend@0.3.19
- @backstage/plugin-tech-insights-backend@0.5.29
- @backstage/plugin-techdocs-backend@1.10.2
- @backstage/plugin-scaffolder-backend-module-gitlab@0.3.1
- @backstage/backend-tasks@0.5.20
- @backstage/plugin-devtools-backend@0.3.1
- @backstage/plugin-events-backend@0.3.1
- @backstage/plugin-events-node@0.3.1
- @backstage/plugin-explore-backend@0.0.25
- @backstage/plugin-kafka-backend@0.3.13
- @backstage/plugin-nomad-backend@0.1.17
- @backstage/plugin-permission-node@0.7.26
- @backstage/plugin-proxy-backend@0.4.13
- @backstage/plugin-rollbar-backend@0.1.60
- @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.16
- @backstage/plugin-scaffolder-backend-module-rails@0.4.32
- @backstage/plugin-search-backend@1.5.5
- @backstage/plugin-search-backend-module-elasticsearch@1.3.18
- @backstage/plugin-search-backend-module-explore@0.1.19
- @backstage/plugin-search-backend-module-pg@0.5.24
- @backstage/plugin-search-backend-node@1.2.19
- @backstage/plugin-signals-backend@0.1.1
- @backstage/plugin-signals-node@0.1.1
- @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.47
- @backstage/plugin-tech-insights-node@0.5.1
- @backstage/catalog-model@1.4.5
- @backstage/config@1.2.0
- @backstage/integration@1.9.1
- @backstage/plugin-azure-sites-common@0.1.3
- @backstage/plugin-permission-common@0.7.13
## 0.2.94
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.19.0
- @backstage/plugin-catalog-node@1.9.0
- @backstage/plugin-catalog-backend-module-unprocessed@0.4.1
- @backstage/plugin-permission-backend@0.5.38
- @backstage/plugin-auth-backend@0.22.1
- @backstage/plugin-azure-devops-backend@0.6.1
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.12
- @backstage/plugin-jenkins-backend@0.4.1
- @backstage/plugin-kubernetes-backend@0.16.1
- @backstage/plugin-lighthouse-backend@0.4.7
- @backstage/plugin-linguist-backend@0.5.12
- @backstage/plugin-scaffolder-backend@1.22.1
- @backstage/plugin-search-backend-module-catalog@0.1.19
- @backstage/plugin-search-backend-module-techdocs@0.1.19
- @backstage/plugin-todo-backend@0.3.13
- @backstage/plugin-techdocs-backend@1.10.1
## 0.2.93
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.2.93",
"version": "0.2.95",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/catalog-client
## 1.6.2
### Patch Changes
- 7e8a7c8: Added missing commas to the example of `queryEntities`
- Updated dependencies
- @backstage/catalog-model@1.4.5
- @backstage/errors@1.2.4
## 1.6.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-client",
"version": "1.6.1",
"version": "1.6.2",
"description": "An isomorphic client for the catalog backend",
"backstage": {
"role": "common-library"
+2 -2
View File
@@ -498,8 +498,8 @@ export interface CatalogApi {
* limit: 20,
* fullTextFilter: {
* term: 'A',
* }
* orderFields: { field: 'metadata.name' order: 'asc' },
* },
* orderFields: { field: 'metadata.name', order: 'asc' },
* });
* ```
*
+22
View File
@@ -1,5 +1,27 @@
# @backstage/cli
## 0.26.1
### Patch Changes
- eeb226a: Updated dependency `rollup` to `^4.0.0`.
- cc371d6: Ignore transforming only on `react-use/lib`, not whole `react-use` in jest.
** POTENTIAL BREAKAGE **
If your tests fail, please change to use path import from `react-use/esm/`. It is also recommended to migrate from `react-user/lib` imports to `react-use/esm`
- Updated dependencies
- @backstage/catalog-model@1.4.5
- @backstage/cli-common@0.1.13
- @backstage/cli-node@0.2.4
- @backstage/config@1.2.0
- @backstage/config-loader@1.7.0
- @backstage/errors@1.2.4
- @backstage/eslint-plugin@0.1.6
- @backstage/integration@1.9.1
- @backstage/release-manifests@0.0.11
- @backstage/types@1.1.1
## 0.26.0
### Minor Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
"version": "0.26.0",
"version": "0.26.1",
"publishConfig": {
"access": "public"
},
@@ -7,7 +7,7 @@ _This plugin was created through the Backstage CLI_
## Getting started
Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn
start` in the root directory, and then navigating to [/{{id}}](http://localhost:3000/{{id}}).
start` in the root directory, and then navigating to [/{{pluginVar}}/health](http://localhost:7007/api/{{pluginVar}}/health).
You can also serve the plugin in isolation by running `yarn start` in the plugin directory.
This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads.
@@ -26,6 +26,10 @@ export const {{pluginVar}} = createBackendPlugin({
logger,
}),
);
httpRouter.addAuthPolicy({
path: '/health',
allow: 'unauthenticated',
});
},
});
},
+11
View File
@@ -1,5 +1,16 @@
# @backstage/core-app-api
## 1.12.2
### Patch Changes
- e8f026a: Use ESM exports of react-use library
- Updated dependencies
- @backstage/core-plugin-api@1.9.1
- @backstage/config@1.2.0
- @backstage/types@1.1.1
- @backstage/version-bridge@1.0.7
## 1.12.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-app-api",
"description": "Core app API used by Backstage apps",
"version": "1.12.1",
"version": "1.12.2",
"publishConfig": {
"access": "public"
},
+10
View File
@@ -1,5 +1,15 @@
# @backstage/core-compat-api
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/core-app-api@1.12.2
- @backstage/frontend-plugin-api@0.6.2
- @backstage/core-plugin-api@1.9.1
- @backstage/version-bridge@1.0.7
## 0.2.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-compat-api",
"version": "0.2.1",
"version": "0.2.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+12
View File
@@ -1,5 +1,17 @@
# @backstage/core-components
## 0.14.2
### Patch Changes
- e8f026a: Use ESM exports of react-use library
- Updated dependencies
- @backstage/core-plugin-api@1.9.1
- @backstage/config@1.2.0
- @backstage/errors@1.2.4
- @backstage/theme@0.5.2
- @backstage/version-bridge@1.0.7
## 0.14.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-components",
"description": "Core components used by Backstage plugins and apps",
"version": "0.14.1",
"version": "0.14.2",
"publishConfig": {
"access": "public"
},
+15
View File
@@ -1,5 +1,20 @@
# @backstage/dev-utils
## 1.0.29
### Patch Changes
- e8f026a: Use ESM exports of react-use library
- Updated dependencies
- @backstage/core-components@0.14.2
- @backstage/core-app-api@1.12.2
- @backstage/plugin-catalog-react@1.11.1
- @backstage/app-defaults@1.5.2
- @backstage/integration-react@1.1.25
- @backstage/core-plugin-api@1.9.1
- @backstage/catalog-model@1.4.5
- @backstage/theme@0.5.2
## 1.0.28
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/dev-utils",
"version": "1.0.28",
"version": "1.0.29",
"description": "Utilities for developing Backstage plugins.",
"backstage": {
"role": "web-library"
+15
View File
@@ -1,5 +1,20 @@
# @backstage/frontend-app-api
## 0.6.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.14.2
- @backstage/core-app-api@1.12.2
- @backstage/frontend-plugin-api@0.6.2
- @backstage/core-plugin-api@1.9.1
- @backstage/config@1.2.0
- @backstage/errors@1.2.4
- @backstage/theme@0.5.2
- @backstage/types@1.1.1
- @backstage/version-bridge@1.0.7
## 0.6.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-app-api",
"version": "0.6.1",
"version": "0.6.2",
"backstage": {
"role": "web-library"
},
+10
View File
@@ -1,5 +1,15 @@
# @backstage/frontend-plugin-api
## 0.6.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.14.2
- @backstage/core-plugin-api@1.9.1
- @backstage/types@1.1.1
- @backstage/version-bridge@1.0.7
## 0.6.1
### Patch Changes

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