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:
@@ -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`
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-app-api': patch
|
||||
---
|
||||
|
||||
Temporarily revert the rate limiting
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend-module-unprocessed': patch
|
||||
---
|
||||
|
||||
Internal update that injects custom permissions into the catalog using its extension point
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-permission-backend': patch
|
||||
---
|
||||
|
||||
Properly forward causes of errors from upstream backends in the `PermissionIntegrationClient`
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-proxy-backend': patch
|
||||
---
|
||||
|
||||
Allow unauthenticated requests.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@techdocs/cli': patch
|
||||
---
|
||||
|
||||
Fix how the cli server mocks the new auth cookie endpoint.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend': patch
|
||||
---
|
||||
|
||||
Fixed an issue causing actions to fail when retrieving auth credentials
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/catalog-client': patch
|
||||
---
|
||||
|
||||
Added missing commas to the example of `queryEntities`
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-jenkins-backend': patch
|
||||
---
|
||||
|
||||
Fixed an issue where the `httpAuth` service turned out to be undefined
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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`.
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-cloudbuild': minor
|
||||
---
|
||||
|
||||
Added a new column to `EntityCloudbuildContent` displaying the trigger name for each build.
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/cli': patch
|
||||
---
|
||||
|
||||
Updated backend plugin template to work better with new backend system
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-auth-backend-module-guest-provider': patch
|
||||
---
|
||||
|
||||
Add installation instructions
|
||||
@@ -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
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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
|
||||
|
||||
+2
-2
File diff suppressed because one or more lines are too long
Vendored
-783
File diff suppressed because one or more lines are too long
+875
File diff suppressed because one or more lines are too long
+1
-1
@@ -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
|
||||
|
||||
@@ -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 |
@@ -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
|
||||
|
||||
@@ -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 organization’s 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 */}
|
||||
|
||||
@@ -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'
|
||||
@@ -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
@@ -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
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "example-app-next",
|
||||
"version": "0.0.7",
|
||||
"version": "0.0.8",
|
||||
"private": true,
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "example-app",
|
||||
"version": "0.2.93",
|
||||
"version": "0.2.94",
|
||||
"backstage": {
|
||||
"role": "frontend"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
Vendored
-19
@@ -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,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",
|
||||
|
||||
+2
-190
@@ -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();
|
||||
});
|
||||
|
||||
+3
-45
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+2
-14
@@ -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);
|
||||
|
||||
-187
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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,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": {
|
||||
|
||||
@@ -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,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": {
|
||||
|
||||
@@ -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,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,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",
|
||||
|
||||
@@ -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,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": {
|
||||
|
||||
@@ -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,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": {
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -498,8 +498,8 @@ export interface CatalogApi {
|
||||
* limit: 20,
|
||||
* fullTextFilter: {
|
||||
* term: 'A',
|
||||
* }
|
||||
* orderFields: { field: 'metadata.name' order: 'asc' },
|
||||
* },
|
||||
* orderFields: { field: 'metadata.name', order: 'asc' },
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
|
||||
@@ -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,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',
|
||||
});
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
@@ -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,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"
|
||||
},
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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"
|
||||
},
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "@backstage/frontend-app-api",
|
||||
"version": "0.6.1",
|
||||
"version": "0.6.2",
|
||||
"backstage": {
|
||||
"role": "web-library"
|
||||
},
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user