Compare commits

...

22 Commits

Author SHA1 Message Date
Backstage Service Account 6a65a4cea3
Version Packages (#5041)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-25 08:27:10 -05:00
Backstage Service Account c2261cf6ab
Version Packages (#5042)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-25 08:26:56 -05:00
Backstage Service Account 727c25df51
Version Packages (#5047)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-25 08:26:41 -05:00
Andre Wanlin ff785e582c
Skip version bump when release version matches workspace version (#5043)
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2025-08-25 08:15:41 -05:00
Backstage Service Account dcffece576
sonarqube - version:bump to v1.42.3 (#5032)
* v1.42.3 version bump

* sonarqube: align to latest nfs specs

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

---------

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Vincenzo Scamporlino <vincenzos@spotify.com>
2025-08-25 15:14:38 +02:00
Andre Wanlin ceeadd1e1a
cost-insights - New Frontend System Fixes (#4839)
* cost-insights - New Frontend System Fixes

Signed-off-by: Andre Wanlin <awanlin@spotify.com>

* Updated API report

Signed-off-by: Andre Wanlin <awanlin@spotify.com>

---------

Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2025-08-25 08:14:14 -05:00
Andre Wanlin 7bafbd4fc8
various workspaces - Added auto bump file (#5044)
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2025-08-25 07:29:45 -05:00
Backstage Service Account 0493206694
github-actions - version:bump to v1.42.3 (#5021)
* v1.42.3 version bump

* github-actions: nfs fixes and switch to yarn plugin

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

* github-actions: prettier tweaks

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

* github-actions: update api reports for nfs

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

---------

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Vincenzo Scamporlino <vincenzos@spotify.com>
2025-08-25 10:47:10 +02:00
Backstage Service Account ca3c813046
linguist - version:bump to v1.42.3 (#5039)
* v1.42.3 version bump

* Use yarn plugin

Signed-off-by: Andre Wanlin <awanlin@spotify.com>

* Manual changes for release

Signed-off-by: Andre Wanlin <awanlin@spotify.com>

* Maintenance

Signed-off-by: Andre Wanlin <awanlin@spotify.com>

---------

Signed-off-by: Andre Wanlin <awanlin@spotify.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Andre Wanlin <awanlin@spotify.com>
2025-08-24 13:42:42 -05:00
Backstage Service Account 8367480d11
azure-devops - version:bump to v1.42.3 (#5040)
* v1.42.3 version bump

* Use yarn plugin

Signed-off-by: Andre Wanlin <awanlin@spotify.com>

* Manual changes for release

Signed-off-by: Andre Wanlin <awanlin@spotify.com>

* Maintenance

Signed-off-by: Andre Wanlin <awanlin@spotify.com>

---------

Signed-off-by: Andre Wanlin <awanlin@spotify.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Andre Wanlin <awanlin@spotify.com>
2025-08-24 13:42:27 -05:00
Backstage Service Account 6e6b88413f
Version Packages (#4840)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-22 16:05:08 -05:00
Backstage Service Account 4815dfd531
v1.41.1 version bump (#4973)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-22 15:51:41 -05:00
Juan Pablo Garcia Ripa c2b33a16aa
github-pull-request-board decouple board from entity page (#4710)
* Decouple entities from the board logic for reuse the board on other places

Signed-off-by: Juan Pablo Garcia Ripa <sarabadu@gmail.com>

* mock useEntity

Signed-off-by: Juan Pablo Garcia Ripa <sarabadu@gmail.com>

* revert the change
Signed-off-by: Juan Pablo Garcia Ripa <sarabadu@gmail.com>

Signed-off-by: Juan Pablo Garcia Ripa <sarabadu@gmail.com>

---------

Signed-off-by: Juan Pablo Garcia Ripa <sarabadu@gmail.com>
2025-08-22 15:16:31 -05:00
James Andrew Vaughn 56382c80de
Remove `rollbar-backend` legacy backend (#4778)
* fix(rollbar-backend): use correct plugin id

The rollbar backend plugin did not have the id expected by
the frontend plugin and all rollbar to backend requests
failed.

Signed-off-by: James Andrew Vaughn <jamesvaughn@modethirteen.com>

* refactor(rollbar-backend)!: remove legacy backend support

BREAKING CHANGE: This removes the deprecated createRouter
interface. Going forward the rollbar backend plugin must be
registered using createBackendPlugin

Signed-off-by: James Andrew Vaughn <jamesvaughn@modethirteen.com>

---------

Signed-off-by: James Andrew Vaughn <jamesvaughn@modethirteen.com>
2025-08-22 14:39:55 -05:00
Backstage Service Account 7043b8bbb6
Version Packages (#5006)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-22 15:54:03 +00:00
Fredrik Adelöw 8460759070
explore: remove the alpha export of the collator (#5034)
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
2025-08-22 09:45:36 -05:00
Fredrik Adelöw 02546adb32
explore: use the yarn plugin (#5033)
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
2025-08-22 09:29:45 -05:00
Fredrik Adelöw c4f95b6e1e
move over `@backstage/plugin-search-backend-module-explore` (#4993)
* move over @backstage/plugin-search-backend-module-explore

Signed-off-by: Fredrik Adelöw <freben@gmail.com>

* add note in the README about where it was moved from

Signed-off-by: Fredrik Adelöw <freben@gmail.com>

---------

Signed-off-by: Fredrik Adelöw <freben@gmail.com>
2025-08-22 07:31:31 -05:00
Backstage Service Account fe6d855d73
tech-radar - version:bump to v1.42.3 (#5022)
* v1.42.3 version bump

* tech-radar: align to the latest nfs specs

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

* tech-radar: api-reports

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

---------

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Vincenzo Scamporlino <vincenzos@spotify.com>
2025-08-22 13:27:29 +02:00
Camila Belo e46f2a55c2
refactor: simplify home redirect (#5007)
Signed-off-by: Camila Belo <camilaibs@gmail.com>
2025-08-22 12:59:50 +02:00
github-actions[bot] 46e1cefbac
chore: update issue templates with latest workspaces (#5028)
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-22 12:30:41 +02:00
Backstage Service Account deb952366a
v1.42.3 version bump (#5029)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-22 11:50:16 +02:00
204 changed files with 10002 additions and 18362 deletions

View File

@ -33,6 +33,7 @@ body:
- bazaar
- bitrise
- blackduck
- bookmarks
- cicd-statistics
- cloudbuild
- code-climate

View File

@ -34,6 +34,7 @@ body:
- bazaar
- bitrise
- blackduck
- bookmarks
- cicd-statistics
- cloudbuild
- code-climate

View File

@ -24,6 +24,7 @@ attributes:
- bazaar
- bitrise
- blackduck
- bookmarks
- cicd-statistics
- cloudbuild
- code-climate

3
.github/labeler.yml vendored
View File

@ -58,6 +58,9 @@ workspace/bitrise:
workspace/blackduck:
- "Workspace\\s*blackduck"
workspace/bookmarks:
- "Workspace\\s*bookmarks"
workspace/cicd-statistics:
- "Workspace\\s*cicd-statistics"

View File

@ -78,6 +78,13 @@ jobs:
- name: 'Set release name'
id: set_release_name
run: node scripts/ci/set-release-name.js ${{ matrix.workspace }} ${{ inputs.release_line || 'main' }}
- name: 'Check current and release versions'
id: check
run: |
if [[ "${{ steps.set_release_name.outputs.release_version }}" == "${{ steps.set_release_name.outputs.current_version }}" ]]; then
echo "Backstage release version and current workspace version are the same, skipping version bump"
exit 1 # Non-zero exit code fails the step and job
fi
- name: 'Configure git'
run: |
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
@ -97,7 +104,7 @@ jobs:
YARN_ENABLE_IMMUTABLE_INSTALLS: false
- name: Run dedupe
working-directory: ./workspaces/${{ matrix.workspace }}
run: yarn dedupe
run: yarn dedupe
- name: 'Check for changes'
id: check_for_changes
run: |

View File

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,4 @@
plugins:
- checksum: 8af7b3f2d7d19cacc7a3712f871efcb6208ba283a1f532260b0cba80c2cb66ed772b207b5ba41b8c5d64dd8d5e0c0e15bbb445bd14afac491712965211ba027c
path: .yarn/plugins/@yarnpkg/plugin-backstage.cjs
spec: 'https://versions.backstage.io/v1/releases/1.42.3/yarn-plugin'

View File

@ -1,6 +1,7 @@
app:
title: Azure DevOps Example App
baseUrl: http://localhost:3000
packages: all
organization:
name: Azure DevOps Example

View File

@ -1,3 +1,3 @@
{
"version": "1.41.1"
"version": "1.42.3"
}

View File

@ -36,9 +36,9 @@
"directory": "workspaces/azure-devops"
},
"devDependencies": {
"@backstage/cli": "^0.33.1",
"@backstage/e2e-test-utils": "^0.1.1",
"@backstage/repo-tools": "^0.15.0",
"@backstage/cli": "backstage:^",
"@backstage/e2e-test-utils": "backstage:^",
"@backstage/repo-tools": "backstage:^",
"@changesets/cli": "^2.27.1",
"knip": "^5.27.4",
"node-gyp": "^10.0.0",
@ -58,9 +58,5 @@
"*.{json,md}": [
"prettier --write"
]
},
"dependencies": {
"@backstage-community/plugin-azure-devops": "workspace:^",
"@backstage-community/plugin-azure-devops-backend": "workspace:^"
}
}

View File

@ -20,29 +20,29 @@
},
"dependencies": {
"@backstage-community/plugin-azure-devops": "workspace:^",
"@backstage/app-defaults": "^1.6.4",
"@backstage/catalog-model": "^1.7.5",
"@backstage/cli": "^0.33.1",
"@backstage/core-app-api": "^1.18.0",
"@backstage/core-components": "^0.17.4",
"@backstage/core-plugin-api": "^1.10.9",
"@backstage/integration-react": "^1.2.9",
"@backstage/plugin-api-docs": "^0.12.9",
"@backstage/plugin-catalog": "^1.31.1",
"@backstage/plugin-catalog-common": "^1.1.5",
"@backstage/plugin-catalog-graph": "^0.4.21",
"@backstage/plugin-catalog-import": "^0.13.3",
"@backstage/plugin-catalog-react": "^1.19.1",
"@backstage/plugin-org": "^0.6.41",
"@backstage/plugin-permission-react": "^0.4.36",
"@backstage/plugin-scaffolder": "^1.33.0",
"@backstage/plugin-search": "^1.4.28",
"@backstage/plugin-search-react": "^1.9.2",
"@backstage/plugin-techdocs": "^1.13.2",
"@backstage/plugin-techdocs-module-addons-contrib": "^1.1.26",
"@backstage/plugin-techdocs-react": "^1.3.1",
"@backstage/plugin-user-settings": "^0.8.24",
"@backstage/theme": "^0.6.7",
"@backstage/app-defaults": "backstage:^",
"@backstage/catalog-model": "backstage:^",
"@backstage/cli": "backstage:^",
"@backstage/core-app-api": "backstage:^",
"@backstage/core-components": "backstage:^",
"@backstage/core-plugin-api": "backstage:^",
"@backstage/integration-react": "backstage:^",
"@backstage/plugin-api-docs": "backstage:^",
"@backstage/plugin-catalog": "backstage:^",
"@backstage/plugin-catalog-common": "backstage:^",
"@backstage/plugin-catalog-graph": "backstage:^",
"@backstage/plugin-catalog-import": "backstage:^",
"@backstage/plugin-catalog-react": "backstage:^",
"@backstage/plugin-org": "backstage:^",
"@backstage/plugin-permission-react": "backstage:^",
"@backstage/plugin-scaffolder": "backstage:^",
"@backstage/plugin-search": "backstage:^",
"@backstage/plugin-search-react": "backstage:^",
"@backstage/plugin-techdocs": "backstage:^",
"@backstage/plugin-techdocs-module-addons-contrib": "backstage:^",
"@backstage/plugin-techdocs-react": "backstage:^",
"@backstage/plugin-user-settings": "backstage:^",
"@backstage/theme": "backstage:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"react": "^18.0.2",
@ -52,7 +52,7 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/test-utils": "^1.7.10",
"@backstage/test-utils": "backstage:^",
"@playwright/test": "^1.32.3",
"@testing-library/dom": "^9.0.0",
"@testing-library/jest-dom": "^6.0.0",

View File

@ -25,26 +25,26 @@
"@backstage-community/plugin-catalog-backend-module-azure-devops-annotator-processor": "workspace:^",
"@backstage-community/plugin-scaffolder-backend-module-azure-devops": "workspace:^",
"@backstage-community/plugin-scaffolder-backend-module-dotnet": "workspace:^",
"@backstage/backend-defaults": "^0.11.1",
"@backstage/config": "^1.3.3",
"@backstage/plugin-app-backend": "^0.5.4",
"@backstage/plugin-auth-backend": "^0.25.2",
"@backstage/plugin-auth-backend-module-guest-provider": "^0.2.10",
"@backstage/plugin-auth-node": "^0.6.5",
"@backstage/plugin-catalog-backend": "^3.0.0",
"@backstage/plugin-catalog-backend-module-logs": "^0.1.12",
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^0.2.10",
"@backstage/plugin-permission-backend": "^0.7.2",
"@backstage/plugin-permission-backend-module-allow-all-policy": "^0.2.10",
"@backstage/plugin-permission-common": "^0.9.1",
"@backstage/plugin-permission-node": "^0.10.2",
"@backstage/plugin-proxy-backend": "^0.6.4",
"@backstage/plugin-scaffolder-backend": "^2.1.0",
"@backstage/plugin-search-backend": "^2.0.4",
"@backstage/plugin-search-backend-module-catalog": "^0.3.6",
"@backstage/plugin-search-backend-module-techdocs": "^0.4.4",
"@backstage/plugin-search-backend-node": "^1.3.13",
"@backstage/plugin-techdocs-backend": "^2.0.4",
"@backstage/backend-defaults": "backstage:^",
"@backstage/config": "backstage:^",
"@backstage/plugin-app-backend": "backstage:^",
"@backstage/plugin-auth-backend": "backstage:^",
"@backstage/plugin-auth-backend-module-guest-provider": "backstage:^",
"@backstage/plugin-auth-node": "backstage:^",
"@backstage/plugin-catalog-backend": "backstage:^",
"@backstage/plugin-catalog-backend-module-logs": "backstage:^",
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "backstage:^",
"@backstage/plugin-permission-backend": "backstage:^",
"@backstage/plugin-permission-backend-module-allow-all-policy": "backstage:^",
"@backstage/plugin-permission-common": "backstage:^",
"@backstage/plugin-permission-node": "backstage:^",
"@backstage/plugin-proxy-backend": "backstage:^",
"@backstage/plugin-scaffolder-backend": "backstage:^",
"@backstage/plugin-search-backend": "backstage:^",
"@backstage/plugin-search-backend-module-catalog": "backstage:^",
"@backstage/plugin-search-backend-module-techdocs": "backstage:^",
"@backstage/plugin-search-backend-node": "backstage:^",
"@backstage/plugin-techdocs-backend": "backstage:^",
"app": "link:../app",
"better-sqlite3": "^9.0.0",
"dockerode": "^3.3.1",
@ -53,7 +53,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.33.1"
"@backstage/cli": "backstage:^"
},
"files": [
"dist"

View File

@ -1,5 +1,16 @@
# @backstage-community/plugin-azure-devops-backend
## 0.20.0
### Minor Changes
- 8367480: Backstage version bump to v1.42.3
### Patch Changes
- Updated dependencies [8367480]
- @backstage-community/plugin-azure-devops-common@0.14.0
## 0.19.0
### Minor Changes

View File

@ -1,6 +1,6 @@
{
"name": "@backstage-community/plugin-azure-devops-backend",
"version": "0.19.0",
"version": "0.20.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@ -35,17 +35,17 @@
},
"dependencies": {
"@backstage-community/plugin-azure-devops-common": "workspace:^",
"@backstage/backend-defaults": "^0.11.1",
"@backstage/backend-plugin-api": "^1.4.1",
"@backstage/catalog-model": "^1.7.5",
"@backstage/config": "^1.3.3",
"@backstage/errors": "^1.2.7",
"@backstage/integration": "^1.17.1",
"@backstage/plugin-auth-node": "^0.6.5",
"@backstage/plugin-catalog-common": "^1.1.5",
"@backstage/plugin-catalog-node": "^1.17.2",
"@backstage/plugin-permission-common": "^0.9.1",
"@backstage/plugin-permission-node": "^0.10.2",
"@backstage/backend-defaults": "backstage:^",
"@backstage/backend-plugin-api": "backstage:^",
"@backstage/catalog-model": "backstage:^",
"@backstage/config": "backstage:^",
"@backstage/errors": "backstage:^",
"@backstage/integration": "backstage:^",
"@backstage/plugin-auth-node": "backstage:^",
"@backstage/plugin-catalog-common": "backstage:^",
"@backstage/plugin-catalog-node": "backstage:^",
"@backstage/plugin-permission-common": "backstage:^",
"@backstage/plugin-permission-node": "backstage:^",
"@types/express": "^4.17.6",
"azure-devops-node-api": "^13.0.0",
"express": "^4.17.1",
@ -54,8 +54,8 @@
"p-limit": "^3.1.0"
},
"devDependencies": {
"@backstage/backend-test-utils": "^1.7.0",
"@backstage/cli": "^0.33.1",
"@backstage/backend-test-utils": "backstage:^",
"@backstage/cli": "backstage:^",
"@types/lodash": "^4.14.151",
"@types/mime-types": "^2.1.0",
"@types/supertest": "^6.0.0",

View File

@ -1,5 +1,11 @@
# @backstage-community/plugin-azure-devops-common
## 0.14.0
### Minor Changes
- 8367480: Backstage version bump to v1.42.3
## 0.13.0
### Minor Changes

View File

@ -1,6 +1,6 @@
{
"name": "@backstage-community/plugin-azure-devops-common",
"version": "0.13.0",
"version": "0.14.0",
"backstage": {
"role": "common-library",
"pluginId": "azure-devops",
@ -41,11 +41,11 @@
"test": "backstage-cli package test"
},
"dependencies": {
"@backstage/catalog-model": "^1.7.5",
"@backstage/plugin-catalog-common": "^1.1.5",
"@backstage/plugin-permission-common": "^0.9.1"
"@backstage/catalog-model": "backstage:^",
"@backstage/plugin-catalog-common": "backstage:^",
"@backstage/plugin-permission-common": "backstage:^"
},
"devDependencies": {
"@backstage/cli": "^0.33.1"
"@backstage/cli": "backstage:^"
}
}

View File

@ -1,5 +1,16 @@
# @backstage-community/plugin-azure-devops
## 0.19.0
### Minor Changes
- 8367480: Backstage version bump to v1.42.3
### Patch Changes
- Updated dependencies [8367480]
- @backstage-community/plugin-azure-devops-common@0.14.0
## 0.18.0
### Minor Changes

View File

@ -412,3 +412,43 @@ async handle(
};
}
```
## New Frontend System (Alpha)
The Azure DevOps plugin currently support the New Frontend System via an `/alpha` export, here's how to use it:
### Use new frontend system
1. Install the frontend plugin:
```bash
# From your Backstage root directory
yarn --cwd packages/app add @backstage-community/plugin-azure-devops
```
2. Enable the plugin in your `packages/app(-next)/src/App.tsx`:
After all other imports:
```tsx
import azureDevOpsPlugin from '@backstage-community/plugin-azure-devops';
```
```tsx
export const app = createApp({
features: [
catalogPlugin,
catalogImportPlugin,
userSettingsPlugin,
azureDevOpsPlugin,
// ...
],
});
```
Alternatively you can simply use feature discover and skip the above step by adding the following yo your `app-config.yaml` file:
```yaml
app:
packages: all
```

View File

@ -1,6 +1,6 @@
{
"name": "@backstage-community/plugin-azure-devops",
"version": "0.18.0",
"version": "0.19.0",
"backstage": {
"role": "frontend-plugin",
"pluginId": "azure-devops",
@ -52,14 +52,14 @@
},
"dependencies": {
"@backstage-community/plugin-azure-devops-common": "workspace:^",
"@backstage/catalog-model": "^1.7.5",
"@backstage/core-compat-api": "^0.4.4",
"@backstage/core-components": "^0.17.4",
"@backstage/core-plugin-api": "^1.10.9",
"@backstage/errors": "^1.2.7",
"@backstage/frontend-plugin-api": "^0.10.4",
"@backstage/plugin-catalog-react": "^1.19.1",
"@backstage/plugin-permission-react": "^0.4.36",
"@backstage/catalog-model": "backstage:^",
"@backstage/core-compat-api": "backstage:^",
"@backstage/core-components": "backstage:^",
"@backstage/core-plugin-api": "backstage:^",
"@backstage/errors": "backstage:^",
"@backstage/frontend-plugin-api": "backstage:^",
"@backstage/plugin-catalog-react": "backstage:^",
"@backstage/plugin-permission-react": "backstage:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
@ -68,9 +68,9 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.33.1",
"@backstage/dev-utils": "^1.1.12",
"@backstage/test-utils": "^1.7.10",
"@backstage/cli": "backstage:^",
"@backstage/dev-utils": "backstage:^",
"@backstage/test-utils": "backstage:^",
"@testing-library/dom": "^10.0.0",
"@testing-library/jest-dom": "^6.0.0",
"@testing-library/react": "^15.0.0",

View File

@ -7,17 +7,19 @@
import { AnyApiFactory } from '@backstage/core-plugin-api';
import { AnyRouteRefParams } from '@backstage/frontend-plugin-api';
import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api';
import { ApiFactory } from '@backstage/core-plugin-api';
import { Entity } from '@backstage/catalog-model';
import { EntityCardType } from '@backstage/plugin-catalog-react/alpha';
import { EntityPredicate } from '@backstage/plugin-catalog-react/alpha';
import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api';
import { ExtensionDataRef } from '@backstage/frontend-plugin-api';
import { ExtensionDefinition } from '@backstage/frontend-plugin-api';
import { FrontendPlugin } from '@backstage/frontend-plugin-api';
import { JSX as JSX_2 } from 'react';
import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api';
import { RouteRef } from '@backstage/frontend-plugin-api';
// @alpha (undocumented)
const _default: FrontendPlugin<
const _default: OverridableFrontendPlugin<
{},
{},
{
@ -26,15 +28,17 @@ const _default: FrontendPlugin<
name: undefined;
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
AnyApiFactory,
'core.api.factory',
{}
>;
output: ExtensionDataRef<AnyApiFactory, 'core.api.factory', {}>;
inputs: {};
params: {
factory: AnyApiFactory;
};
params: <
TApi,
TImpl extends TApi,
TDeps extends {
[x: string]: unknown;
},
>(
params: ApiFactory<TApi, TImpl, TDeps>,
) => ExtensionBlueprintParams<AnyApiFactory>;
}>;
'entity-card:azure-devops/readme': ExtensionDefinition<{
kind: 'entity-card';
@ -48,22 +52,22 @@ const _default: FrontendPlugin<
type?: 'content' | 'summary' | 'info' | undefined;
};
output:
| ConfigurableExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ExtensionDataRef<
(entity: Entity) => boolean,
'catalog.entity-filter-function',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<
string,
'catalog.entity-filter-expression',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<
EntityCardType,
'catalog.entity-card-type',
{
@ -93,35 +97,31 @@ const _default: FrontendPlugin<
group?: string | false | undefined;
};
output:
| ConfigurableExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ConfigurableExtensionDataRef<string, 'core.routing.path', {}>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ExtensionDataRef<string, 'core.routing.path', {}>
| ExtensionDataRef<
RouteRef<AnyRouteRefParams>,
'core.routing.ref',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
string,
'catalog.entity-content-title',
{}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<
(entity: Entity) => boolean,
'catalog.entity-filter-function',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<
string,
'catalog.entity-filter-expression',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<string, 'catalog.entity-content-title', {}>
| ExtensionDataRef<
string,
'catalog.entity-content-group',
{
@ -130,10 +130,12 @@ const _default: FrontendPlugin<
>;
inputs: {};
params: {
loader: () => Promise<JSX.Element>;
defaultPath: string;
defaultTitle: string;
defaultGroup?:
defaultPath?: [Error: "Use the 'path' param instead"] | undefined;
path: string;
defaultTitle?: [Error: "Use the 'title' param instead"] | undefined;
title: string;
defaultGroup?: [Error: "Use the 'group' param instead"] | undefined;
group?:
| (string & {})
| 'development'
| 'deployment'
@ -142,6 +144,7 @@ const _default: FrontendPlugin<
| 'operation'
| 'observability'
| undefined;
loader: () => Promise<JSX.Element>;
routeRef?: RouteRef<AnyRouteRefParams> | undefined;
filter?: EntityPredicate | ((entity: Entity) => boolean) | undefined;
};
@ -162,35 +165,31 @@ const _default: FrontendPlugin<
group?: string | false | undefined;
};
output:
| ConfigurableExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ConfigurableExtensionDataRef<string, 'core.routing.path', {}>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ExtensionDataRef<string, 'core.routing.path', {}>
| ExtensionDataRef<
RouteRef<AnyRouteRefParams>,
'core.routing.ref',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
string,
'catalog.entity-content-title',
{}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<
(entity: Entity) => boolean,
'catalog.entity-filter-function',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<
string,
'catalog.entity-filter-expression',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<string, 'catalog.entity-content-title', {}>
| ExtensionDataRef<
string,
'catalog.entity-content-group',
{
@ -199,10 +198,12 @@ const _default: FrontendPlugin<
>;
inputs: {};
params: {
loader: () => Promise<JSX.Element>;
defaultPath: string;
defaultTitle: string;
defaultGroup?:
defaultPath?: [Error: "Use the 'path' param instead"] | undefined;
path: string;
defaultTitle?: [Error: "Use the 'title' param instead"] | undefined;
title: string;
defaultGroup?: [Error: "Use the 'group' param instead"] | undefined;
group?:
| (string & {})
| 'development'
| 'deployment'
@ -211,6 +212,7 @@ const _default: FrontendPlugin<
| 'operation'
| 'observability'
| undefined;
loader: () => Promise<JSX.Element>;
routeRef?: RouteRef<AnyRouteRefParams> | undefined;
filter?: EntityPredicate | ((entity: Entity) => boolean) | undefined;
};
@ -231,35 +233,31 @@ const _default: FrontendPlugin<
group?: string | false | undefined;
};
output:
| ConfigurableExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ConfigurableExtensionDataRef<string, 'core.routing.path', {}>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ExtensionDataRef<string, 'core.routing.path', {}>
| ExtensionDataRef<
RouteRef<AnyRouteRefParams>,
'core.routing.ref',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
string,
'catalog.entity-content-title',
{}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<
(entity: Entity) => boolean,
'catalog.entity-filter-function',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<
string,
'catalog.entity-filter-expression',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<string, 'catalog.entity-content-title', {}>
| ExtensionDataRef<
string,
'catalog.entity-content-group',
{
@ -268,10 +266,12 @@ const _default: FrontendPlugin<
>;
inputs: {};
params: {
loader: () => Promise<JSX.Element>;
defaultPath: string;
defaultTitle: string;
defaultGroup?:
defaultPath?: [Error: "Use the 'path' param instead"] | undefined;
path: string;
defaultTitle?: [Error: "Use the 'title' param instead"] | undefined;
title: string;
defaultGroup?: [Error: "Use the 'group' param instead"] | undefined;
group?:
| (string & {})
| 'development'
| 'deployment'
@ -280,6 +280,7 @@ const _default: FrontendPlugin<
| 'operation'
| 'observability'
| undefined;
loader: () => Promise<JSX.Element>;
routeRef?: RouteRef<AnyRouteRefParams> | undefined;
filter?: EntityPredicate | ((entity: Entity) => boolean) | undefined;
};
@ -294,9 +295,9 @@ const _default: FrontendPlugin<
path?: string | undefined;
};
output:
| ConfigurableExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ConfigurableExtensionDataRef<string, 'core.routing.path', {}>
| ConfigurableExtensionDataRef<
| ExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ExtensionDataRef<string, 'core.routing.path', {}>
| ExtensionDataRef<
RouteRef<AnyRouteRefParams>,
'core.routing.ref',
{
@ -305,7 +306,8 @@ const _default: FrontendPlugin<
>;
inputs: {};
params: {
defaultPath: string;
defaultPath?: [Error: "Use the 'path' param instead"] | undefined;
path: string;
loader: () => Promise<JSX.Element>;
routeRef?: RouteRef<AnyRouteRefParams> | undefined;
};

View File

@ -16,7 +16,6 @@
import {
ApiBlueprint,
createApiFactory,
PageBlueprint,
createFrontendPlugin,
discoveryApiRef,
@ -36,8 +35,8 @@ import { isAzureDevOpsAvailable, isAzurePipelinesAvailable } from '../plugin';
/** @alpha */
export const azureDevOpsApi = ApiBlueprint.make({
params: {
factory: createApiFactory({
params: defineParams =>
defineParams({
api: azureDevOpsApiRef,
deps: {
discoveryApi: discoveryApiRef,
@ -46,13 +45,12 @@ export const azureDevOpsApi = ApiBlueprint.make({
factory: ({ discoveryApi, fetchApi }) =>
new AzureDevOpsClient({ discoveryApi, fetchApi }),
}),
},
});
/** @alpha */
export const azureDevOpsPullRequestPage = PageBlueprint.make({
params: {
defaultPath: '/azure-pull-requests',
path: '/azure-pull-requests',
routeRef: convertLegacyRouteRef(azurePullRequestDashboardRouteRef),
loader: () =>
import('../components/PullRequestsPage').then(m =>
@ -65,8 +63,8 @@ export const azureDevOpsPullRequestPage = PageBlueprint.make({
export const azureDevOpsPipelinesEntityContent = EntityContentBlueprint.make({
name: 'pipelines',
params: {
defaultPath: '/pipelines',
defaultTitle: 'Pipelines',
path: '/pipelines',
title: 'Pipelines',
filter: isAzurePipelinesAvailable,
loader: () =>
import('../components/EntityPageAzurePipelines').then(m =>
@ -79,8 +77,8 @@ export const azureDevOpsPipelinesEntityContent = EntityContentBlueprint.make({
export const azureDevOpsGitTagsEntityContent = EntityContentBlueprint.make({
name: 'git-tags',
params: {
defaultPath: '/git-tags',
defaultTitle: 'Git Tags',
path: '/git-tags',
title: 'Git Tags',
filter: isAzureDevOpsAvailable,
loader: () =>
import('../components/EntityPageAzureGitTags').then(m =>
@ -94,8 +92,8 @@ export const azureDevOpsPullRequestsEntityContent = EntityContentBlueprint.make(
{
name: 'pull-requests',
params: {
defaultPath: '/pull-requests',
defaultTitle: 'Pull Requests',
path: '/pull-requests',
title: 'Pull Requests',
filter: isAzureDevOpsAvailable,
loader: () =>
import('../components/EntityPageAzurePullRequests').then(m =>

View File

@ -1,5 +1,16 @@
# @backstage-community/plugin-catalog-backend-module-azure-devops-annotator-processor
## 0.11.0
### Minor Changes
- 8367480: Backstage version bump to v1.42.3
### Patch Changes
- Updated dependencies [8367480]
- @backstage-community/plugin-azure-devops-common@0.14.0
## 0.10.0
### Minor Changes

View File

@ -1,7 +1,7 @@
{
"name": "@backstage-community/plugin-catalog-backend-module-azure-devops-annotator-processor",
"description": "The azure-devops-annotator-processor backend module for the catalog plugin.",
"version": "0.10.0",
"version": "0.11.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@ -31,17 +31,17 @@
},
"dependencies": {
"@backstage-community/plugin-azure-devops-common": "workspace:^",
"@backstage/backend-plugin-api": "^1.4.1",
"@backstage/catalog-model": "^1.7.5",
"@backstage/config": "^1.3.3",
"@backstage/integration": "^1.17.1",
"@backstage/plugin-catalog-common": "^1.1.5",
"@backstage/plugin-catalog-node": "^1.17.2",
"@backstage/backend-plugin-api": "backstage:^",
"@backstage/catalog-model": "backstage:^",
"@backstage/config": "backstage:^",
"@backstage/integration": "backstage:^",
"@backstage/plugin-catalog-common": "backstage:^",
"@backstage/plugin-catalog-node": "backstage:^",
"lodash": "^4.17.21"
},
"devDependencies": {
"@backstage/backend-test-utils": "^1.7.0",
"@backstage/cli": "^0.33.1"
"@backstage/backend-test-utils": "backstage:^",
"@backstage/cli": "backstage:^"
},
"files": [
"dist"

View File

@ -1,5 +1,11 @@
# @backstage-community/plugin-scaffolder-backend-module-azure-devops
## 0.13.0
### Minor Changes
- 8367480: Backstage version bump to v1.42.3
## 0.12.0
### Minor Changes

View File

@ -1,7 +1,7 @@
{
"name": "@backstage-community/plugin-scaffolder-backend-module-azure-devops",
"description": "The azure-devops module for @backstage/plugin-scaffolder-backend",
"version": "0.12.0",
"version": "0.13.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@ -39,17 +39,17 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
"@backstage/backend-plugin-api": "^1.4.1",
"@backstage/config": "^1.3.3",
"@backstage/errors": "^1.2.7",
"@backstage/integration": "^1.17.1",
"@backstage/plugin-scaffolder-node": "^0.10.0",
"@backstage/backend-plugin-api": "backstage:^",
"@backstage/config": "backstage:^",
"@backstage/errors": "backstage:^",
"@backstage/integration": "backstage:^",
"@backstage/plugin-scaffolder-node": "backstage:^",
"azure-devops-node-api": "^14.1.0",
"yaml": "^2.6.0"
},
"devDependencies": {
"@backstage/cli": "^0.33.1",
"@backstage/plugin-scaffolder-node-test-utils": "^0.3.1"
"@backstage/cli": "backstage:^",
"@backstage/plugin-scaffolder-node-test-utils": "backstage:^"
},
"files": [
"dist"

View File

@ -1,5 +1,11 @@
# @backstage-community/plugin-scaffolder-backend-module-dotnet
## 0.6.0
### Minor Changes
- 8367480: Backstage version bump to v1.42.3
## 0.5.0
### Minor Changes

View File

@ -1,5 +1,5 @@
{
"version": "0.5.0",
"version": "0.6.0",
"license": "Apache-2.0",
"name": "@backstage-community/plugin-scaffolder-backend-module-dotnet",
"description": "The azure-devops module for @backstage/plugin-scaffolder-backend",
@ -39,15 +39,15 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
"@backstage/backend-plugin-api": "^1.4.1",
"@backstage/plugin-scaffolder-node": "^0.10.0",
"@backstage/backend-plugin-api": "backstage:^",
"@backstage/plugin-scaffolder-node": "backstage:^",
"fs-extra": "^11.3.0",
"yaml": "^2.6.0",
"zod": "^3.24.3"
},
"devDependencies": {
"@backstage/cli": "^0.33.1",
"@backstage/plugin-scaffolder-node-test-utils": "^0.3.1",
"@backstage/cli": "backstage:^",
"@backstage/plugin-scaffolder-node-test-utils": "backstage:^",
"@types/fs-extra": "^11"
},
"files": [

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
---
'@backstage-community/plugin-azure-storage-explorer': minor
'@backstage-community/plugin-azure-storage-explorer-backend': minor
---
Backstage version bump to v1.41.1

View File

@ -1,3 +1,3 @@
{
"version": "1.40.2"
"version": "1.41.1"
}

View File

@ -36,9 +36,9 @@
"directory": "workspaces/azure-storage-explorer"
},
"devDependencies": {
"@backstage/cli": "^0.33.0",
"@backstage/cli": "^0.33.1",
"@backstage/e2e-test-utils": "^0.1.1",
"@backstage/repo-tools": "^0.14.0",
"@backstage/repo-tools": "^0.15.0",
"@changesets/cli": "^2.27.1",
"knip": "^5.27.4",
"node-gyp": "^9.0.0",

View File

@ -20,29 +20,29 @@
},
"dependencies": {
"@backstage-community/plugin-azure-storage-explorer": "workspace:^",
"@backstage/app-defaults": "^1.6.3",
"@backstage/catalog-model": "^1.7.4",
"@backstage/cli": "^0.33.0",
"@backstage/core-app-api": "^1.17.1",
"@backstage/core-components": "^0.17.3",
"@backstage/core-plugin-api": "^1.10.8",
"@backstage/integration-react": "^1.2.8",
"@backstage/plugin-api-docs": "^0.12.8",
"@backstage/plugin-catalog": "^1.31.0",
"@backstage/plugin-catalog-common": "^1.1.4",
"@backstage/plugin-catalog-graph": "^0.4.20",
"@backstage/plugin-catalog-import": "^0.13.2",
"@backstage/plugin-catalog-react": "^1.19.0",
"@backstage/plugin-org": "^0.6.40",
"@backstage/plugin-permission-react": "^0.4.35",
"@backstage/plugin-scaffolder": "^1.32.0",
"@backstage/plugin-search": "^1.4.27",
"@backstage/plugin-search-react": "^1.9.1",
"@backstage/plugin-techdocs": "^1.13.1",
"@backstage/plugin-techdocs-module-addons-contrib": "^1.1.25",
"@backstage/plugin-techdocs-react": "^1.3.0",
"@backstage/plugin-user-settings": "^0.8.23",
"@backstage/theme": "^0.6.6",
"@backstage/app-defaults": "^1.6.4",
"@backstage/catalog-model": "^1.7.5",
"@backstage/cli": "^0.33.1",
"@backstage/core-app-api": "^1.18.0",
"@backstage/core-components": "^0.17.4",
"@backstage/core-plugin-api": "^1.10.9",
"@backstage/integration-react": "^1.2.9",
"@backstage/plugin-api-docs": "^0.12.9",
"@backstage/plugin-catalog": "^1.31.1",
"@backstage/plugin-catalog-common": "^1.1.5",
"@backstage/plugin-catalog-graph": "^0.4.21",
"@backstage/plugin-catalog-import": "^0.13.3",
"@backstage/plugin-catalog-react": "^1.19.1",
"@backstage/plugin-org": "^0.6.41",
"@backstage/plugin-permission-react": "^0.4.36",
"@backstage/plugin-scaffolder": "^1.33.0",
"@backstage/plugin-search": "^1.4.28",
"@backstage/plugin-search-react": "^1.9.2",
"@backstage/plugin-techdocs": "^1.13.2",
"@backstage/plugin-techdocs-module-addons-contrib": "^1.1.26",
"@backstage/plugin-techdocs-react": "^1.3.1",
"@backstage/plugin-user-settings": "^0.8.24",
"@backstage/theme": "^0.6.7",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"react": "^18.0.2",
@ -51,7 +51,7 @@
"react-router-dom": "^6.3.0"
},
"devDependencies": {
"@backstage/test-utils": "^1.7.9",
"@backstage/test-utils": "^1.7.10",
"@playwright/test": "^1.32.3",
"@testing-library/dom": "^9.0.0",
"@testing-library/jest-dom": "^6.0.0",

View File

@ -22,27 +22,27 @@
},
"dependencies": {
"@backstage-community/plugin-azure-storage-explorer-backend": "workspace:^",
"@backstage/backend-defaults": "^0.11.0",
"@backstage/catalog-client": "^1.10.1",
"@backstage/config": "^1.3.2",
"@backstage/plugin-app-backend": "^0.5.3",
"@backstage/plugin-auth-backend": "^0.25.1",
"@backstage/plugin-auth-backend-module-github-provider": "^0.3.4",
"@backstage/plugin-auth-backend-module-guest-provider": "^0.2.9",
"@backstage/plugin-auth-node": "^0.6.4",
"@backstage/plugin-catalog-backend": "^2.1.0",
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^0.2.9",
"@backstage/plugin-permission-backend": "^0.7.1",
"@backstage/plugin-permission-backend-module-allow-all-policy": "^0.2.9",
"@backstage/plugin-permission-common": "^0.9.0",
"@backstage/plugin-permission-node": "^0.10.1",
"@backstage/plugin-proxy-backend": "^0.6.3",
"@backstage/plugin-scaffolder-backend": "^2.0.0",
"@backstage/plugin-search-backend": "^2.0.3",
"@backstage/plugin-search-backend-module-catalog": "^0.3.5",
"@backstage/plugin-search-backend-module-techdocs": "^0.4.3",
"@backstage/plugin-search-backend-node": "^1.3.12",
"@backstage/plugin-techdocs-backend": "^2.0.3",
"@backstage/backend-defaults": "^0.11.1",
"@backstage/catalog-client": "^1.10.2",
"@backstage/config": "^1.3.3",
"@backstage/plugin-app-backend": "^0.5.4",
"@backstage/plugin-auth-backend": "^0.25.2",
"@backstage/plugin-auth-backend-module-github-provider": "^0.3.5",
"@backstage/plugin-auth-backend-module-guest-provider": "^0.2.10",
"@backstage/plugin-auth-node": "^0.6.5",
"@backstage/plugin-catalog-backend": "^3.0.0",
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^0.2.10",
"@backstage/plugin-permission-backend": "^0.7.2",
"@backstage/plugin-permission-backend-module-allow-all-policy": "^0.2.10",
"@backstage/plugin-permission-common": "^0.9.1",
"@backstage/plugin-permission-node": "^0.10.2",
"@backstage/plugin-proxy-backend": "^0.6.4",
"@backstage/plugin-scaffolder-backend": "^2.1.0",
"@backstage/plugin-search-backend": "^2.0.4",
"@backstage/plugin-search-backend-module-catalog": "^0.3.6",
"@backstage/plugin-search-backend-module-techdocs": "^0.4.4",
"@backstage/plugin-search-backend-node": "^1.3.13",
"@backstage/plugin-techdocs-backend": "^2.0.4",
"app": "link:../app",
"better-sqlite3": "^9.0.0",
"dockerode": "^3.3.1",
@ -52,7 +52,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.33.0"
"@backstage/cli": "^0.33.1"
},
"files": [
"dist"

View File

@ -40,19 +40,19 @@
"dependencies": {
"@azure/identity": "4.10.2",
"@azure/storage-blob": "12.27.0",
"@backstage/backend-defaults": "^0.11.0",
"@backstage/backend-plugin-api": "^1.4.0",
"@backstage/config": "^1.3.2",
"@backstage/backend-defaults": "^0.11.1",
"@backstage/backend-plugin-api": "^1.4.1",
"@backstage/config": "^1.3.3",
"@backstage/errors": "^1.2.7",
"@types/express": "*",
"express": "^4.17.1",
"express-promise-router": "^4.1.0"
},
"devDependencies": {
"@backstage/backend-test-utils": "^1.6.0",
"@backstage/cli": "^0.33.0",
"@backstage/plugin-auth-backend": "^0.25.1",
"@backstage/plugin-auth-backend-module-guest-provider": "^0.2.9",
"@backstage/backend-test-utils": "^1.7.0",
"@backstage/cli": "^0.33.1",
"@backstage/plugin-auth-backend": "^0.25.2",
"@backstage/plugin-auth-backend-module-guest-provider": "^0.2.10",
"@types/supertest": "^6.0.0",
"supertest": "^7.0.0"
},

View File

@ -39,10 +39,10 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
"@backstage/core-components": "^0.17.3",
"@backstage/core-plugin-api": "^1.10.8",
"@backstage/core-components": "^0.17.4",
"@backstage/core-plugin-api": "^1.10.9",
"@backstage/errors": "^1.2.7",
"@backstage/theme": "^0.6.6",
"@backstage/theme": "^0.6.7",
"@material-ui/core": "^4.9.13",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "^4.0.0-alpha.61",
@ -54,10 +54,10 @@
"react-router-dom": "6.0.0-beta.0 || ^6.3.0"
},
"devDependencies": {
"@backstage/cli": "^0.33.0",
"@backstage/core-app-api": "^1.17.1",
"@backstage/dev-utils": "^1.1.11",
"@backstage/test-utils": "^1.7.9",
"@backstage/cli": "^0.33.1",
"@backstage/core-app-api": "^1.18.0",
"@backstage/dev-utils": "^1.1.12",
"@backstage/test-utils": "^1.7.10",
"@testing-library/jest-dom": "^6.0.0",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",

File diff suppressed because it is too large Load Diff

View File

View File

View File

View File

View File

@ -1,5 +1,11 @@
# @backstage-community/plugin-cost-insights
## 0.19.0
### Minor Changes
- ceeadd1: **ALPHA BREAKING** The New Frontend System `CostInsightsProjectGrowthInstructionsPage` and `CostInsightsLabelDataflowInstructionsPage` have been removed and the new frontend system support refactored to work in the same way as the current implementation.
## 0.18.0
### Minor Changes

View File

@ -1,6 +1,6 @@
{
"name": "@backstage-community/plugin-cost-insights",
"version": "0.18.0",
"version": "0.19.0",
"description": "A Backstage plugin that helps you keep track of your cloud spend",
"backstage": {
"role": "frontend-plugin",

View File

@ -5,10 +5,9 @@
```ts
/// <reference types="react" />
import { AnyApiFactory } from '@backstage/core-plugin-api';
import { AnyRouteRefParams } from '@backstage/frontend-plugin-api';
import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api';
import { Entity } from '@backstage/catalog-model';
import { EntityPredicate } from '@backstage/plugin-catalog-react/alpha';
import { ExtensionDefinition } from '@backstage/frontend-plugin-api';
import { FrontendPlugin } from '@backstage/frontend-plugin-api';
import { IconComponent } from '@backstage/core-plugin-api';
@ -19,78 +18,22 @@ import { RouteRef } from '@backstage/frontend-plugin-api';
const _default: FrontendPlugin<
{
root: RouteRef<undefined>;
growthAlerts: RouteRef<undefined>;
unlabeledDataflowAlerts: RouteRef<undefined>;
},
{},
{
'entity-content:cost-insights/EntityCostInsightsContent': ExtensionDefinition<{
kind: 'entity-content';
name: 'EntityCostInsightsContent';
config: {
path: string | undefined;
title: string | undefined;
filter: EntityPredicate | undefined;
group: string | false | undefined;
};
configInput: {
filter?: EntityPredicate | undefined;
title?: string | undefined;
path?: string | undefined;
group?: string | false | undefined;
};
output:
| ConfigurableExtensionDataRef<JSX_2.Element, 'core.reactElement', {}>
| ConfigurableExtensionDataRef<string, 'core.routing.path', {}>
| ConfigurableExtensionDataRef<
RouteRef<AnyRouteRefParams>,
'core.routing.ref',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
string,
'catalog.entity-content-title',
{}
>
| ConfigurableExtensionDataRef<
(entity: Entity) => boolean,
'catalog.entity-filter-function',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
string,
'catalog.entity-filter-expression',
{
optional: true;
}
>
| ConfigurableExtensionDataRef<
string,
'catalog.entity-content-group',
{
optional: true;
}
>;
'api:cost-insights': ExtensionDefinition<{
kind: 'api';
name: undefined;
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
AnyApiFactory,
'core.api.factory',
{}
>;
inputs: {};
params: {
loader: () => Promise<JSX.Element>;
defaultPath: string;
defaultTitle: string;
defaultGroup?:
| (string & {})
| 'overview'
| 'documentation'
| 'development'
| 'deployment'
| 'operation'
| 'observability'
| undefined;
routeRef?: RouteRef<AnyRouteRefParams> | undefined;
filter?: EntityPredicate | ((entity: Entity) => boolean) | undefined;
factory: AnyApiFactory;
};
}>;
'nav-item:cost-insights': ExtensionDefinition<{

View File

@ -14,34 +14,5 @@
* limitations under the License.
*/
import { convertLegacyRouteRefs } from '@backstage/core-compat-api';
import {
projectGrowthAlertRef,
rootRouteRef,
unlabeledDataflowAlertRef,
} from './routes';
import { createFrontendPlugin } from '@backstage/frontend-plugin-api';
import {
CostInsightsLabelDataflowInstructionsPage,
CostInsightsNavItem,
CostInsightsPage,
CostInsightsProjectGrowthInstructionsPage,
EntityCostInsightsContent,
} from './alpha/plugin';
export default createFrontendPlugin({
pluginId: 'cost-insights',
extensions: [
CostInsightsPage,
CostInsightsProjectGrowthInstructionsPage,
CostInsightsLabelDataflowInstructionsPage,
EntityCostInsightsContent,
CostInsightsNavItem,
],
routes: convertLegacyRouteRefs({
root: rootRouteRef,
growthAlerts: projectGrowthAlertRef,
unlabeledDataflowAlerts: unlabeledDataflowAlertRef,
}),
});
export * from './alpha/index';
export { default } from './alpha/index';

View File

@ -14,4 +14,4 @@
* limitations under the License.
*/
export * from './plugin';
export { default } from './plugin';

View File

@ -17,18 +17,31 @@
import {
PageBlueprint,
NavItemBlueprint,
createFrontendPlugin,
ApiBlueprint,
createApiFactory,
} from '@backstage/frontend-plugin-api';
import {
compatWrapper,
convertLegacyRouteRef,
convertLegacyRouteRefs,
} from '@backstage/core-compat-api';
import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
import MoneyIcon from '@material-ui/icons/MonetizationOn';
import {
projectGrowthAlertRef,
rootRouteRef,
unlabeledDataflowAlertRef,
} from '../routes';
import { rootRouteRef } from '../routes';
import { costInsightsApiRef } from '../api';
import { ExampleCostInsightsClient } from '../example';
/** @alpha */
export const CostInsightsApi = ApiBlueprint.make({
params: {
factory: createApiFactory({
api: costInsightsApiRef,
deps: {},
factory: ({}) => new ExampleCostInsightsClient(),
}),
},
});
/** @alpha */
export const CostInsightsPage = PageBlueprint.make({
@ -36,33 +49,7 @@ export const CostInsightsPage = PageBlueprint.make({
defaultPath: '/cost-insights',
routeRef: convertLegacyRouteRef(rootRouteRef),
loader: () =>
import('../components/CostInsightsPage').then(m =>
compatWrapper(<m.CostInsightsPage />),
),
},
});
/** @alpha */
export const CostInsightsProjectGrowthInstructionsPage = PageBlueprint.make({
params: {
defaultPath: '/cost-insights/investigating-growth',
routeRef: convertLegacyRouteRef(projectGrowthAlertRef),
loader: () =>
import('../components/ProjectGrowthInstructionsPage').then(m =>
compatWrapper(<m.ProjectGrowthInstructionsPage />),
),
},
});
/** @alpha */
export const CostInsightsLabelDataflowInstructionsPage = PageBlueprint.make({
params: {
defaultPath: '/cost-insights/labeling-jobs',
routeRef: convertLegacyRouteRef(unlabeledDataflowAlertRef),
loader: () =>
import('../components/LabelDataflowInstructionsPage').then(m =>
compatWrapper(<m.LabelDataflowInstructionsPage />),
),
import('./router').then(m => compatWrapper(<m.CostInsightsRouter />)),
},
});
@ -72,7 +59,6 @@ export const EntityCostInsightsContent = EntityContentBlueprint.make({
params: {
defaultPath: '/cost-insights',
defaultTitle: 'Cost Insights',
routeRef: convertLegacyRouteRef(rootRouteRef),
loader: () =>
import('../components/EntityCosts').then(m =>
compatWrapper(<m.EntityCosts />),
@ -90,3 +76,11 @@ export const CostInsightsNavItem = NavItemBlueprint.make({
icon: MoneyIcon,
},
});
export default createFrontendPlugin({
pluginId: 'cost-insights',
extensions: [CostInsightsApi, CostInsightsPage, CostInsightsNavItem],
routes: convertLegacyRouteRefs({
root: rootRouteRef,
}),
});

View File

@ -0,0 +1,50 @@
/*
* Copyright 2025 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 { createSubRouteRef } from '@backstage/core-plugin-api';
import { Route, Routes } from 'react-router-dom';
import { rootRouteRef } from '../routes';
import {
CostInsightsPage,
LabelDataflowInstructionsPage,
ProjectGrowthInstructionsPage,
} from '../components';
export const projectGrowthAlertSubRouteRef = createSubRouteRef({
id: 'cost-insights/investigating-growth',
parent: rootRouteRef,
path: '/investigating-growth',
});
export const unlabeledDataflowAlertSubRouteRef = createSubRouteRef({
id: 'cost-insights/labeling-jobs',
parent: rootRouteRef,
path: '/labeling-jobs',
});
export const CostInsightsRouter = () => (
<Routes>
<Route path="/" element={<CostInsightsPage />} />
<Route
path={projectGrowthAlertSubRouteRef.path}
element={<ProjectGrowthInstructionsPage />}
/>
<Route
path={unlabeledDataflowAlertSubRouteRef.path}
element={<LabelDataflowInstructionsPage />}
/>
</Routes>
);

View File

@ -9,6 +9,7 @@
"files": ["node_modules/@backstage/cli/asset-types/asset-types.d.ts"],
"exclude": ["node_modules"],
"compilerOptions": {
"types": ["node"],
"outDir": "dist-types",
"rootDir": ".",
"lib": ["DOM", "DOM.Iterable", "ScriptHost", "ES2022"],

View File

View File

@ -1,5 +0,0 @@
---
'@backstage-community/plugin-explore': patch
---
Migrate the explore api, index page, and nav item to the new frontend system.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,4 @@
plugins:
- checksum: 8af7b3f2d7d19cacc7a3712f871efcb6208ba283a1f532260b0cba80c2cb66ed772b207b5ba41b8c5d64dd8d5e0c0e15bbb445bd14afac491712965211ba027c
path: .yarn/plugins/@yarnpkg/plugin-backstage.cjs
spec: 'https://versions.backstage.io/v1/releases/1.42.3/yarn-plugin'

View File

@ -1,3 +1,3 @@
{
"version": "1.41.1"
"version": "1.42.3"
}

View File

@ -35,9 +35,9 @@
"directory": "workspaces/explore"
},
"devDependencies": {
"@backstage/cli": "^0.33.1",
"@backstage/e2e-test-utils": "^0.1.1",
"@backstage/repo-tools": "^0.15.0",
"@backstage/cli": "backstage:^",
"@backstage/e2e-test-utils": "backstage:^",
"@backstage/repo-tools": "backstage:^",
"@changesets/cli": "^2.27.1",
"knip": "^5.27.4",
"node-gyp": "^10.0.0",

View File

@ -1,5 +1,19 @@
# @backstage-community/plugin-explore-backend
## 0.9.0
### Minor Changes
- deb9523: Backstage version bump to v1.42.3
### Patch Changes
- 02546ad: Internall update to use the yarn plugin for version management
- Updated dependencies [02546ad]
- Updated dependencies [deb9523]
- @backstage-community/plugin-explore-common@0.7.0
- @backstage-community/plugin-explore-node@0.8.0
## 0.8.0
### Minor Changes

View File

@ -1,6 +1,6 @@
{
"name": "@backstage-community/plugin-explore-backend",
"version": "0.8.0",
"version": "0.9.0",
"backstage": {
"role": "backend-plugin",
"pluginId": "explore",
@ -42,9 +42,9 @@
"dependencies": {
"@backstage-community/plugin-explore-common": "workspace:^",
"@backstage-community/plugin-explore-node": "workspace:^",
"@backstage/backend-plugin-api": "^1.4.1",
"@backstage/config": "^1.3.3",
"@backstage/types": "^1.2.1",
"@backstage/backend-plugin-api": "backstage:^",
"@backstage/config": "backstage:^",
"@backstage/types": "backstage:^",
"@types/express": "*",
"express": "^4.18.1",
"express-promise-router": "^4.1.0",
@ -53,11 +53,11 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/backend-defaults": "^0.11.1",
"@backstage/backend-test-utils": "^1.7.0",
"@backstage/cli": "^0.33.1",
"@backstage/plugin-auth-backend": "^0.25.2",
"@backstage/plugin-auth-backend-module-guest-provider": "^0.2.10",
"@backstage/backend-defaults": "backstage:^",
"@backstage/backend-test-utils": "backstage:^",
"@backstage/cli": "backstage:^",
"@backstage/plugin-auth-backend": "backstage:^",
"@backstage/plugin-auth-backend-module-guest-provider": "backstage:^",
"@types/lodash": "^4.14.151",
"@types/node-fetch": "^2.5.12",
"@types/supertest": "^6.0.0",

View File

@ -1,5 +1,15 @@
# @backstage-community/plugin-explore-common
## 0.7.0
### Minor Changes
- deb9523: Backstage version bump to v1.42.3
### Patch Changes
- 02546ad: Internall update to use the yarn plugin for version management
## 0.6.0
### Minor Changes

View File

@ -1,6 +1,6 @@
{
"name": "@backstage-community/plugin-explore-common",
"version": "0.6.0",
"version": "0.7.0",
"description": "Common functionalities for the explore plugin",
"backstage": {
"role": "common-library",
@ -43,6 +43,6 @@
"test": "backstage-cli package test"
},
"devDependencies": {
"@backstage/cli": "^0.33.1"
"@backstage/cli": "backstage:^"
}
}

View File

@ -1,5 +1,18 @@
# @backstage-community/plugin-explore-node
## 0.8.0
### Minor Changes
- deb9523: Backstage version bump to v1.42.3
### Patch Changes
- 02546ad: Internall update to use the yarn plugin for version management
- Updated dependencies [02546ad]
- Updated dependencies [deb9523]
- @backstage-community/plugin-explore-common@0.7.0
## 0.7.0
### Minor Changes

View File

@ -1,7 +1,7 @@
{
"name": "@backstage-community/plugin-explore-node",
"description": "Node.js library for the explore plugin",
"version": "0.7.0",
"version": "0.8.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@ -35,13 +35,13 @@
"postpack": "backstage-cli package postpack"
},
"devDependencies": {
"@backstage/cli": "^0.33.1"
"@backstage/cli": "backstage:^"
},
"files": [
"dist"
],
"dependencies": {
"@backstage-community/plugin-explore-common": "workspace:^",
"@backstage/backend-plugin-api": "^1.4.1"
"@backstage/backend-plugin-api": "backstage:^"
}
}

View File

@ -1,5 +1,18 @@
# @backstage-community/plugin-explore-react
## 0.7.0
### Minor Changes
- deb9523: Backstage version bump to v1.42.3
### Patch Changes
- 02546ad: Internall update to use the yarn plugin for version management
- Updated dependencies [02546ad]
- Updated dependencies [deb9523]
- @backstage-community/plugin-explore-common@0.7.0
## 0.6.0
### Minor Changes

View File

@ -1,6 +1,6 @@
{
"name": "@backstage-community/plugin-explore-react",
"version": "0.6.0",
"version": "0.7.0",
"description": "A frontend library for Backstage plugins that want to interact with the explore plugin",
"backstage": {
"role": "web-library",
@ -45,10 +45,10 @@
},
"dependencies": {
"@backstage-community/plugin-explore-common": "workspace:^",
"@backstage/core-plugin-api": "^1.10.9"
"@backstage/core-plugin-api": "backstage:^"
},
"devDependencies": {
"@backstage/cli": "^0.33.1",
"@backstage/cli": "backstage:^",
"@testing-library/dom": "^10.0.0",
"@testing-library/jest-dom": "^6.0.0",
"@testing-library/react": "^15.0.0",

View File

@ -1,5 +1,20 @@
# @backstage-community/plugin-explore
## 0.12.0
### Minor Changes
- deb9523: Backstage version bump to v1.42.3
### Patch Changes
- 13c0def: Migrate the explore api, index page, and nav item to the new frontend system.
- 02546ad: Internall update to use the yarn plugin for version management
- Updated dependencies [02546ad]
- Updated dependencies [deb9523]
- @backstage-community/plugin-explore-common@0.7.0
- @backstage-community/plugin-explore-react@0.7.0
## 0.11.0
### Minor Changes

View File

@ -3,6 +3,9 @@ app:
baseUrl: http://localhost:3000
extensions:
- 'nav-item:catalog': false
- 'page:explore':
config:
path: '/'
backend:
baseUrl: http://localhost:7007
listen:

View File

@ -15,15 +15,12 @@
*/
import ReactDOM from 'react-dom/client';
import { Navigate } from 'react-router';
import { createApp } from '@backstage/frontend-defaults';
import {
ApiBlueprint,
PageBlueprint,
createFrontendModule,
createFrontendPlugin,
} from '@backstage/frontend-plugin-api';
import catalogPlugin from '@backstage/plugin-catalog/alpha';
@ -33,18 +30,6 @@ import explorePlugin from '../src/alpha';
import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils';
const homePlugin = createFrontendPlugin({
pluginId: 'home',
extensions: [
PageBlueprint.make({
params: {
path: '/',
loader: async () => <Navigate to="/explore" />,
},
}),
],
});
const components = [
{
apiVersion: 'backstage.io/v1alpha1',
@ -100,7 +85,7 @@ const catalogPluginOverrides = createFrontendModule({
});
const app = createApp({
features: [homePlugin, explorePlugin, catalogPlugin, catalogPluginOverrides],
features: [explorePlugin, catalogPlugin, catalogPluginOverrides],
});
const root = app.createRoot();

View File

@ -1,6 +1,6 @@
{
"name": "@backstage-community/plugin-explore",
"version": "0.11.0",
"version": "0.12.0",
"description": "A Backstage plugin for building an exploration page of your software ecosystem",
"backstage": {
"role": "frontend-plugin",
@ -59,16 +59,16 @@
"dependencies": {
"@backstage-community/plugin-explore-common": "workspace:^",
"@backstage-community/plugin-explore-react": "workspace:^",
"@backstage/catalog-client": "^1.10.2",
"@backstage/catalog-model": "^1.7.5",
"@backstage/core-compat-api": "^0.5.0",
"@backstage/core-components": "^0.17.4",
"@backstage/core-plugin-api": "^1.10.9",
"@backstage/errors": "^1.2.7",
"@backstage/frontend-plugin-api": "^0.11.0",
"@backstage/plugin-catalog-react": "^1.20.0",
"@backstage/plugin-search-common": "^1.2.19",
"@backstage/plugin-search-react": "^1.9.3",
"@backstage/catalog-client": "backstage:^",
"@backstage/catalog-model": "backstage:^",
"@backstage/core-compat-api": "backstage:^",
"@backstage/core-components": "backstage:^",
"@backstage/core-plugin-api": "backstage:^",
"@backstage/errors": "backstage:^",
"@backstage/frontend-plugin-api": "backstage:^",
"@backstage/plugin-catalog-react": "backstage:^",
"@backstage/plugin-search-common": "backstage:^",
"@backstage/plugin-search-react": "backstage:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
@ -77,12 +77,12 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.34.0",
"@backstage/core-app-api": "^1.18.0",
"@backstage/dev-utils": "^1.1.12",
"@backstage/frontend-defaults": "^0.3.0",
"@backstage/plugin-catalog": "^1.31.2",
"@backstage/test-utils": "^1.7.10",
"@backstage/cli": "backstage:^",
"@backstage/core-app-api": "backstage:^",
"@backstage/dev-utils": "backstage:^",
"@backstage/frontend-defaults": "backstage:^",
"@backstage/plugin-catalog": "backstage:^",
"@backstage/test-utils": "backstage:^",
"@testing-library/dom": "^10.0.0",
"@testing-library/jest-dom": "^6.0.0",
"@testing-library/react": "^15.0.0",

View File

@ -0,0 +1 @@
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);

View File

@ -0,0 +1,15 @@
# @backstage-community/plugin-search-backend-module-explore
## 0.4.0
### Minor Changes
- c4f95b6: Initial release in backstage-community
### Patch Changes
- 8460759: **BREAKING ALPHA**: This module is no longer available on the `/alpha` export, please update your imports to remove that last part.
- 02546ad: Internall update to use the yarn plugin for version management
- Updated dependencies [02546ad]
- Updated dependencies [deb9523]
- @backstage-community/plugin-explore-common@0.7.0

View File

@ -0,0 +1,30 @@
# search-backend-module-explore
This package exports a module that extends the search backend to also indexing the tools exposed by the [`explore` service](https://github.com/backstage/community-plugins/tree/main/workspaces/explore/plugins/explore-backend).
It was moved here from [the main Backstage repository](https://github.com/backstage/backstage/blob/b1bd24a0b2991c5b3fb2760ed06351421bc3bd97/plugins/search-backend-module-explore/README.md) where it was originally hosted, then under the package name `@backstage/plugin-search-backend-module-explore`. That old package name has now been deprecated, and this new `@backstage-community/plugin-search-backend-module-explore` replaces it.
## Installation
Add the module package as a dependency:
```bash
# From your Backstage root directory
yarn --cwd packages/backend add @backstage-community/plugin-search-backend-module-explore
```
Add the collator to your backend instance, along with the search plugin itself:
```tsx
// packages/backend/src/index.ts
import { createBackend } from '@backstage/backend-defaults';
const backend = createBackend();
backend.add(import('@backstage/plugin-search-backend'));
backend.add(
import('@backstage-community/plugin-search-backend-module-explore'),
);
backend.start();
```
You may also want to add configuration parameters to your app-config, for example for controlling the scheduled indexing interval. These parameters should be placed under the `search.collators.explore` key. See [the config definition file](https://github.com/backstage/community-plugins/blob/main/workspaces/explore/plugins/search-backend-module-explore/config.d.ts) for more details.

View File

@ -0,0 +1,10 @@
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: backstage-community-plugin-search-backend-module-explore
title: '@backstage-community/plugin-search-backend-module-explore'
description: A module for the search backend that exports explore modules
spec:
lifecycle: experimental
type: backstage-backend-plugin-module
owner: search-maintainers

View File

@ -0,0 +1,33 @@
/*
* Copyright 2023 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 { SchedulerServiceTaskScheduleDefinitionConfig } from '@backstage/backend-plugin-api';
export interface Config {
search?: {
collators?: {
/**
* Configuration options for `@backstage/plugin-search-backend-module-explore`
*/
explore?: {
/**
* The schedule for how often to run the collation job.
*/
schedule?: SchedulerServiceTaskScheduleDefinitionConfig;
};
};
};
}

View File

@ -0,0 +1 @@
# Knip report

View File

@ -0,0 +1,59 @@
{
"name": "@backstage-community/plugin-search-backend-module-explore",
"version": "0.4.0",
"description": "A module for the search backend that exports explore modules",
"backstage": {
"role": "backend-plugin-module",
"pluginId": "search",
"pluginPackage": "@backstage/plugin-search-backend"
},
"publishConfig": {
"access": "public"
},
"homepage": "https://backstage.io",
"repository": {
"type": "git",
"url": "https://github.com/backstage/community-plugins",
"directory": "workspaces/explore/plugins/search-backend-module-explore"
},
"license": "Apache-2.0",
"exports": {
".": "./src/index.ts",
"./package.json": "./package.json"
},
"main": "src/index.ts",
"types": "src/index.ts",
"typesVersions": {
"*": {
"package.json": [
"package.json"
]
}
},
"files": [
"dist",
"config.d.ts"
],
"scripts": {
"build": "backstage-cli package build",
"clean": "backstage-cli package clean",
"lint": "backstage-cli package lint",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
"start": "backstage-cli package start",
"test": "backstage-cli package test"
},
"dependencies": {
"@backstage-community/plugin-explore-common": "workspace:^",
"@backstage/backend-plugin-api": "backstage:^",
"@backstage/config": "backstage:^",
"@backstage/plugin-search-backend-node": "backstage:^",
"@backstage/plugin-search-common": "backstage:^"
},
"devDependencies": {
"@backstage/backend-test-utils": "backstage:^",
"@backstage/cli": "backstage:^",
"msw": "^1.2.1"
},
"configSchema": "config.d.ts"
}

View File

@ -0,0 +1,16 @@
## API Report File for "@backstage-community/plugin-search-backend-module-explore"
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { BackendFeature } from '@backstage/backend-plugin-api';
import { ExploreTool } from '@backstage-community/plugin-explore-common';
import { IndexableDocument } from '@backstage/plugin-search-common';
// @public
const _default: BackendFeature;
export default _default;
// @public
export interface ToolDocument extends IndexableDocument, ExploreTool {}
```

View File

@ -0,0 +1,116 @@
/*
* Copyright 2023 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 { TestPipeline } from '@backstage/plugin-search-backend-node';
import {
mockServices,
registerMswTestHooks,
} from '@backstage/backend-test-utils';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { Readable } from 'stream';
import { ToolDocumentCollatorFactory } from './ToolDocumentCollatorFactory';
const logger = mockServices.logger.mock();
const mockTools = {
tools: [
{
title: 'tool1',
description: 'tool 1 description',
url: 'https://some-url.com',
image: 'https://some-url.com/image.png',
tags: ['one'],
},
{
title: 'tool2',
description: 'tool 2 description',
url: 'https://some-url.com',
image: 'https://some-url.com/image.png',
tags: ['two'],
},
{
title: 'tool3',
description: 'tool 3 description',
url: 'https://some-url.com',
image: 'https://some-url.com/image.png',
tags: ['three'],
},
],
};
describe('ToolDocumentCollatorFactory', () => {
const config = mockServices.rootConfig();
const mockDiscoveryApi = mockServices.discovery.mock({
getBaseUrl: async () => 'http://test-backend/api/explore',
});
const options = {
discovery: mockDiscoveryApi,
logger,
auth: mockServices.auth(),
};
it('has expected type', () => {
const factory = ToolDocumentCollatorFactory.fromConfig(config, options);
expect(factory.type).toBe('tools');
});
describe('getCollator', () => {
let factory: ToolDocumentCollatorFactory;
let collator: Readable;
const worker = setupServer();
registerMswTestHooks(worker);
beforeEach(async () => {
factory = ToolDocumentCollatorFactory.fromConfig(config, options);
collator = await factory.getCollator();
worker.use(
rest.get('http://test-backend/api/explore/tools', (_, res, ctx) =>
res(ctx.status(200), ctx.json(mockTools)),
),
);
});
it('returns a readable stream', async () => {
expect(collator).toBeInstanceOf(Readable);
});
it('runs against mock tools', async () => {
const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('explore');
expect(documents).toHaveLength(mockTools.tools.length);
});
it('non-authenticated backend', async () => {
factory = ToolDocumentCollatorFactory.fromConfig(config, {
discovery: mockDiscoveryApi,
logger,
auth: mockServices.auth(),
});
collator = await factory.getCollator();
const pipeline = TestPipeline.fromCollator(collator);
const { documents } = await pipeline.execute();
expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('explore');
expect(documents).toHaveLength(mockTools.tools.length);
});
});
});

View File

@ -0,0 +1,111 @@
/*
* Copyright 2022 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
AuthService,
DiscoveryService,
LoggerService,
} from '@backstage/backend-plugin-api';
import { Config } from '@backstage/config';
import { ExploreTool } from '@backstage-community/plugin-explore-common';
import {
DocumentCollatorFactory,
IndexableDocument,
} from '@backstage/plugin-search-common';
import { Readable } from 'stream';
/**
* Extended IndexableDocument with explore tool specific properties
*
* @public
*/
export interface ToolDocument extends IndexableDocument, ExploreTool {}
/**
* @internal
*/
export type ToolDocumentCollatorFactoryOptions = {
discovery: DiscoveryService;
logger: LoggerService;
auth: AuthService;
};
/**
* Search collator responsible for collecting explore tools to index.
*
* @internal
*/
export class ToolDocumentCollatorFactory implements DocumentCollatorFactory {
public readonly type: string = 'tools';
private readonly discovery: DiscoveryService;
private readonly logger: LoggerService;
private readonly auth: AuthService;
private constructor(options: ToolDocumentCollatorFactoryOptions) {
this.discovery = options.discovery;
this.logger = options.logger;
this.auth = options.auth;
}
static fromConfig(
_config: Config,
options: ToolDocumentCollatorFactoryOptions,
) {
return new ToolDocumentCollatorFactory(options);
}
async getCollator() {
return Readable.from(this.execute());
}
async *execute(): AsyncGenerator<ToolDocument> {
this.logger.info('Starting collation of explore tools');
const tools = await this.fetchTools();
for (const tool of tools) {
yield {
...tool,
text: tool.description,
location: tool.url,
};
}
this.logger.info('Finished collation of explore tools');
}
private async fetchTools() {
const baseUrl = await this.discovery.getBaseUrl('explore');
const { token } = await this.auth.getPluginRequestToken({
onBehalfOf: await this.auth.getOwnServiceCredentials(),
targetPluginId: 'explore',
});
const response = await fetch(`${baseUrl}/tools`, {
headers: { Authorization: `Bearer ${token}` },
});
if (!response.ok) {
throw new Error(
`Failed to explore fetch tools, ${response.status}: ${response.statusText}`,
);
}
const data = await response.json();
return data.tools;
}
}

View File

@ -0,0 +1,17 @@
/*
* Copyright 2022 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export type { ToolDocument } from './ToolDocumentCollatorFactory';

View File

@ -0,0 +1,23 @@
/*
* Copyright 2023 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.
*/
/**
* @packageDocumentation
* A module for the search backend that exports Explore modules.
*/
export * from './collators';
export { default } from './module';

View File

@ -0,0 +1,57 @@
/*
* Copyright 2023 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 { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha';
import searchModuleExploreCollator from './module';
describe('searchModuleExploreCollator', () => {
const schedule = {
frequency: { minutes: 10 },
timeout: { minutes: 15 },
initialDelay: { seconds: 3 },
};
it('should register the explore collator to the search index registry extension point with factory and schedule', async () => {
const extensionPointMock = {
addCollator: jest.fn(),
};
await startTestBackend({
extensionPoints: [
[searchIndexRegistryExtensionPoint, extensionPointMock],
],
features: [
searchModuleExploreCollator,
mockServices.rootConfig.factory({
data: {
search: {
explore: {
schedule,
},
},
},
}),
],
});
expect(extensionPointMock.addCollator).toHaveBeenCalledTimes(1);
expect(extensionPointMock.addCollator).toHaveBeenCalledWith({
factory: expect.objectContaining({ type: 'tools' }),
schedule: expect.objectContaining({ run: expect.any(Function) }),
});
});
});

View File

@ -0,0 +1,79 @@
/*
* Copyright 2023 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.
*/
/**
* @packageDocumentation
* A module for the search backend that exports Explore modules.
*/
import {
coreServices,
createBackendModule,
readSchedulerServiceTaskScheduleDefinitionFromConfig,
} from '@backstage/backend-plugin-api';
import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha';
import { ToolDocumentCollatorFactory } from './collators/ToolDocumentCollatorFactory';
/**
* Search backend module for the Explore index.
*
* @public
*/
export default createBackendModule({
pluginId: 'search',
moduleId: 'explore-collator',
register(env) {
env.registerInit({
deps: {
config: coreServices.rootConfig,
logger: coreServices.logger,
discovery: coreServices.discovery,
scheduler: coreServices.scheduler,
auth: coreServices.auth,
indexRegistry: searchIndexRegistryExtensionPoint,
},
async init({
config,
logger,
discovery,
scheduler,
auth,
indexRegistry,
}) {
const defaultSchedule = {
frequency: { minutes: 10 },
timeout: { minutes: 15 },
initialDelay: { seconds: 3 },
};
const schedule = config.has('search.collators.explore.schedule')
? readSchedulerServiceTaskScheduleDefinitionFromConfig(
config.getConfig('search.collators.explore.schedule'),
)
: defaultSchedule;
indexRegistry.addCollator({
schedule: scheduler.createScheduledTaskRunner(schedule),
factory: ToolDocumentCollatorFactory.fromConfig(config, {
discovery,
logger,
auth,
}),
});
},
});
},
});

File diff suppressed because it is too large Load Diff

View File

View File

@ -0,0 +1,5 @@
---
'@backstage-community/plugin-github-actions': minor
---
Backstage version bump to v1.42.3

View File

@ -3,3 +3,4 @@ dist-types
coverage
.vscode
.eslintrc.js
.yarnrc.yml

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,4 @@
plugins:
- checksum: 8af7b3f2d7d19cacc7a3712f871efcb6208ba283a1f532260b0cba80c2cb66ed772b207b5ba41b8c5d64dd8d5e0c0e15bbb445bd14afac491712965211ba027c
path: .yarn/plugins/@yarnpkg/plugin-backstage.cjs
spec: "https://versions.backstage.io/v1/releases/1.42.3/yarn-plugin"

View File

@ -1,3 +1,3 @@
{
"version": "1.41.1"
"version": "1.42.3"
}

View File

@ -37,9 +37,9 @@
"directory": "workspaces/github-actions"
},
"devDependencies": {
"@backstage/cli": "^0.33.1",
"@backstage/e2e-test-utils": "^0.1.1",
"@backstage/repo-tools": "^0.15.0",
"@backstage/cli": "backstage:^",
"@backstage/e2e-test-utils": "backstage:^",
"@backstage/repo-tools": "backstage:^",
"@changesets/cli": "^2.27.1",
"knip": "^5.27.4",
"node-gyp": "^10.0.0",

View File

@ -20,26 +20,26 @@
},
"dependencies": {
"@backstage-community/plugin-github-actions": "workspace:^",
"@backstage/app-defaults": "^1.6.4",
"@backstage/catalog-model": "^1.7.5",
"@backstage/cli": "^0.33.1",
"@backstage/core-app-api": "^1.18.0",
"@backstage/core-compat-api": "^0.4.4",
"@backstage/core-components": "^0.17.4",
"@backstage/core-plugin-api": "^1.10.9",
"@backstage/frontend-app-api": "^0.11.4",
"@backstage/frontend-defaults": "^0.2.4",
"@backstage/frontend-plugin-api": "^0.10.4",
"@backstage/integration-react": "^1.2.9",
"@backstage/plugin-api-docs": "^0.12.9",
"@backstage/plugin-catalog": "^1.31.1",
"@backstage/plugin-catalog-common": "^1.1.5",
"@backstage/plugin-catalog-graph": "^0.4.21",
"@backstage/plugin-catalog-import": "^0.13.3",
"@backstage/plugin-catalog-react": "^1.19.1",
"@backstage/plugin-org": "^0.6.41",
"@backstage/plugin-user-settings": "^0.8.24",
"@backstage/theme": "^0.6.7",
"@backstage/app-defaults": "backstage:^",
"@backstage/catalog-model": "backstage:^",
"@backstage/cli": "backstage:^",
"@backstage/core-app-api": "backstage:^",
"@backstage/core-compat-api": "backstage:^",
"@backstage/core-components": "backstage:^",
"@backstage/core-plugin-api": "backstage:^",
"@backstage/frontend-app-api": "backstage:^",
"@backstage/frontend-defaults": "backstage:^",
"@backstage/frontend-plugin-api": "backstage:^",
"@backstage/integration-react": "backstage:^",
"@backstage/plugin-api-docs": "backstage:^",
"@backstage/plugin-catalog": "backstage:^",
"@backstage/plugin-catalog-common": "backstage:^",
"@backstage/plugin-catalog-graph": "backstage:^",
"@backstage/plugin-catalog-import": "backstage:^",
"@backstage/plugin-catalog-react": "backstage:^",
"@backstage/plugin-org": "backstage:^",
"@backstage/plugin-user-settings": "backstage:^",
"@backstage/theme": "backstage:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"history": "^5.0.0",
@ -51,7 +51,7 @@
"styled-components": "^6.1.8"
},
"devDependencies": {
"@backstage/test-utils": "^1.7.10",
"@backstage/test-utils": "backstage:^",
"@playwright/test": "^1.32.3",
"@testing-library/dom": "^9.0.0",
"@testing-library/jest-dom": "^6.0.0",

View File

@ -17,18 +17,11 @@ import { FlatRoutes } from '@backstage/core-app-api';
import { convertLegacyApp } from '@backstage/core-compat-api';
import { createApp } from '@backstage/frontend-defaults';
import {
configApiRef,
ApiBlueprint,
createApiFactory,
createFrontendModule,
PageBlueprint,
SignInPageBlueprint,
} from '@backstage/frontend-plugin-api';
import {
ScmAuth,
ScmIntegrationsApi,
scmIntegrationsApiRef,
} from '@backstage/integration-react';
import { ApiExplorerPage } from '@backstage/plugin-api-docs';
import catalogPlugin from '@backstage/plugin-catalog/alpha';
import catalogImportPlugin from '@backstage/plugin-catalog-import/alpha';
@ -49,7 +42,7 @@ const signInPage = SignInPageBlueprint.make({
const homePageExtension = PageBlueprint.make({
name: 'home',
params: {
defaultPath: '/',
path: '/',
loader: () => Promise.resolve(<Navigate to="catalog" />),
},
});
@ -60,24 +53,6 @@ const collectedLegacyPlugins = convertLegacyApp(
</FlatRoutes>,
);
const scmAuthApi = ApiBlueprint.make({
name: 'scm-auth',
params: {
factory: ScmAuth.createDefaultApiFactory(),
},
});
const scmIntegrationsApi = ApiBlueprint.make({
name: 'scm-integrations',
params: {
factory: createApiFactory({
api: scmIntegrationsApiRef,
deps: { configApi: configApiRef },
factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi),
}),
},
});
export const app = createApp({
features: [
catalogPlugin,
@ -87,13 +62,7 @@ export const app = createApp({
...collectedLegacyPlugins,
createFrontendModule({
pluginId: 'app',
extensions: [
signInPage,
homePageExtension,
scmAuthApi,
scmIntegrationsApi,
navigationExtension,
],
extensions: [signInPage, homePageExtension, navigationExtension],
}),
],
});

View File

@ -20,23 +20,23 @@
},
"dependencies": {
"@backstage-community/plugin-github-actions": "workspace:^",
"@backstage/app-defaults": "^1.6.4",
"@backstage/catalog-model": "^1.7.5",
"@backstage/cli": "^0.33.1",
"@backstage/core-app-api": "^1.18.0",
"@backstage/core-components": "^0.17.4",
"@backstage/core-plugin-api": "^1.10.9",
"@backstage/integration-react": "^1.2.9",
"@backstage/plugin-api-docs": "^0.12.9",
"@backstage/plugin-catalog": "^1.31.1",
"@backstage/plugin-catalog-common": "^1.1.5",
"@backstage/plugin-catalog-graph": "^0.4.21",
"@backstage/plugin-catalog-import": "^0.13.3",
"@backstage/plugin-catalog-react": "^1.19.1",
"@backstage/plugin-org": "^0.6.41",
"@backstage/plugin-permission-react": "^0.4.36",
"@backstage/plugin-user-settings": "^0.8.24",
"@backstage/theme": "^0.6.7",
"@backstage/app-defaults": "backstage:^",
"@backstage/catalog-model": "backstage:^",
"@backstage/cli": "backstage:^",
"@backstage/core-app-api": "backstage:^",
"@backstage/core-components": "backstage:^",
"@backstage/core-plugin-api": "backstage:^",
"@backstage/integration-react": "backstage:^",
"@backstage/plugin-api-docs": "backstage:^",
"@backstage/plugin-catalog": "backstage:^",
"@backstage/plugin-catalog-common": "backstage:^",
"@backstage/plugin-catalog-graph": "backstage:^",
"@backstage/plugin-catalog-import": "backstage:^",
"@backstage/plugin-catalog-react": "backstage:^",
"@backstage/plugin-org": "backstage:^",
"@backstage/plugin-permission-react": "backstage:^",
"@backstage/plugin-user-settings": "backstage:^",
"@backstage/theme": "backstage:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"history": "^5.0.0",
@ -47,7 +47,7 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/test-utils": "^1.7.10",
"@backstage/test-utils": "backstage:^",
"@playwright/test": "^1.32.3",
"@testing-library/dom": "^9.0.0",
"@testing-library/jest-dom": "^6.0.0",

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