Merge branch 'master' into feat/add-devtools-extension

Signed-off-by: secustor <sebastian@poxhofer.at>

# Conflicts:
#	yarn.lock
This commit is contained in:
secustor
2025-09-17 11:42:03 +02:00
961 changed files with 20530 additions and 4454 deletions
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/create-app': patch
---
Creates a plugin that redirects from the Home page to the Catalog index page to avoid seeing a not found page error when starting the app.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/ui': patch
---
Add missing class for flex: baseline
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-react': patch
---
Fix a potential race condition in EntityListProvider when selecting filters
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/cli': patch
---
Fixed the `new-frontend-plugin` template that was incorrectly passing `id` instead of `pluginId` to `createFrontendPlugin` and unnecessarily importing `React`.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend': patch
---
The 'get-catalog-entity' action now throws a ConflictError instead of generic Error if multiple entities are found, so MCP call doesn't fail with 500.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-org': patch
---
Fixing issue with extra slash in the routing
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/frontend-plugin-api': patch
---
Improved the types of `createFrontendPlugin` and `createFrontendModule` so that errors due to incompatible options are indicated more clearly.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/ui': patch
---
Fix Select component to properly attach aria-label and aria-labelledby props to the rendered element for improved accessibility.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-techdocs-backend': minor
---
Techdocs: support HumanDuration for cache TTL and timeout configuration
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/backend-test-utils': minor
---
The `mockServices.rootConfig()` instance now has an `update` method that can be used to test configuration subscriptions and updates.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Fixed module federation config by only setting `import: false` on shared libraries for remote.
-7
View File
@@ -1,7 +0,0 @@
---
'@backstage/plugin-mcp-actions-backend': patch
---
The MCP backend will now convert known Backstage errors into textual responses with `isError: true`.
The error message can be useful for an LLM to understand and maybe give back to the user.
Previously all errors where thrown out to `@modelcontextprotocol/sdk` which causes a generic 500.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-common': patch
---
Make SERVICEACCOUNT_CA_PATH public so it can be imported by external modules.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/integration': minor
---
Added support for limiting GithubAppCredentialsMux to specific apps
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-search-backend-module-explore': patch
---
Deprecate and mark explore collator as moved
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/cli': patch
---
Fixed an issue that could cause conflicts of detected modules in workspaces with multiple apps.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-scaffolder-backend-module-gitlab': patch
---
The log message now indicates that the pipeline trigger token was deleted and not pipeline itself.
-24
View File
@@ -1,24 +0,0 @@
---
'@backstage/catalog-client': minor
'@backstage/plugin-catalog-react': minor
'@backstage/plugin-catalog-node': minor
---
Introduced new `streamEntities` async generator method for the catalog.
Catalog API and Catalog Service now includes a `streamEntities` method that allows for streaming entities from the catalog.
This method is designed to handle large datasets efficiently by processing entities in a stream rather than loading them
all into memory at once. This is useful when you need to fetch a large number of entities but do not want to use pagination
or fetch all entities at once.
Example usage:
```ts
const pageStream = catalogClient.streamEntities({ pageSize: 100 }, { token });
for await (const page of pageStream) {
// Handle page of entities
for (const entity of page) {
console.log(entity);
}
}
```
+174 -199
View File
@@ -2,233 +2,208 @@
"mode": "pre",
"tag": "next",
"initialVersions": {
"example-app": "0.2.112",
"@backstage/app-defaults": "1.6.5",
"example-app-next": "0.0.26",
"app-next-example-plugin": "0.0.26",
"example-backend": "0.0.41",
"@backstage/backend-app-api": "1.2.6",
"@backstage/backend-defaults": "0.12.0",
"example-app": "0.2.113",
"@backstage/app-defaults": "1.7.0",
"example-app-next": "0.0.27",
"app-next-example-plugin": "0.0.27",
"example-backend": "0.0.42",
"@backstage/backend-app-api": "1.2.7",
"@backstage/backend-defaults": "0.12.1",
"@backstage/backend-dev-utils": "0.1.5",
"@backstage/backend-dynamic-feature-service": "0.7.3",
"@backstage/backend-openapi-utils": "0.6.0",
"@backstage/backend-plugin-api": "1.4.2",
"@backstage/backend-test-utils": "1.8.0",
"@backstage/catalog-client": "1.11.0",
"@backstage/backend-dynamic-feature-service": "0.7.4",
"@backstage/backend-openapi-utils": "0.6.1",
"@backstage/backend-plugin-api": "1.4.3",
"@backstage/backend-test-utils": "1.9.0",
"@backstage/catalog-client": "1.12.0",
"@backstage/catalog-model": "1.7.5",
"@backstage/cli": "0.34.0",
"@backstage/cli": "0.34.2",
"@backstage/cli-common": "0.1.15",
"@backstage/cli-node": "0.2.14",
"@backstage/codemods": "0.1.52",
"@backstage/config": "1.3.3",
"@backstage/config-loader": "1.10.2",
"@backstage/core-app-api": "1.18.0",
"@backstage/core-compat-api": "0.5.0",
"@backstage/core-components": "0.17.5",
"@backstage/core-plugin-api": "1.10.9",
"@backstage/create-app": "0.7.2",
"@backstage/dev-utils": "1.1.13",
"e2e-test": "0.2.31",
"@backstage/config-loader": "1.10.3",
"@backstage/core-app-api": "1.19.0",
"@backstage/core-compat-api": "0.5.2",
"@backstage/core-components": "0.18.0",
"@backstage/core-plugin-api": "1.11.0",
"@backstage/create-app": "0.7.4",
"@backstage/dev-utils": "1.1.14",
"e2e-test": "0.2.32",
"@backstage/e2e-test-utils": "0.1.1",
"@backstage/errors": "1.2.7",
"@backstage/eslint-plugin": "0.1.11",
"@backstage/frontend-app-api": "0.12.0",
"@backstage/frontend-defaults": "0.3.0",
"@backstage/frontend-dynamic-feature-loader": "0.1.4",
"@internal/frontend": "0.0.12",
"@backstage/frontend-plugin-api": "0.11.0",
"@backstage/frontend-test-utils": "0.3.5",
"@backstage/integration": "1.17.1",
"@backstage/frontend-app-api": "0.13.0",
"@backstage/frontend-defaults": "0.3.1",
"@backstage/frontend-dynamic-feature-loader": "0.1.5",
"@internal/frontend": "0.0.13",
"@backstage/frontend-plugin-api": "0.12.0",
"@backstage/frontend-test-utils": "0.3.6",
"@backstage/integration": "1.18.0",
"@backstage/integration-aws-node": "0.1.17",
"@backstage/integration-react": "1.2.9",
"@backstage/integration-react": "1.2.10",
"@internal/opaque": "0.0.1",
"@backstage/release-manifests": "0.0.13",
"@backstage/repo-tools": "0.15.1",
"@internal/scaffolder": "0.0.12",
"@techdocs/cli": "1.9.6",
"techdocs-cli-embedded-app": "0.2.111",
"@backstage/repo-tools": "0.15.2",
"@internal/scaffolder": "0.0.13",
"@techdocs/cli": "1.9.8",
"techdocs-cli-embedded-app": "0.2.112",
"@backstage/test-utils": "1.7.11",
"@backstage/theme": "0.6.8",
"@backstage/types": "1.2.1",
"@backstage/ui": "0.7.0",
"@backstage/types": "1.2.2",
"@backstage/ui": "0.7.1",
"@backstage/version-bridge": "1.0.11",
"yarn-plugin-backstage": "0.0.7",
"@backstage/plugin-api-docs": "0.12.10",
"@backstage/plugin-api-docs": "0.12.11",
"@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.10",
"@backstage/plugin-app": "0.2.0",
"@backstage/plugin-app-backend": "0.5.5",
"@backstage/plugin-app-node": "0.1.36",
"@backstage/plugin-app-visualizer": "0.1.22",
"@backstage/plugin-auth-backend": "0.25.3",
"@backstage/plugin-auth-backend-module-atlassian-provider": "0.4.6",
"@backstage/plugin-auth-backend-module-auth0-provider": "0.2.6",
"@backstage/plugin-auth-backend-module-aws-alb-provider": "0.4.6",
"@backstage/plugin-auth-backend-module-azure-easyauth-provider": "0.2.11",
"@backstage/plugin-auth-backend-module-bitbucket-provider": "0.3.6",
"@backstage/plugin-auth-backend-module-bitbucket-server-provider": "0.2.6",
"@backstage/plugin-auth-backend-module-cloudflare-access-provider": "0.4.6",
"@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.4.6",
"@backstage/plugin-auth-backend-module-github-provider": "0.3.6",
"@backstage/plugin-auth-backend-module-gitlab-provider": "0.3.6",
"@backstage/plugin-auth-backend-module-google-provider": "0.3.6",
"@backstage/plugin-auth-backend-module-guest-provider": "0.2.11",
"@backstage/plugin-auth-backend-module-microsoft-provider": "0.3.6",
"@backstage/plugin-auth-backend-module-oauth2-provider": "0.4.6",
"@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.2.11",
"@backstage/plugin-auth-backend-module-oidc-provider": "0.4.6",
"@backstage/plugin-auth-backend-module-okta-provider": "0.2.6",
"@backstage/plugin-auth-backend-module-onelogin-provider": "0.3.6",
"@backstage/plugin-auth-backend-module-pinniped-provider": "0.3.6",
"@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.5.6",
"@backstage/plugin-auth-node": "0.6.6",
"@backstage/plugin-auth-react": "0.1.18",
"@backstage/plugin-bitbucket-cloud-common": "0.3.1",
"@backstage/plugin-catalog": "1.31.2",
"@backstage/plugin-catalog-backend": "3.0.1",
"@backstage/plugin-catalog-backend-module-aws": "0.4.14",
"@backstage/plugin-catalog-backend-module-azure": "0.3.8",
"@backstage/plugin-catalog-backend-module-backstage-openapi": "0.5.5",
"@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.5.2",
"@backstage/plugin-catalog-backend-module-bitbucket-server": "0.5.2",
"@backstage/plugin-catalog-backend-module-gcp": "0.3.11",
"@backstage/plugin-catalog-backend-module-gerrit": "0.3.5",
"@backstage/plugin-catalog-backend-module-gitea": "0.1.3",
"@backstage/plugin-catalog-backend-module-github": "0.10.2",
"@backstage/plugin-catalog-backend-module-github-org": "0.3.13",
"@backstage/plugin-catalog-backend-module-gitlab": "0.7.2",
"@backstage/plugin-catalog-backend-module-gitlab-org": "0.2.12",
"@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.7.3",
"@backstage/plugin-catalog-backend-module-ldap": "0.11.8",
"@backstage/plugin-catalog-backend-module-logs": "0.1.13",
"@backstage/plugin-catalog-backend-module-msgraph": "0.7.3",
"@backstage/plugin-catalog-backend-module-openapi": "0.2.13",
"@backstage/plugin-catalog-backend-module-puppetdb": "0.2.13",
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.11",
"@backstage/plugin-catalog-backend-module-unprocessed": "0.6.3",
"@backstage/plugin-app": "0.3.0",
"@backstage/plugin-app-backend": "0.5.6",
"@backstage/plugin-app-node": "0.1.37",
"@backstage/plugin-app-visualizer": "0.1.23",
"@backstage/plugin-auth": "0.1.0",
"@backstage/plugin-auth-backend": "0.25.4",
"@backstage/plugin-auth-backend-module-atlassian-provider": "0.4.7",
"@backstage/plugin-auth-backend-module-auth0-provider": "0.2.7",
"@backstage/plugin-auth-backend-module-aws-alb-provider": "0.4.7",
"@backstage/plugin-auth-backend-module-azure-easyauth-provider": "0.2.12",
"@backstage/plugin-auth-backend-module-bitbucket-provider": "0.3.7",
"@backstage/plugin-auth-backend-module-bitbucket-server-provider": "0.2.7",
"@backstage/plugin-auth-backend-module-cloudflare-access-provider": "0.4.7",
"@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.4.7",
"@backstage/plugin-auth-backend-module-github-provider": "0.3.7",
"@backstage/plugin-auth-backend-module-gitlab-provider": "0.3.7",
"@backstage/plugin-auth-backend-module-google-provider": "0.3.7",
"@backstage/plugin-auth-backend-module-guest-provider": "0.2.12",
"@backstage/plugin-auth-backend-module-microsoft-provider": "0.3.7",
"@backstage/plugin-auth-backend-module-oauth2-provider": "0.4.7",
"@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.2.12",
"@backstage/plugin-auth-backend-module-oidc-provider": "0.4.7",
"@backstage/plugin-auth-backend-module-okta-provider": "0.2.7",
"@backstage/plugin-auth-backend-module-onelogin-provider": "0.3.7",
"@backstage/plugin-auth-backend-module-openshift-provider": "0.1.0",
"@backstage/plugin-auth-backend-module-pinniped-provider": "0.3.7",
"@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.5.7",
"@backstage/plugin-auth-node": "0.6.7",
"@backstage/plugin-auth-react": "0.1.19",
"@backstage/plugin-bitbucket-cloud-common": "0.3.2",
"@backstage/plugin-catalog": "1.31.3",
"@backstage/plugin-catalog-backend": "3.1.0",
"@backstage/plugin-catalog-backend-module-aws": "0.4.15",
"@backstage/plugin-catalog-backend-module-azure": "0.3.9",
"@backstage/plugin-catalog-backend-module-backstage-openapi": "0.5.6",
"@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.5.3",
"@backstage/plugin-catalog-backend-module-bitbucket-server": "0.5.3",
"@backstage/plugin-catalog-backend-module-gcp": "0.3.12",
"@backstage/plugin-catalog-backend-module-gerrit": "0.3.6",
"@backstage/plugin-catalog-backend-module-gitea": "0.1.4",
"@backstage/plugin-catalog-backend-module-github": "0.11.0",
"@backstage/plugin-catalog-backend-module-github-org": "0.3.14",
"@backstage/plugin-catalog-backend-module-gitlab": "0.7.3",
"@backstage/plugin-catalog-backend-module-gitlab-org": "0.2.13",
"@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.7.4",
"@backstage/plugin-catalog-backend-module-ldap": "0.11.9",
"@backstage/plugin-catalog-backend-module-logs": "0.1.14",
"@backstage/plugin-catalog-backend-module-msgraph": "0.8.0",
"@backstage/plugin-catalog-backend-module-openapi": "0.2.14",
"@backstage/plugin-catalog-backend-module-puppetdb": "0.2.14",
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.12",
"@backstage/plugin-catalog-backend-module-unprocessed": "0.6.4",
"@backstage/plugin-catalog-common": "1.1.5",
"@backstage/plugin-catalog-graph": "0.4.22",
"@backstage/plugin-catalog-import": "0.13.4",
"@backstage/plugin-catalog-node": "1.18.0",
"@backstage/plugin-catalog-react": "1.20.0",
"@backstage/plugin-catalog-unprocessed-entities": "0.2.20",
"@backstage/plugin-catalog-graph": "0.5.0",
"@backstage/plugin-catalog-import": "0.13.5",
"@backstage/plugin-catalog-node": "1.19.0",
"@backstage/plugin-catalog-react": "1.21.0",
"@backstage/plugin-catalog-unprocessed-entities": "0.2.21",
"@backstage/plugin-catalog-unprocessed-entities-common": "0.0.9",
"@backstage/plugin-config-schema": "0.1.71",
"@backstage/plugin-devtools": "0.1.30",
"@backstage/plugin-devtools-backend": "0.5.8",
"@backstage/plugin-config-schema": "0.1.72",
"@backstage/plugin-devtools": "0.1.31",
"@backstage/plugin-devtools-backend": "0.5.9",
"@backstage/plugin-devtools-common": "0.1.17",
"@backstage/plugin-events-backend": "0.5.5",
"@backstage/plugin-events-backend-module-aws-sqs": "0.4.14",
"@backstage/plugin-events-backend-module-azure": "0.2.23",
"@backstage/plugin-events-backend-module-bitbucket-cloud": "0.2.23",
"@backstage/plugin-events-backend-module-bitbucket-server": "0.1.4",
"@backstage/plugin-events-backend-module-gerrit": "0.2.23",
"@backstage/plugin-events-backend-module-github": "0.4.3",
"@backstage/plugin-events-backend-module-gitlab": "0.3.4",
"@backstage/plugin-events-backend-module-google-pubsub": "0.1.3",
"@backstage/plugin-events-backend-module-kafka": "0.1.2",
"@backstage/plugin-events-backend-test-utils": "0.1.47",
"@backstage/plugin-events-node": "0.4.14",
"@internal/plugin-todo-list": "1.0.42",
"@internal/plugin-todo-list-backend": "1.0.42",
"@backstage/plugin-events-backend": "0.5.6",
"@backstage/plugin-events-backend-module-aws-sqs": "0.4.15",
"@backstage/plugin-events-backend-module-azure": "0.2.24",
"@backstage/plugin-events-backend-module-bitbucket-cloud": "0.2.24",
"@backstage/plugin-events-backend-module-bitbucket-server": "0.1.5",
"@backstage/plugin-events-backend-module-gerrit": "0.2.24",
"@backstage/plugin-events-backend-module-github": "0.4.4",
"@backstage/plugin-events-backend-module-gitlab": "0.3.5",
"@backstage/plugin-events-backend-module-google-pubsub": "0.1.4",
"@backstage/plugin-events-backend-module-kafka": "0.1.3",
"@backstage/plugin-events-backend-test-utils": "0.1.48",
"@backstage/plugin-events-node": "0.4.15",
"@internal/plugin-todo-list": "1.0.43",
"@internal/plugin-todo-list-backend": "1.0.43",
"@internal/plugin-todo-list-common": "1.0.26",
"@backstage/plugin-gateway-backend": "1.0.4",
"@backstage/plugin-home": "0.8.11",
"@backstage/plugin-home-react": "0.1.29",
"@backstage/plugin-kubernetes": "0.12.10",
"@backstage/plugin-kubernetes-backend": "0.20.0",
"@backstage/plugin-kubernetes-cluster": "0.0.28",
"@backstage/plugin-gateway-backend": "1.0.5",
"@backstage/plugin-home": "0.8.12",
"@backstage/plugin-home-react": "0.1.30",
"@backstage/plugin-kubernetes": "0.12.11",
"@backstage/plugin-kubernetes-backend": "0.20.2",
"@backstage/plugin-kubernetes-cluster": "0.0.29",
"@backstage/plugin-kubernetes-common": "0.9.6",
"@backstage/plugin-kubernetes-node": "0.3.3",
"@backstage/plugin-kubernetes-react": "0.5.10",
"@backstage/plugin-mcp-actions-backend": "0.1.2",
"@backstage/plugin-notifications": "0.5.8",
"@backstage/plugin-notifications-backend": "0.5.9",
"@backstage/plugin-notifications-backend-module-email": "0.3.12",
"@backstage/plugin-notifications-backend-module-slack": "0.1.4",
"@backstage/plugin-kubernetes-node": "0.3.4",
"@backstage/plugin-kubernetes-react": "0.5.11",
"@backstage/plugin-mcp-actions-backend": "0.1.3",
"@backstage/plugin-notifications": "0.5.9",
"@backstage/plugin-notifications-backend": "0.5.10",
"@backstage/plugin-notifications-backend-module-email": "0.3.13",
"@backstage/plugin-notifications-backend-module-slack": "0.1.5",
"@backstage/plugin-notifications-common": "0.1.0",
"@backstage/plugin-notifications-node": "0.2.18",
"@backstage/plugin-org": "0.6.42",
"@backstage/plugin-org-react": "0.1.41",
"@backstage/plugin-permission-backend": "0.7.3",
"@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.11",
"@backstage/plugin-notifications-node": "0.2.19",
"@backstage/plugin-org": "0.6.44",
"@backstage/plugin-org-react": "0.1.42",
"@backstage/plugin-permission-backend": "0.7.4",
"@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.12",
"@backstage/plugin-permission-common": "0.9.1",
"@backstage/plugin-permission-node": "0.10.3",
"@backstage/plugin-permission-node": "0.10.4",
"@backstage/plugin-permission-react": "0.4.36",
"@backstage/plugin-proxy-backend": "0.6.5",
"@backstage/plugin-proxy-node": "0.1.7",
"@backstage/plugin-scaffolder": "1.34.0",
"@backstage/plugin-scaffolder-backend": "2.2.0",
"@backstage/plugin-scaffolder-backend-module-azure": "0.2.12",
"@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.13",
"@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.2.12",
"@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.12",
"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.3.12",
"@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.3.14",
"@backstage/plugin-scaffolder-backend-module-gcp": "0.2.12",
"@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.12",
"@backstage/plugin-scaffolder-backend-module-gitea": "0.2.12",
"@backstage/plugin-scaffolder-backend-module-github": "0.8.2",
"@backstage/plugin-scaffolder-backend-module-gitlab": "0.9.4",
"@backstage/plugin-scaffolder-backend-module-notifications": "0.1.13",
"@backstage/plugin-scaffolder-backend-module-rails": "0.5.12",
"@backstage/plugin-scaffolder-backend-module-sentry": "0.2.12",
"@backstage/plugin-scaffolder-backend-module-yeoman": "0.4.13",
"@backstage/plugin-scaffolder-common": "1.7.0",
"@backstage/plugin-scaffolder-node": "0.11.0",
"@backstage/plugin-scaffolder-node-test-utils": "0.3.2",
"@backstage/plugin-scaffolder-react": "1.19.0",
"@backstage/plugin-search": "1.4.29",
"@backstage/plugin-search-backend": "2.0.5",
"@backstage/plugin-search-backend-module-catalog": "0.3.7",
"@backstage/plugin-search-backend-module-elasticsearch": "1.7.5",
"@backstage/plugin-search-backend-module-explore": "0.3.5",
"@backstage/plugin-search-backend-module-pg": "0.5.47",
"@backstage/plugin-search-backend-module-stack-overflow-collator": "0.3.12",
"@backstage/plugin-search-backend-module-techdocs": "0.4.5",
"@backstage/plugin-search-backend-node": "1.3.14",
"@backstage/plugin-proxy-backend": "0.6.6",
"@backstage/plugin-proxy-node": "0.1.8",
"@backstage/plugin-scaffolder": "1.34.1",
"@backstage/plugin-scaffolder-backend": "2.2.1",
"@backstage/plugin-scaffolder-backend-module-azure": "0.2.13",
"@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.14",
"@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.2.13",
"@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.13",
"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.3.13",
"@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.3.15",
"@backstage/plugin-scaffolder-backend-module-gcp": "0.2.13",
"@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.13",
"@backstage/plugin-scaffolder-backend-module-gitea": "0.2.13",
"@backstage/plugin-scaffolder-backend-module-github": "0.9.0",
"@backstage/plugin-scaffolder-backend-module-gitlab": "0.9.5",
"@backstage/plugin-scaffolder-backend-module-notifications": "0.1.14",
"@backstage/plugin-scaffolder-backend-module-rails": "0.5.13",
"@backstage/plugin-scaffolder-backend-module-sentry": "0.2.13",
"@backstage/plugin-scaffolder-backend-module-yeoman": "0.4.14",
"@backstage/plugin-scaffolder-common": "1.7.1",
"@backstage/plugin-scaffolder-node": "0.11.1",
"@backstage/plugin-scaffolder-node-test-utils": "0.3.3",
"@backstage/plugin-scaffolder-react": "1.19.1",
"@backstage/plugin-search": "1.4.30",
"@backstage/plugin-search-backend": "2.0.6",
"@backstage/plugin-search-backend-module-catalog": "0.3.8",
"@backstage/plugin-search-backend-module-elasticsearch": "1.7.6",
"@backstage/plugin-search-backend-module-explore": "0.3.7",
"@backstage/plugin-search-backend-module-pg": "0.5.48",
"@backstage/plugin-search-backend-module-stack-overflow-collator": "0.3.13",
"@backstage/plugin-search-backend-module-techdocs": "0.4.6",
"@backstage/plugin-search-backend-node": "1.3.15",
"@backstage/plugin-search-common": "1.2.19",
"@backstage/plugin-search-react": "1.9.3",
"@backstage/plugin-signals": "0.0.22",
"@backstage/plugin-signals-backend": "0.3.7",
"@backstage/plugin-signals-node": "0.1.23",
"@backstage/plugin-search-react": "1.9.4",
"@backstage/plugin-signals": "0.0.23",
"@backstage/plugin-signals-backend": "0.3.8",
"@backstage/plugin-signals-node": "0.1.24",
"@backstage/plugin-signals-react": "0.0.15",
"@backstage/plugin-techdocs": "1.14.0",
"@backstage/plugin-techdocs-addons-test-utils": "1.0.52",
"@backstage/plugin-techdocs-backend": "2.0.5",
"@backstage/plugin-techdocs": "1.15.0",
"@backstage/plugin-techdocs-addons-test-utils": "1.1.0",
"@backstage/plugin-techdocs-backend": "2.1.0",
"@backstage/plugin-techdocs-common": "0.1.1",
"@backstage/plugin-techdocs-module-addons-contrib": "1.1.27",
"@backstage/plugin-techdocs-node": "1.13.6",
"@backstage/plugin-techdocs-react": "1.3.2",
"@backstage/plugin-user-settings": "0.8.25",
"@backstage/plugin-user-settings-backend": "0.3.5",
"@backstage/plugin-techdocs-module-addons-contrib": "1.1.28",
"@backstage/plugin-techdocs-node": "1.13.7",
"@backstage/plugin-techdocs-react": "1.3.3",
"@backstage/plugin-user-settings": "0.8.26",
"@backstage/plugin-user-settings-backend": "0.3.6",
"@backstage/plugin-user-settings-common": "0.0.1"
},
"changesets": [
"brave-bugs-know",
"cold-donuts-train",
"cool-games-rescue",
"curvy-sites-rhyme",
"easy-wings-turn",
"fine-hands-think",
"flat-colts-know",
"giant-zebras-peel",
"icy-camels-throw",
"legal-lemons-attend",
"lemon-terms-cheer",
"lucky-glasses-slide",
"mean-sites-cheer",
"puny-books-fetch",
"ripe-plants-pump",
"sharp-carrots-spend",
"sixty-pans-prove",
"sixty-places-push",
"slick-lamps-clap",
"slick-worms-drum",
"social-beers-unite",
"sweet-lemons-wonder",
"tricky-buses-lead",
"wet-kiwis-strive",
"whole-dingos-lay",
"yellow-dragons-float"
]
"changesets": []
}
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/cli': patch
---
Updated the backend plugin template to use a new pattern for the `TodoListService` that reduces boilerplate.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Fix issue with default objects not being loaded properly
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend-module-github': minor
---
Added support for discovery by app
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-techdocs': patch
---
Reverts a change in CSS layout that shifted the content of the Techdocs too far to the left.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/core-compat-api': patch
---
Fix for `compatWrapper` creating many wrapping `Providers` when they should not
-11
View File
@@ -1,11 +0,0 @@
---
'@backstage/plugin-catalog-backend-module-msgraph': minor
---
**BREAKING**: Encode query filters for requests made to msgraph. If you currently have manually encoded characters in a filter, this is a breaking change and must be updated to avoid requests being double encoded.
```diff
user:
- filter: department in('MARKETING', 'RESEARCH %26 DEVELOPMENT')
+ filter: department in('MARKETING', 'RESEARCH & DEVELOPMENT')
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/core-components': patch
---
Fixes for rendering initials in the avatar component.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/create-app': patch
---
Add missing dependency to `@backstage/cli`, `@backstage/core-plugin-api` and `@backstage/integration-react`
-5
View File
@@ -1,5 +0,0 @@
---
'@techdocs/cli': patch
---
Fixed an issue where `@techdocs/cli serve` command did not pick up the latest changes to TechDocs.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog': patch
---
Auto-focus the first menu item in `EntityContextMenu`, and do not render a divider if an empty array is passed to `UNSTABLE_extraContextMenuItems`.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-auth-node': patch
---
Changes OAuth cookies from domain-scoped to host-only by avoid setting the domain attribute in the default cookie configurer.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend': patch
---
Only run provider orphan cleanup if the engine is started in the first place
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-react': patch
---
Support `default*` for older packages as this package is in range for breaking `/alpha` changes
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/core-components': patch
---
update about card links style for pretty display with other language
@@ -38,6 +38,7 @@ Bitrise
Blackbox
bool
boolean
breakpoint
Brex
broadcasted
bugfixes
@@ -146,6 +147,7 @@ Expedia
facto
failover
Fargate
faqs
featureful
Figma
firehydrant
@@ -247,6 +249,8 @@ lockdown
lockfile
lockfiles
lookbehind
lookup
lookups
lowercased
lunr
Luxon
@@ -460,6 +464,7 @@ subfolders
subheader
subheaders
subkey
subpage
subpath
subroutes
substring
@@ -1,11 +1,11 @@
# NO-OP placeholder that always passes for other paths
# This is here so that we're able to set the status check as required
name: Storybook Void
name: Chromatic Void
on:
pull_request:
paths-ignore:
- '.github/workflows/verify_storybook.yml'
- '.github/workflows/verify_chromatic.yml'
- 'storybook/**'
- 'packages/config/src/**'
- 'packages/theme/src/**'
@@ -25,7 +25,7 @@ jobs:
noop:
runs-on: ubuntu-latest
name: Storybook
name: Chromatic
steps:
- name: Harden Runner
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
@@ -1,9 +1,9 @@
name: Storybook
name: Chromatic
on:
# NOTE: If you change these you must update verify_storybook-noop.yml as well
pull_request:
paths:
- '.github/workflows/verify_storybook.yml'
- '.github/workflows/verify_chromatic.yml'
- '.storybook/**'
- 'packages/ui/src/**'
- 'packages/config/src/**'
@@ -26,7 +26,7 @@ jobs:
os: [ubuntu-latest]
node-version: [20.x]
name: Storybook
name: Chromatic
steps:
- name: Harden Runner
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
@@ -50,13 +50,14 @@ jobs:
cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }}
- name: Build Storybook
run: yarn build-storybook
run: yarn build-storybook:chromatic
- name: Deploy Storybook to Chromatic
uses: chromaui/action@1cfa065cbdab28f6ca3afaeb3d761383076a35aa # v11
- name: Run Chromatic
uses: chromaui/action@latest
with:
token: ${{ secrets.GITHUB_TOKEN }}
# projectToken intentionally shared to allow collaborators to run Chromatic on forks
# https://www.chromatic.com/docs/custom-ci-provider#run-chromatic-on-external-forks-of-open-source-projects
projectToken: chpt_dab72dc0f97d55b
storybookBuildDir: dist-storybook
onlyChanged: true
+93 -15
View File
@@ -2,17 +2,21 @@ import type { StorybookConfig } from '@storybook/react-vite';
import { join, dirname, posix } from 'path';
// This set of stories are the ones that we publish to backstage.io.
const backstageCoreStories = [
'packages/ui',
'packages/core-components',
'packages/app',
'plugins/org',
'plugins/search',
'plugins/search-react',
'plugins/home',
'plugins/catalog-react',
];
const isChromatic = process.env.STORYBOOK_STORY_SET === 'chromatic';
// All stories for full development
const allStories = isChromatic
? ['packages/ui']
: [
'packages/ui',
'packages/core-components',
'packages/app',
'plugins/org',
'plugins/search',
'plugins/search-react',
'plugins/home',
'plugins/catalog-react',
];
const rootPath = '../';
const storiesSrcMdx = 'src/**/*.mdx';
@@ -21,7 +25,7 @@ const storiesSrcGlob = 'src/**/*.stories.@(js|jsx|mjs|ts|tsx)';
const getStoriesPath = (element: string, pattern: string) =>
posix.join(rootPath, element, pattern);
const stories = backstageCoreStories.flatMap(element => [
const stories = allStories.flatMap(element => [
getStoriesPath(element, storiesSrcMdx),
getStoriesPath(element, storiesSrcGlob),
]);
@@ -35,15 +39,89 @@ const config: StorybookConfig = {
stories,
addons: [
getAbsolutePath('@storybook/addon-links'),
getAbsolutePath('@storybook/addon-essentials'),
getAbsolutePath('@storybook/addon-interactions'),
getAbsolutePath('@storybook/addon-themes'),
getAbsolutePath('@storybook/addon-storysource'),
getAbsolutePath('@storybook/addon-docs'),
getAbsolutePath('@storybook/addon-a11y'),
],
framework: {
name: getAbsolutePath('@storybook/react-vite'),
options: {},
},
viteFinal: async (config, { configType }) => {
// Add Node.js polyfills for browser compatibility
//
// When upgrading from Storybook 8 to 9 with the react-vite framework,
// Node.js polyfills are no longer automatically included by Vite.
// This causes "ReferenceError: process is not defined" errors in the browser
// when code tries to access Node.js globals like `process` and `util`.
//
// The @vitest/mocker (included with Storybook 9) expects MSW v2 APIs,
// but we want to keep MSW v1 for the rest of the monorepo to avoid
// breaking changes. This configuration provides the necessary polyfills
// and handles the MSW compatibility issue specifically for Storybook.
//
// These polyfills provide browser-compatible versions of Node.js globals:
// - process: Node.js process object with env
// - global -> globalThis: Maps Node.js global to browser's globalThis
//
// Without these, Backstage components that rely on Node.js APIs will fail
// to load in Storybook's browser environment.
// Different configurations for development vs production
if (configType === 'DEVELOPMENT') {
// Development: Include process polyfill to prevent runtime errors
config.define = {
...config.define,
global: 'globalThis',
'process.env': {},
process: '({ env: {}, browser: true })',
};
} else if (configType === 'PRODUCTION') {
// Production: Minimal define to avoid esbuild errors
config.define = {
...config.define,
global: 'globalThis',
'process.env': {},
// No process polyfill in production build
};
}
config.resolve = {
...config.resolve,
alias: {
...config.resolve?.alias,
// Provide Node.js polyfills for browser
process: 'process/browser',
util: 'util',
buffer: 'buffer',
stream: 'stream-browserify',
// Fix MSW v2 imports for @vitest/mocker compatibility
// @vitest/mocker expects MSW v2 APIs but we want to keep MSW v1 for the rest of the monorepo
'msw/browser': join(__dirname, 'msw-browser-shim.js'),
'msw/core/http': join(__dirname, 'msw-http-shim.js'),
},
};
// Optimize dependencies for better performance
config.optimizeDeps = {
...config.optimizeDeps,
include: [
...(config.optimizeDeps?.include || []),
'process/browser',
'util',
'buffer',
'stream-browserify',
],
// Exclude MSW to prevent optimization conflicts with our shims
exclude: [
...(config.optimizeDeps?.exclude || []),
'msw',
'msw/browser',
'msw/core/http',
],
};
return config;
},
};
export default config;
+18
View File
@@ -0,0 +1,18 @@
export const allModes = {
'light backstage': {
themeMode: 'light',
themeName: 'backstage',
},
'dark backstage': {
themeMode: 'dark',
themeName: 'backstage',
},
'light spotify': {
themeMode: 'light',
themeName: 'spotify',
},
'dark spotify': {
themeMode: 'dark',
themeName: 'spotify',
},
} as const;
+47
View File
@@ -0,0 +1,47 @@
// MSW v2 browser compatibility shim for @vitest/mocker
// This provides MSW v2 exports using MSW v1 APIs to maintain compatibility
// while keeping the rest of the monorepo on MSW v1
try {
// Try to import from MSW v1
const { setupWorker, rest } = require('msw');
// Export in MSW v2 format expected by @vitest/mocker
module.exports = {
setupWorker,
// MSW v2 uses 'http' instead of 'rest', but we provide both for compatibility
http: rest,
rest, // Keep rest for any MSW v1 code
};
} catch (error) {
// Fallback if MSW is not available - provide minimal mock
console.warn(
'MSW not available, providing minimal mock for @vitest/mocker compatibility',
);
module.exports = {
setupWorker: () => ({
start: () => Promise.resolve(),
stop: () => {},
use: () => {},
resetHandlers: () => {},
}),
http: {
get: () => {},
post: () => {},
put: () => {},
delete: () => {},
patch: () => {},
head: () => {},
options: () => {},
},
rest: {
get: () => {},
post: () => {},
put: () => {},
delete: () => {},
patch: () => {},
head: () => {},
options: () => {},
},
};
}
+47
View File
@@ -0,0 +1,47 @@
// MSW v2 http compatibility shim for @vitest/mocker
// This provides MSW v2 http exports using MSW v1 APIs
try {
// Try to import from MSW v1
const { rest } = require('msw');
// Export MSW v1 'rest' as MSW v2 'http' for @vitest/mocker compatibility
module.exports = {
http: rest,
// Provide individual methods that @vitest/mocker might expect
get: rest.get,
post: rest.post,
put: rest.put,
delete: rest.delete,
patch: rest.patch,
head: rest.head,
options: rest.options,
all: rest.all,
};
} catch (error) {
// Fallback if MSW is not available
console.warn(
'MSW not available, providing minimal http mock for @vitest/mocker compatibility',
);
const noop = () => {};
module.exports = {
http: {
get: noop,
post: noop,
put: noop,
delete: noop,
patch: noop,
head: noop,
options: noop,
all: noop,
},
get: noop,
post: noop,
put: noop,
delete: noop,
patch: noop,
head: noop,
options: noop,
all: noop,
};
}
+21 -2
View File
@@ -2,9 +2,10 @@ import React, { useEffect } from 'react';
import { TestApiProvider } from '@backstage/test-utils';
import { Content, AlertDisplay } from '@backstage/core-components';
import { apis } from './support/apis';
import type { Decorator, Preview } from '@storybook/react';
import { useGlobals } from '@storybook/preview-api';
import type { Decorator, Preview } from '@storybook/react-vite';
import { useGlobals } from 'storybook/preview-api';
import { UnifiedThemeProvider, themes } from '@backstage/theme';
import { allModes } from './modes';
// Default Backstage theme CSS (from packages/ui)
import '../packages/ui/src/css/styles.css';
@@ -52,20 +53,24 @@ const preview: Preview = {
},
parameters: {
layout: 'fullscreen',
backgrounds: {
disable: true,
},
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
options: {
storySort: {
order: ['Backstage UI', 'Plugins', 'Layout', 'Navigation'],
},
},
viewport: {
viewports: {
initial: {
@@ -82,6 +87,20 @@ const preview: Preview = {
},
},
},
docs: {
codePanel: true,
},
chromatic: {
modes: {
'light backstage': allModes['light backstage'],
// TODO: Enable these modes when we have more Chromatic snapshots.
// 'dark backstage': allModes['dark backstage'],
// 'light spotify': allModes['light spotify'],
// 'dark spotify': allModes['dark spotify'],
},
},
},
decorators: [
Story => {
@@ -0,0 +1,35 @@
diff --git a/dist/preview.d.ts b/dist/preview.d.ts
index 73525b5fe07240d27733b59362cf2076cd28a6ed..0420e6b170a65b6d0db64fcfcfa07b68cd851942 100644
--- a/dist/preview.d.ts
+++ b/dist/preview.d.ts
@@ -174,7 +174,7 @@ type UnionToIntersection<Union> = (
declare function __definePreview<Addons extends PreviewAddon<never>[]>(input: {
addons: Addons;
} & ProjectAnnotations<ReactTypes & InferTypes<Addons>>): ReactPreview<ReactTypes & InferTypes<Addons>>;
-interface ReactPreview<T extends AddonTypes> extends Preview<ReactTypes & T> {
+interface ReactPreview<T extends AddonTypes = any> extends Omit<Preview<ReactTypes & T>, 'meta'> {
meta<TArgs extends Args, Decorators extends DecoratorFunction<ReactTypes & T, any>, TMetaArgs extends Partial<TArgs>>(meta: {
render?: ArgsStoryFn<ReactTypes & T, TArgs>;
component?: ComponentType<TArgs>;
@@ -187,16 +187,13 @@ interface ReactPreview<T extends AddonTypes> extends Preview<ReactTypes & T> {
}>;
}
type DecoratorsArgs<TRenderer extends Renderer, Decorators> = UnionToIntersection<Decorators extends DecoratorFunction<TRenderer, infer TArgs> ? TArgs : unknown>;
-interface ReactMeta<T extends ReactTypes, MetaInput extends ComponentAnnotations<T>> extends Meta<T, MetaInput> {
+interface ReactMeta<T extends ReactTypes = any, MetaInput = any> extends Omit<Meta<T, ComponentAnnotations<T, any>>, 'story'> {
story<TInput extends (() => ReactTypes['storyResult']) | (StoryAnnotations<T, T['args']> & {
render: () => ReactTypes['storyResult'];
- })>(story?: TInput): ReactStory<T, TInput extends () => ReactTypes['storyResult'] ? {
- render: TInput;
- } : TInput>;
- story<TInput extends Simplify<StoryAnnotations<T, AddMocks<T['args'], MetaInput['args']>, SetOptional<T['args'], keyof T['args'] & keyof MetaInput['args']>>>>(story?: TInput): ReactStory<T, TInput>;
+ })>(story?: TInput): ReactStory<T>;
+ story<TInput = any>(story?: TInput): ReactStory<T>;
}
-interface ReactStory<T extends ReactTypes, TInput extends StoryAnnotations<T, T['args']>> extends Story<T, TInput> {
+interface ReactStory<T extends ReactTypes> {
Component: ComponentType<Partial<T['args']>>;
}
-
export { ReactPreview, ReactStory, __definePreview };
\ No newline at end of file
@@ -0,0 +1,15 @@
diff --git a/lib/main.d.ts b/lib/main.d.ts
index 9b54fef0086ea0c99368d8a95f2476e5dcd6d9c1..5c3853901e522c445cdb23b07538aad8a15bafb0 100644
--- a/lib/main.d.ts
+++ b/lib/main.d.ts
@@ -1,7 +1,7 @@
-import { ASTNode, Type, AnyType, Field } from "./types";
-import { NodePath } from "./node-path";
+import { ASTNode, type Type, AnyType, Field } from "./types";
+import { type NodePath } from "./node-path";
import { namedTypes } from "./gen/namedTypes";
-import { builders } from "./gen/builders";
+import { type builders } from "./gen/builders";
import { Visitor } from "./gen/visitor";
declare const astNodesAreEquivalent: {
(a: any, b: any, problemPath?: any): boolean;
+5
View File
@@ -209,6 +209,11 @@ scaffolder:
defaultCommitMessage: 'Initial commit'
auth:
experimentalDynamicClientRegistration:
enabled: true
allowedRedirectUriPatterns:
- cursor://*
### Add auth.keyStore.provider to more granularly control how to store JWK data when running
# the auth-backend.
#
+1 -1
View File
@@ -28,7 +28,7 @@
"@uiw/react-codemirror": "^4.23.7",
"html-react-parser": "^5.2.5",
"motion": "^12.4.1",
"next": "15.3.4",
"next": "15.4.7",
"next-mdx-remote-client": "^2.1.2",
"prop-types": "^15.8.1",
"react": "19.1.1",
+16 -22
View File
@@ -217,18 +217,18 @@ export const cellPropDefs: Record<string, PropDef> = {
};
export const tablePaginationPropDefs: Record<string, PropDef> = {
pageIndex: {
offset: {
type: 'number',
description: 'The current page index.',
description: 'The current offset (starting index) for pagination.',
},
pageSize: {
type: 'number',
description: 'The number of items per page.',
},
setPageIndex: {
setOffset: {
type: 'enum',
values: ['(pageIndex: number) => void'],
description: 'Handler that is called when the page index changes.',
values: ['(offset: number) => void'],
description: 'Handler that is called when the offset changes.',
},
setPageSize: {
type: 'enum',
@@ -277,10 +277,7 @@ export const tableUsageSnippet = `import { Cell, ..., TableHeader, TablePaginati
</Table>
<TablePagination />`;
export const tableBasicSnippet = `import { Table, TablePagination } from '@backstage/ui';
const [pageIndex, setPageIndex] = useState(0);
const [pageSize, setPageSize] = useState(5);
export const tableBasicSnippet = `import { Table, TableHeader, Column, TableBody, Row, Cell, CellProfile, TablePagination, useTable } from '@backstage/ui';
const data = [
{
@@ -293,10 +290,13 @@ const data = [
// ... more data
];
const newData = data4.slice(
pageIndex * pageSize,
(pageIndex + 1) * pageSize,
);
// Uncontrolled pagination (easiest)
const { data: paginatedData, paginationProps } = useTable({
data,
pagination: {
defaultPageSize: 5,
},
});
<Table>
<TableHeader>
@@ -306,9 +306,9 @@ const newData = data4.slice(
<Column>Albums</Column>
</TableHeader>
<TableBody>
{newData.map(item => (
{paginatedData?.map(item => (
<Row key={item.name}>
<CellProfileBUI
<CellProfile
name={item.name}
src={item.image}
href={item.website}
@@ -320,10 +320,4 @@ const newData = data4.slice(
))}
</TableBody>
</Table>
<TablePagination
pageIndex={pageIndex}
pageSize={pageSize}
rowCount={data4.length}
setPageIndex={setPageIndex}
setPageSize={setPageSize}
/>`;
<TablePagination {...paginationProps} />`;
+45 -70
View File
@@ -774,10 +774,10 @@ __metadata:
languageName: node
linkType: hard
"@next/env@npm:15.3.4":
version: 15.3.4
resolution: "@next/env@npm:15.3.4"
checksum: 10/40ea0bee2eca72dce6102d30ac50029309bf68a281585270e38f920ae47043f240352ad250058d462169a436dea3d8f78a935406ee61088bd4a614524b4a315b
"@next/env@npm:15.4.7":
version: 15.4.7
resolution: "@next/env@npm:15.4.7"
checksum: 10/8341fa6f1b5aebb6f99d8abad2f3ee2685281aaa51785f8ceff3c9a7f03186645f372003ee833715c0ce05e4e7d960defa4252018977f19564001b872b24714e
languageName: node
linkType: hard
@@ -807,58 +807,58 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-darwin-arm64@npm:15.3.4":
version: 15.3.4
resolution: "@next/swc-darwin-arm64@npm:15.3.4"
"@next/swc-darwin-arm64@npm:15.4.7":
version: 15.4.7
resolution: "@next/swc-darwin-arm64@npm:15.4.7"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@next/swc-darwin-x64@npm:15.3.4":
version: 15.3.4
resolution: "@next/swc-darwin-x64@npm:15.3.4"
"@next/swc-darwin-x64@npm:15.4.7":
version: 15.4.7
resolution: "@next/swc-darwin-x64@npm:15.4.7"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@next/swc-linux-arm64-gnu@npm:15.3.4":
version: 15.3.4
resolution: "@next/swc-linux-arm64-gnu@npm:15.3.4"
"@next/swc-linux-arm64-gnu@npm:15.4.7":
version: 15.4.7
resolution: "@next/swc-linux-arm64-gnu@npm:15.4.7"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@next/swc-linux-arm64-musl@npm:15.3.4":
version: 15.3.4
resolution: "@next/swc-linux-arm64-musl@npm:15.3.4"
"@next/swc-linux-arm64-musl@npm:15.4.7":
version: 15.4.7
resolution: "@next/swc-linux-arm64-musl@npm:15.4.7"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@next/swc-linux-x64-gnu@npm:15.3.4":
version: 15.3.4
resolution: "@next/swc-linux-x64-gnu@npm:15.3.4"
"@next/swc-linux-x64-gnu@npm:15.4.7":
version: 15.4.7
resolution: "@next/swc-linux-x64-gnu@npm:15.4.7"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@next/swc-linux-x64-musl@npm:15.3.4":
version: 15.3.4
resolution: "@next/swc-linux-x64-musl@npm:15.3.4"
"@next/swc-linux-x64-musl@npm:15.4.7":
version: 15.4.7
resolution: "@next/swc-linux-x64-musl@npm:15.4.7"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@next/swc-win32-arm64-msvc@npm:15.3.4":
version: 15.3.4
resolution: "@next/swc-win32-arm64-msvc@npm:15.3.4"
"@next/swc-win32-arm64-msvc@npm:15.4.7":
version: 15.4.7
resolution: "@next/swc-win32-arm64-msvc@npm:15.4.7"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@next/swc-win32-x64-msvc@npm:15.3.4":
version: 15.3.4
resolution: "@next/swc-win32-x64-msvc@npm:15.3.4"
"@next/swc-win32-x64-msvc@npm:15.4.7":
version: 15.4.7
resolution: "@next/swc-win32-x64-msvc@npm:15.4.7"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
@@ -1122,13 +1122,6 @@ __metadata:
languageName: node
linkType: hard
"@swc/counter@npm:0.1.3":
version: 0.1.3
resolution: "@swc/counter@npm:0.1.3"
checksum: 10/df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598
languageName: node
linkType: hard
"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
@@ -1916,15 +1909,6 @@ __metadata:
languageName: node
linkType: hard
"busboy@npm:1.6.0":
version: 1.6.0
resolution: "busboy@npm:1.6.0"
dependencies:
streamsearch: "npm:^1.1.0"
checksum: 10/bee10fa10ea58e7e3e7489ffe4bda6eacd540a17de9f9cd21cc37e297b2dd9fe52b2715a5841afaec82900750d810d01d7edb4b2d456427f449b92b417579763
languageName: node
linkType: hard
"cacache@npm:^19.0.1":
version: 19.0.1
resolution: "cacache@npm:19.0.1"
@@ -2360,7 +2344,7 @@ __metadata:
html-react-parser: "npm:^5.2.5"
lightningcss: "npm:^1.28.2"
motion: "npm:^12.4.1"
next: "npm:15.3.4"
next: "npm:15.4.7"
next-mdx-remote-client: "npm:^2.1.2"
prop-types: "npm:^15.8.1"
react: "npm:19.1.1"
@@ -5179,29 +5163,27 @@ __metadata:
languageName: node
linkType: hard
"next@npm:15.3.4":
version: 15.3.4
resolution: "next@npm:15.3.4"
"next@npm:15.4.7":
version: 15.4.7
resolution: "next@npm:15.4.7"
dependencies:
"@next/env": "npm:15.3.4"
"@next/swc-darwin-arm64": "npm:15.3.4"
"@next/swc-darwin-x64": "npm:15.3.4"
"@next/swc-linux-arm64-gnu": "npm:15.3.4"
"@next/swc-linux-arm64-musl": "npm:15.3.4"
"@next/swc-linux-x64-gnu": "npm:15.3.4"
"@next/swc-linux-x64-musl": "npm:15.3.4"
"@next/swc-win32-arm64-msvc": "npm:15.3.4"
"@next/swc-win32-x64-msvc": "npm:15.3.4"
"@swc/counter": "npm:0.1.3"
"@next/env": "npm:15.4.7"
"@next/swc-darwin-arm64": "npm:15.4.7"
"@next/swc-darwin-x64": "npm:15.4.7"
"@next/swc-linux-arm64-gnu": "npm:15.4.7"
"@next/swc-linux-arm64-musl": "npm:15.4.7"
"@next/swc-linux-x64-gnu": "npm:15.4.7"
"@next/swc-linux-x64-musl": "npm:15.4.7"
"@next/swc-win32-arm64-msvc": "npm:15.4.7"
"@next/swc-win32-x64-msvc": "npm:15.4.7"
"@swc/helpers": "npm:0.5.15"
busboy: "npm:1.6.0"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.1"
sharp: "npm:^0.34.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
"@playwright/test": ^1.41.2
"@playwright/test": ^1.51.1
babel-plugin-react-compiler: "*"
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
@@ -5236,7 +5218,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10/bcc781ca5abba6a29408431f81b57598708871796fe4c70d1187cc92ca4905467a6a3cde32840cb7911099d54a93c1543c130e4dea2b59dbf9753f5850a8efdf
checksum: 10/e611751247d5cfff9337a84979918bcd61919d7b66a411c982569336c3dba7e7a8704eead7e082e579807200fa8bc80602a3e2ce4423a8b5387aab3353400918
languageName: node
linkType: hard
@@ -6059,7 +6041,7 @@ __metadata:
languageName: node
linkType: hard
"sharp@npm:^0.34.1":
"sharp@npm:^0.34.3":
version: 0.34.3
resolution: "sharp@npm:0.34.3"
dependencies:
@@ -6347,13 +6329,6 @@ __metadata:
languageName: node
linkType: hard
"streamsearch@npm:^1.1.0":
version: 1.1.0
resolution: "streamsearch@npm:1.1.0"
checksum: 10/612c2b2a7dbcc859f74597112f80a42cbe4d448d03da790d5b7b39673c1197dd3789e91cd67210353e58857395d32c1e955a9041c4e6d5bae723436b3ed9ed14
languageName: node
linkType: hard
"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3":
version: 4.2.3
resolution: "string-width@npm:4.2.3"
+1
View File
@@ -34,6 +34,7 @@ Backstage comes with many common authentication providers in the core library:
- [Okta](okta/provider.md)
- [OAuth 2 Custom Proxy](oauth2-proxy/provider.md)
- [OneLogin](onelogin/provider.md)
- [OpenShift](openshift/provider.md)
- [VMware Cloud](vmware-cloud/provider.md)
These built-in providers handle the authentication flow for a particular service, including required scopes, callbacks, etc. These providers are each added to a
+130
View File
@@ -0,0 +1,130 @@
---
id: provider
title: OpenShift Authentication Provider
sidebar_label: OpenShift
description: Adding OpenShift OAuth as an authentication provider in Backstage
---
The Backstage `core-plugin-api` package comes with a OpenShift authentication
provider that can authenticate users using OpenShift OAuth.
## Use Case
This setup enables the [Kubernetes plugin](../../features/kubernetes/index.md) to access OpenShift clusters using the user's permissions,
leveraging OAuth 2.0 _On-Behalf-Of_ flow via the [Kubernetes Client Side Provider](../../features/kubernetes/authentication.md).
To make this work, the corresponding `User` entities must exist in the Backstage catalog,
and their names must match the OpenShift users.
Although the OpenShift authentication provider does not support OIDC natively,
you can still configure it for use with the Kubernetes integration by treating it as an OIDC provider
in the `KubernetesAuthProviders` configuration.
```ts title="packages/app/src/apis.ts"
import {
KubernetesAuthProviders,
kubernetesAuthProvidersApiRef,
} from '@backstage/plugin-kubernetes';
import {
googleAuthApiRef,
microsoftAuthApiRef,
openshiftAuthApiRef,
} from '@backstage/core-plugin-api';
export const apis: AnyApiFactory[] = [
// ...
createApiFactory({
api: kubernetesAuthProvidersApiRef,
deps: {
microsoftAuthApi: microsoftAuthApiRef,
googleAuthApi: googleAuthApiRef,
openshiftAuthApi: openshiftAuthApiRef,
},
factory({ microsoftAuthApi, googleAuthApi, openshiftAuthApi }) {
return new KubernetesAuthProviders({
microsoftAuthApi,
googleAuthApi,
oidcProviders: {
openshift: {
async getIdToken(_) {
return await openshiftAuthApi.getAccessToken('user:full');
},
},
},
});
},
}),
//...
];
```
:::note Note
The OpenShift auth API does **not** implement the `OpenIdConnectApi` interface. In other words, it does **not** return an ID token.
Instead, it returns an **access token**, which is used by the Kubernetes integration in place of an ID token.
This is the only functional difference from the standard OIDC-based authentication flow.
:::
## Create an OAuth client in OpenShift
Make sure that an OAuth client exists in the OpenShift cluster.
To configure the OpenShift integration, create an [`OAuthClient`](https://docs.redhat.com/en/documentation/openshift_container_platform/latest/html/authentication_and_authorization/configuring-oauth-clients).
The redirect URI must be in the following format: `https://<fqdn>/api/auth/openshift/handler/frame`.
## Configuration
The provider configuration can then be added to your `app-config.yaml` under the
root `auth` configuration:
```yaml
auth:
environment: development
providers:
openshift:
development:
clientId: ${AUTH_OPENSHIFT_CLIENT_ID}
clientSecret: ${AUTH_OPENSHIFT_CLIENT_SECRET}
authorizationUrl: ${AUTH_OPENSHIFT_AUTHORIZATION_URL}
tokenUrl: ${AUTH_OPENSHIFT_TOKEN_URL}
openshiftApiServerUrl: ${OPENSHIFT_API_SERVER_URL}
## uncomment to set lifespan of user session
# sessionDuration: { hours: 24 } # supports `ms` library format (e.g. '24h', '2 days'), ISO duration, "human duration" as used in code
# sessionDuration: 1d
signIn:
resolvers:
- resolver: displayNameMatchingUserEntityName
```
The OpenShift provider is a structure with these configuration keys:
- `clientId`: The client ID of your OpenShift OAuth client, e.g., `my-backstage`
- `clientSecret`: The client secret tied to the OpenShift OAuth client.
- `authorizationUrl`: The OpenShift OAuth client auth endpoint, format: `https://<oauth-client-route>/oauth/authorize`.
- `tokenUrl`: The OpenShift OAuth client token endpoint, format: `https://<oauth-client-route>/oauth/token`.
- `openshiftApiServerUrl`: The OpenShift API server endpoint, format: `https://<openshift-api>`.
- `sessionDuration`: (optional): Lifespan of the user session.
- `signIn`: The configuration for the sign-in process, including the **resolvers**
that should be used to match the user from the auth provider with the user
entity in the Backstage catalog (typically a single resolver is sufficient).
The provider needs to use the scope **user:full**.
## Backend Installation
To add the provider to the backend we will first need to install the package by running this command:
```bash title="from your Backstage root directory"
yarn --cwd packages/backend add @backstage/plugin-auth-backend-module-openshift-provider
```
Then we will need to add this line:
```ts title="in packages/backend/src/index.ts"
backend.add(import('@backstage/plugin-auth-backend'));
/* highlight-add-start */
backend.add(import('@backstage/plugin-auth-backend-module-openshift-provider'));
/* highlight-add-end */
```
@@ -7,6 +7,39 @@ description: Documentation for the Cache service
This service lets your plugin interact with a cache. It is bound to your plugin too, so that you will only set and get values in your plugin's private namespace.
## Configuration
The cache service can be configured using the `backend.cache` section in your `app-config.yaml`:
```yaml
backend:
cache:
store: redis # or 'valkey', 'memcache', 'memory'
connection: redis://localhost:6379
# Store-specific configuration (Redis/Valkey only)
redis:
client:
# Optional: Global namespace prefix for all cache keys
namespace: 'my-app'
# Optional: Separator used between namespace and plugin ID (default: ':')
keyPrefixSeparator: ':'
# Other Redis-specific options...
clearBatchSize: 1000
useUnlink: false
```
### Namespace Configuration
For Redis and Valkey stores, you can configure a global namespace that will be prefixed to all cache keys:
- **Without namespace**: Cache keys use only the plugin ID (e.g., `catalog:some-key`)
- **With namespace**: Cache keys use the format `namespace:pluginId:key` (e.g., `my-app:catalog:some-key`)
The `keyPrefixSeparator` controls what character is used between the namespace and plugin ID (defaults to `:`).
**Note**: Memory and Memcache stores do not support namespace configuration and will always use the plugin ID directly.
## Using the service
The following example shows how to get a cache client in your `example` backend plugin and setting and getting values from the cache.
@@ -13,6 +13,51 @@ If you want to override the implementation for logging across all of the backend
## Configuring the service
### Configuration parameters
The Root Logger Service can be configured with the `backend.logger` section of your `app-config.yaml`.
The following parameters are available:
- `level` (string, optional): Sets the global log level. Possible values are `debug`, `info`, `warn`, or `error`. Only messages at or above this level will be logged. This can also be set via the `LOG_LEVEL` environment variable, which takes precedence. Defaults to `info`. See [Modifying the log level](#modifying-the-log-level).
- `meta` (object, optional): Additional metadata to include with every log entry.
- `overrides` (array, optional): Allows to specify logger overrides for specific plugins or messages. Each override can match on plugin names, message patterns, or any field contained in the log, and set a custom log level for those matches.
Log level overrides are useful for controlling the volume of logs generated in Backstage.
They allow you to apply a global log level, `info` for example, while setting a stricter level, such as `warn`, for specific verbose plugins.
The reverse is also possible: you can set a global log level of `warn` while enabling a more detailed level, such as `debug`, for certain logs.
Example:
```yaml
backend:
logger:
meta:
env: prod # Every log message will have `env="prod"`
level: info # Set the global log level to info (the default)
overrides:
# Set the log level to 'debug' for the catalog plugin logs
- matchers:
plugin: catalog
level: debug
# Ignore 'info' incoming HTTP requests logs from the rootHttpRouter service
- matchers:
service: rootHttpRouter
type: incomingRequest
level: warn
# Ignore logs starting with "Task worker starting", unless they're warnings or errors
- matchers:
message: ['/^Task worker starting/']
level: warn
```
### Modifying the log level
The available log levels, in order of decreasing verbosity, are:
@@ -21,7 +66,6 @@ The available log levels, in order of decreasing verbosity, are:
- `info`: General information about the application's operation. This is the default level.
- `warn`: Indicates potential issues or situations that may require attention.
- `error`: Indicates errors that have occurred but may not necessarily prevent the application from continuing.
- `critical`: Indicates critical errors that require immediate attention and likely prevent the application from functioning correctly.
The verbosity of the logging can be controlled by setting the log level. The log level determines the minimum severity level of events that will be output to the console. For example, if the log level is set to `info`, events with a severity level of `debug` will be ignored.
+18 -4
View File
@@ -16,10 +16,24 @@ allowing for customization.
## Supplying Configuration
Configuration is stored in YAML files where the defaults are `app-config.yaml`
and `app-config.local.yaml` for local overrides. Other sets of files can by
loaded by passing `--config <path>` flags. The configuration files themselves
contain plain YAML, but with support for loading in data and secrets from
various sources using for example `$env` and `$file` keys.
and `app-config.local.yaml` for local overrides. Additionally, it is possible
to define environment based configuration files with `BACKSTAGE_ENV`
environment variable, which will load `app-config.<BACKSTAGE_ENV>.yaml`.
Loading order of these files is as follows:
1. `app-config.yaml`
2. `app-config.<BACKSTAGE_ENV>.yaml`
3. `app-config.local.yaml`
4. `app-config.<BACKSTAGE_ENV>.local.yaml`
Other sets of files can by loaded by passing `--config <path>` flags.
Read more about the configuration loading order in the
[Configuration Files](./writing.md#configuration-files) section.
The configuration files themselves contain plain YAML, but with support for
loading in data and secrets from various sources using for example
`$env` and `$file` keys.
It is also possible to supply configuration through environment variables, for
example `APP_CONFIG_app_baseUrl=https://staging.example.com`. However these
-4
View File
@@ -221,7 +221,3 @@ future.
- [`catalog-info.yaml`](https://github.com/backstage/backstage/tree/master/catalog-info.yaml) -
Description of Backstage in the Backstage Entity format.
- [`lerna.json`](https://github.com/backstage/backstage/tree/master/lerna.json) -
[Lerna](https://github.com/lerna/lerna) monorepo config. We are using
`yarn workspaces`, so this will only be used for executing scripts.
+4 -4
View File
@@ -53,7 +53,7 @@ Once the host build is complete, we are ready to build our image. The following
`Dockerfile` is included when creating a new app with `@backstage/create-app`:
```dockerfile
FROM node:20-bookworm-slim
FROM node:22-bookworm-slim
# Set Python interpreter for `node-gyp` to use
ENV PYTHON=/usr/bin/python3
@@ -178,7 +178,7 @@ the repo root:
```dockerfile
# Stage 1 - Create yarn install skeleton layer
FROM node:20-bookworm-slim AS packages
FROM node:22-bookworm-slim AS packages
WORKDIR /app
COPY backstage.json package.json yarn.lock ./
@@ -193,7 +193,7 @@ COPY plugins plugins
RUN find packages \! -name "package.json" -mindepth 2 -maxdepth 2 -exec rm -rf {} \+
# Stage 2 - Install dependencies and build packages
FROM node:20-bookworm-slim AS build
FROM node:22-bookworm-slim AS build
# Set Python interpreter for `node-gyp` to use
ENV PYTHON=/usr/bin/python3
@@ -231,7 +231,7 @@ RUN mkdir packages/backend/dist/skeleton packages/backend/dist/bundle \
&& tar xzf packages/backend/dist/bundle.tar.gz -C packages/backend/dist/bundle
# Stage 3 - Build the actual backend image and install production dependencies
FROM node:20-bookworm-slim
FROM node:22-bookworm-slim
# Set Python interpreter for `node-gyp` to use
ENV PYTHON=/usr/bin/python3
+20
View File
@@ -239,6 +239,26 @@ search:
> You can also increase the batch size if you are using a large ES instance.
### Elasticsearch batch key field
By default, during bulk uploads with the Elasticsearch indexer, each document is assigned an auto-generated `_id` unless a `batchKeyField` is explicitly set. This configuration is optional and most users wont need to customize it. However, if your use case involves frequent lookups or updates to existing documents, setting `batchKeyField` can be beneficial. It allows you to define a consistent identifier for each document, helping to streamline updates and prevent duplicate entries. Be aware that if the value provided for `batchKeyField` is not unique across documents, Elasticsearch will overwrite any existing document with the same `_id`.
**Using `batchKeyField` (Custom `_id`)**
```yaml
search:
elasticsearch:
batchKeyField: document_id
```
**Default Behavior (Auto-generated `_id`)**
```yaml
search:
elasticsearch:
# No batchKeyField specified — Elasticsearch will autogenerate _id
```
### Elasticsearch Index Name Customization
By default, the Elasticsearch indexer creates index names based on their type, a separator, and the current date as a postfix. You can configure a custom prefix for all indices by adding the following section to your app configuration.
@@ -132,6 +132,10 @@ in the registration order, but this does not apply over multiple catalog modules
the order of registration depends on the order in which the modules are loaded
by the framework.
It's possible to customize the order of the processors by modifying the
`catalog.processors.<processorName>.priority` configuration option.
The default priority is `20`, and lower value means that the processor runs earlier.
:::
Each step has the opportunity to optionally modify the entity, and to optionally
@@ -126,7 +126,7 @@ metadata:
The value of this annotation informs of the path to this component's TechDocs within an external entity that owns the TechDocs.
In conjunction with [backstage.io/techdocs-entity](#backstageiotechdocs-entity) this allows for deep linking into the TechDocs of
another entity, not just linking to the root of another entities TechDocs.
another entity, not just linking to the root of another entity's TechDocs.
### backstage.io/view-url, backstage.io/edit-url
+6
View File
@@ -12,6 +12,8 @@ This page answers frequently asked questions about [TechDocs](README.md).
- [What static site generator is TechDocs using?](#what-static-site-generator-is-techdocs-using)
- [What is the mkdocs-techdocs-core plugin?](#what-is-the-mkdocs-techdocs-core-plugin)
- [Does TechDocs support file formats other than Markdown (e.g. RST, AsciiDoc)?](#does-techdocs-support-file-formats-other-than-markdown-eg-rst-asciidoc-)
- [What should be the value of `backstage.io/techdocs-ref` when using external build and storage?](#what-should-be-the-value-of-backstageiotechdocs-ref-when-using-external-build-and-storage)
- [Is it possible for users to suggest changes or provide feedback on a TechDocs page?](#is-it-possible-for-users-to-suggest-changes-or-provide-feedback-on-a-techdocs-page)
#### What static site generator is TechDocs using?
@@ -46,6 +48,10 @@ annotation should still be present in entity descriptor file (e.g.
`catalog-info.yaml`) for Backstage to know that TechDocs is enabled for the
entity.
#### What happens when you navigate to a TechDocs URL for an entity uses the `backstage.io/techdocs-entity` annotation?
If you navigate to a TechDocs URL in the format `docs/{namespace}/{kind}/{name}` for an entity that has the `backstage.io/techdocs-entity` annotation (instead of the `backstage.io/techdocs-ref` annotation), then Backstage will redirect to the TechDocs page of the entity referenced in the value of that annotation.
#### Is it possible for users to suggest changes or provide feedback on a TechDocs page?
This is supported for TechDocs sites whose source code is hosted in either
@@ -92,7 +92,7 @@ import { createExtensionTester } from '@backstage/frontend-test-utils';
import { indexPageExtension } from './plugin';
describe('Index page', () => {
it('should render a the index page', async () => {
it('should render the index page', async () => {
await renderInTestApp(
createExtensionTester(indexPageExtension).reactElement(),
);
@@ -147,7 +147,7 @@ import { createExtensionTester } from '@backstage/frontend-test-utils';
import { indexPageExtension, detailsPageExtension } from './plugin';
describe('Index page', () => {
it('should accepts a custom title via config', async () => {
it('should accept a custom title via config', async () => {
const tester = createExtensionTester(indexPageExtension, {
// Extension configuration for the index page
config: { title: 'Custom page' },
+5 -5
View File
@@ -31,7 +31,7 @@ This guide also assumes a basic understanding of working on a Linux based operat
[Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/)
- A GNU-like build environment available at the command line.
For example, on Debian/Ubuntu you will want to have the `make` and `build-essential` packages installed.
On macOS, you will want to have run `xcode-select --install` to get the XCode command line build tooling in place.
On macOS, you will want to run `xcode-select --install` to get the XCode command line build tooling in place.
- An account with elevated rights to install the dependencies
- `curl` or `wget` installed
- Node.js [Active LTS Release](../overview/versioning-policy.md#nodejs-releases) installed using one of these
@@ -58,9 +58,9 @@ The Backstage app we'll be creating will only have demo data until we set up int
:::
To install the Backstage Standalone app, we will make use of `npx`. `npx` is a tool that comes preinstalled with Node.js and lets you run commands straight from `npm` or other registries. Before we jump in to running the command, let's chat about what it does.
To install the Backstage Standalone app, we will make use of `npx`. `npx` is a tool that comes preinstalled with Node.js and lets you run commands straight from `npm` or other registries. Before we run the command, let's discuss what it does.
This command will create a new directory with a Backstage app inside. The wizard will ask you for the name of the app. This name will be created as sub directory in your current working directory.
This command will create a new directory with a Backstage app inside. The wizard will ask you for the name of the app. This name will be created as subdirectory in your current working directory.
![create app](../assets/getting-started/create-app-output.png)
@@ -89,8 +89,8 @@ app
- **package.json**: Root package.json for the project. _Note: Be sure that you
don't add any npm dependencies here as they probably should be installed in
the intended workspace rather than in the root._
- **packages/**: Lerna leaf packages or "workspaces". Everything here is going
to be a separate package, managed by lerna.
- **packages/**: Yarn workspaces, everything here is going
to be a separate package, managed by Yarn.
- **packages/app/**: A fully functioning Backstage frontend app that acts as a
good starting point for you to get to know Backstage.
- **packages/backend/**: We include a backend that helps power features such as
+1 -1
View File
@@ -184,7 +184,7 @@ To install custom rules in a plugin, we need to use the [`PermissionsRegistrySer
import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'),
);
/* highlight-add-next-line */
backend.add(import('./extensions/catalogPermissionRules'));
backend.add(import('./modules/catalogPermissionRules'));
```
5. Now when you run you Backstage instance - `yarn start` - the rule will be added to the catalog plugin.
+1 -1
View File
@@ -208,7 +208,7 @@ One of the [packages](#package) within a [monorepo](#monorepo). A package may or
1. A single repository for a collection of related software projects, such as all projects belonging to an organization.
2. A project layout that consists of multiple [packages](#package) within a single project, where packages are able to have local dependencies on each other. Often enabled through tooling such as [lerna](https://lerna.js.org/) and [yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/)
2. A project layout that consists of multiple [packages](#package) within a single project, where packages are able to have local dependencies on each other. Often enabled through tooling such as [yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/)
## Name
File diff suppressed because it is too large Load Diff
+695
View File
@@ -0,0 +1,695 @@
# Release v1.43.0-next.2
Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.43.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.43.0-next.2)
## @backstage/catalog-client@1.12.0-next.0
### Minor Changes
- 0e9ec44: Introduced new `streamEntities` async generator method for the catalog.
Catalog API and Catalog Service now includes a `streamEntities` method that allows for streaming entities from the catalog.
This method is designed to handle large datasets efficiently by processing entities in a stream rather than loading them
all into memory at once. This is useful when you need to fetch a large number of entities but do not want to use pagination
or fetch all entities at once.
Example usage:
```ts
const pageStream = catalogClient.streamEntities({ pageSize: 100 }, { token });
for await (const page of pageStream) {
// Handle page of entities
for (const entity of page) {
console.log(entity);
}
}
```
## @backstage/plugin-auth@0.1.0-next.0
### Minor Changes
- 54ddfef: Initial publish of the `auth` frontend package
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.6-next.1
## @backstage/plugin-catalog-node@1.19.0-next.1
### Minor Changes
- 0e9ec44: Introduced new `streamEntities` async generator method for the catalog.
Catalog API and Catalog Service now includes a `streamEntities` method that allows for streaming entities from the catalog.
This method is designed to handle large datasets efficiently by processing entities in a stream rather than loading them
all into memory at once. This is useful when you need to fetch a large number of entities but do not want to use pagination
or fetch all entities at once.
Example usage:
```ts
const pageStream = catalogClient.streamEntities({ pageSize: 100 }, { token });
for await (const page of pageStream) {
// Handle page of entities
for (const entity of page) {
console.log(entity);
}
}
```
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
## @backstage/plugin-catalog-react@1.21.0-next.2
### Minor Changes
- 0e9ec44: Introduced new `streamEntities` async generator method for the catalog.
Catalog API and Catalog Service now includes a `streamEntities` method that allows for streaming entities from the catalog.
This method is designed to handle large datasets efficiently by processing entities in a stream rather than loading them
all into memory at once. This is useful when you need to fetch a large number of entities but do not want to use pagination
or fetch all entities at once.
Example usage:
```ts
const pageStream = catalogClient.streamEntities({ pageSize: 100 }, { token });
for await (const page of pageStream) {
// Handle page of entities
for (const entity of page) {
console.log(entity);
}
}
```
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/core-components@0.17.6-next.1
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/backend-defaults@0.12.1-next.1
### Patch Changes
- 4eda590: Fixed cache namespace and key prefix separator configuration to properly use configured values instead of hardcoded plugin ID. The cache manager now correctly combines the configured namespace with plugin IDs using the configured separator for Redis and Valkey. Memcache and memory store continue to use plugin ID as namespace.
- Updated dependencies
- @backstage/config-loader@1.10.3-next.0
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/integration@1.18.0-next.0
- @backstage/integration-aws-node@0.1.17
## @backstage/backend-dynamic-feature-service@0.7.4-next.1
### Patch Changes
- Updated dependencies
- @backstage/config-loader@1.10.3-next.0
- @backstage/backend-defaults@0.12.1-next.1
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/plugin-catalog-backend@3.0.2-next.1
- @backstage/plugin-app-node@0.1.37-next.1
## @backstage/cli@0.34.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/config-loader@1.10.3-next.0
- @backstage/integration@1.18.0-next.0
## @backstage/config-loader@1.10.3-next.0
### Patch Changes
- a73f495: Allow using `BACKSTAGE_ENV` for loading environment specific config files
## @backstage/core-compat-api@0.5.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
## @backstage/core-components@0.17.6-next.1
### Patch Changes
- 1ad3d94: Dependency graph can now be opened in full screen mode
- ae7d426: update about card links style for pretty display with other language
## @backstage/create-app@0.7.4-next.2
### Patch Changes
- Bumped create-app version.
## @backstage/dev-utils@1.1.14-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
## @backstage/repo-tools@0.15.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/config-loader@1.10.3-next.0
## @backstage/ui@0.7.1-next.0
### Patch Changes
- 7307930: Add missing class for flex: baseline
- 89da341: Fix Select component to properly attach aria-label and aria-labelledby props to the rendered element for improved accessibility.
## @backstage/plugin-api-docs@0.12.11-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/plugin-catalog@1.31.3-next.2
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-app-backend@0.5.6-next.1
### Patch Changes
- afd368e: Internal update to not expose the old `createRouter`.
- Updated dependencies
- @backstage/config-loader@1.10.3-next.0
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/plugin-app-node@0.1.37-next.1
## @backstage/plugin-app-node@0.1.37-next.1
### Patch Changes
- Updated dependencies
- @backstage/config-loader@1.10.3-next.0
## @backstage/plugin-auth-backend@0.25.4-next.1
### Patch Changes
- 1d47bf3: Implementing Dynamic Client Registration with the OIDC server. You can enable this by setting `auth.experimentalDynamicClientRegistration.enabled` in `app-config.yaml`. This is highly experimental, but feedback welcome.
- 54ddfef: Updating plugin metadata
- Updated dependencies
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-auth-node@0.6.7-next.1
### Patch Changes
- 54ddfef: Updating plugin metadata
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
## @backstage/plugin-auth-react@0.1.19-next.1
### Patch Changes
- 54ddfef: Updating plugin metadata
- Updated dependencies
- @backstage/core-components@0.17.6-next.1
## @backstage/plugin-catalog@1.31.3-next.2
### Patch Changes
- 85c5e04: Fix incorrect `defaultTarget` on `createComponentRouteRef`.
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-catalog-backend@3.0.2-next.1
### Patch Changes
- 2204f5b: Prevent deadlock in catalog deferred stitching
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-aws@0.4.15-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.12.1-next.1
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
- @backstage/integration-aws-node@0.1.17
## @backstage/plugin-catalog-backend-module-azure@0.3.9-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.6-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-gcp@0.3.12-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-catalog-backend-module-gerrit@0.3.6-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-gitea@0.1.4-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-github@0.11.0-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@3.0.2-next.1
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-github-org@0.3.14-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/plugin-catalog-backend-module-github@0.11.0-next.1
## @backstage/plugin-catalog-backend-module-gitlab@0.7.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.12.1-next.1
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.13-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/plugin-catalog-backend-module-gitlab@0.7.3-next.1
## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.4-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.12.1-next.1
- @backstage/plugin-catalog-backend@3.0.2-next.1
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-catalog-backend-module-ldap@0.11.9-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-catalog-backend-module-msgraph@0.8.0-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-catalog-backend-module-openapi@0.2.14-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-catalog-backend-module-puppetdb@0.2.14-next.1
### Patch Changes
- afd368e: **BREAKING ALPHA**: The module has been moved from the `/alpha` export to the root of the package.
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.12-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-catalog-backend-module-unprocessed@0.6.4-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-catalog-graph@0.4.23-next.2
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-catalog-import@0.13.5-next.2
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/integration@1.18.0-next.0
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-devtools-backend@0.5.9-next.1
### Patch Changes
- Updated dependencies
- @backstage/config-loader@1.10.3-next.0
- @backstage/backend-defaults@0.12.1-next.1
## @backstage/plugin-home@0.8.12-next.2
### Patch Changes
- 929c55a: Fixed race condition in CustomHomepageGrid by waiting for storage to load before rendering custom layout to prevent
rendering of the default content.
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-kubernetes@0.12.11-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-kubernetes-backend@0.20.2-next.2
### Patch Changes
- dd7b6d2: Fix a bug where `getDefault` in the `kubernetesFetcherExtensionPoint` had the wrong `this` value
- Updated dependencies
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration-aws-node@0.1.17
## @backstage/plugin-kubernetes-cluster@0.0.29-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
## @backstage/plugin-mcp-actions-backend@0.1.3-next.1
### Patch Changes
- 1d47bf3: Proxy `/.well-known/oauth-authorization-server` to `/.well-known/openid-configuration` on `auth-backend` when `auth.experimentalDynamicClientRegistration.enabled` is enabled.
- Updated dependencies
- @backstage/backend-defaults@0.12.1-next.1
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-notifications-backend@0.5.10-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/plugin-notifications-node@0.2.19-next.1
## @backstage/plugin-notifications-backend-module-email@0.3.13-next.1
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration-aws-node@0.1.17
- @backstage/plugin-notifications-node@0.2.19-next.1
## @backstage/plugin-notifications-backend-module-slack@0.1.5-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/plugin-notifications-node@0.2.19-next.1
## @backstage/plugin-notifications-node@0.2.19-next.1
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
## @backstage/plugin-org@0.6.44-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-org-react@0.1.42-next.2
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
## @backstage/plugin-scaffolder@1.34.1-next.2
### Patch Changes
- 0d415ae: Render a TechDocs link on the Scaffolder Template List page when templates include either `backstage.io/techdocs-ref` or `backstage.io/techdocs-entity` annotations, using the shared `buildTechDocsURL` helper. Also adds tests to verify both annotations and optional `backstage.io/techdocs-entity-path` are respected.
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/plugin-scaffolder-react@1.19.1-next.2
- @backstage/integration@1.18.0-next.0
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-scaffolder-backend@2.2.1-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.12.1-next.1
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.12-next.1
- @backstage/plugin-scaffolder-backend-module-github@0.8.3-next.1
## @backstage/plugin-scaffolder-backend-module-github@0.8.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
## @backstage/plugin-scaffolder-react@1.19.1-next.2
### Patch Changes
- 58fc108: Fix scaffolder task log stream not having a minimum height
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
## @backstage/plugin-search@1.4.30-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-search-backend-module-catalog@0.3.8-next.1
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-search-backend-module-techdocs@0.4.6-next.1
### Patch Changes
- Updated dependencies
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
## @backstage/plugin-techdocs@1.14.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-react@0.1.19-next.1
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/integration@1.18.0-next.0
- @backstage/core-compat-api@0.5.2-next.2
## @backstage/plugin-techdocs-addons-test-utils@1.0.53-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/plugin-catalog@1.31.3-next.2
- @backstage/plugin-techdocs@1.14.2-next.2
## @backstage/plugin-techdocs-backend@2.1.0-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.12.1-next.1
- @backstage/catalog-client@1.12.0-next.0
- @backstage/plugin-catalog-node@1.19.0-next.1
- @backstage/integration@1.18.0-next.0
- @backstage/plugin-search-backend-module-techdocs@0.4.6-next.1
## @backstage/plugin-user-settings@0.8.26-next.2
### Patch Changes
- b713b54: Tool-tip text correction for the Theme selection in settings page
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/core-compat-api@0.5.2-next.2
## example-app@0.2.113-next.2
### Patch Changes
- Updated dependencies
- @backstage/ui@0.7.1-next.0
- @backstage/plugin-auth-react@0.1.19-next.1
- @backstage/plugin-home@0.8.12-next.2
- @backstage/plugin-scaffolder@1.34.1-next.2
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/plugin-user-settings@0.8.26-next.2
- @backstage/plugin-scaffolder-react@1.19.1-next.2
- @backstage/plugin-catalog@1.31.3-next.2
- @backstage/cli@0.34.2-next.2
- @backstage/plugin-catalog-graph@0.4.23-next.2
- @backstage/plugin-catalog-import@0.13.5-next.2
- @backstage/plugin-org@0.6.44-next.2
- @backstage/plugin-techdocs@1.14.2-next.2
- @backstage/plugin-api-docs@0.12.11-next.2
- @backstage/plugin-kubernetes@0.12.11-next.2
- @backstage/plugin-kubernetes-cluster@0.0.29-next.2
- @backstage/plugin-search@1.4.30-next.2
- @backstage/plugin-techdocs-module-addons-contrib@1.1.28-next.0
## example-app-next@0.0.27-next.2
### Patch Changes
- Updated dependencies
- @backstage/ui@0.7.1-next.0
- @backstage/plugin-auth-react@0.1.19-next.1
- @backstage/plugin-auth@0.1.0-next.0
- @backstage/plugin-home@0.8.12-next.2
- @backstage/plugin-scaffolder@1.34.1-next.2
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/plugin-user-settings@0.8.26-next.2
- @backstage/plugin-scaffolder-react@1.19.1-next.2
- @backstage/plugin-catalog@1.31.3-next.2
- @backstage/cli@0.34.2-next.2
- @backstage/plugin-catalog-graph@0.4.23-next.2
- @backstage/plugin-catalog-import@0.13.5-next.2
- @backstage/plugin-org@0.6.44-next.2
- @backstage/plugin-techdocs@1.14.2-next.2
- @backstage/core-compat-api@0.5.2-next.2
- @backstage/plugin-api-docs@0.12.11-next.2
- @backstage/plugin-kubernetes@0.12.11-next.2
- @backstage/plugin-kubernetes-cluster@0.0.29-next.2
- @backstage/plugin-search@1.4.30-next.2
- @backstage/plugin-techdocs-module-addons-contrib@1.1.28-next.0
+90
View File
@@ -0,0 +1,90 @@
---
id: v1.43.0
title: v1.43.0
description: Backstage Release v1.43.0
---
These are the release notes for the v1.43.0 release of [Backstage](https://backstage.io/).
A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done.
## Highlights
### **BREAKING:** MSgraph catalog module encoding queries
The catalog MSgraph module now properly encodes filter queries before they are sent to the remote system. This fixes some confusion in how to properly write queriesand thus simplifies operations for users. However, it does mean that if you use the `@backstage/plugin-catalog-backend-module-msgraph` module, you will have to update your `filter` parameters to be just plain text without any manual encoding. Example:
```diff
user:
- filter: department in('MARKETING', 'R %26 D')
+ filter: department in('MARKETING', 'R & D')
```
Contributed by [@stephenglass](https://github.com/stephenglass) in [#30567](https://github.com/backstage/backstage/pull/30567)
### OpenShift auth
Backstage now supports OpenShift as an auth provider! This was a long standing PR that we are very excited to have merged into the project. Go [check out the docs](https://backstage.io/docs/auth/openshift/provider) for it!
Contributed by [@ioboi](https://github.com/ioboi) in [#29470](https://github.com/backstage/backstage/pull/29470)
### Improved app error display for new frontend system
If the frontend app encounters one or more critical errors during startup they are now displayed on an error page that summarizes the errors and their source. This is in contrast to before this change, where errors would result in a blank page with the first error logged to the console.
Some more errors have also been moved to be warnings, which will be logged in the console regardless of whether the app starts up or not.
### Actions Registry integration with the Scaffolder
Actions which are registered in the Actions Registry are now also available in Scaffolder templates. You will be able to browse the actions and see the schema like the original Scaffolder Templating Actions, as well as being able to use `action: acme:my-action` inside template steps to call these distributed actions.
### _Experimental_: Dynamic Client Registration support for MCP Actions Backend
Weve shipped experimental support for allowing the `auth-backend` to issue tokens on behalf of users for use in MCP Clients such as Claude and Cursor. This is highly experimental, and tokens are only valid for 1 hour currently. Were eager to get some feedback on this feature, so if you would like to try it out you can check out the [mcp-actions docs](https://github.com/backstage/backstage/blob/master/plugins/mcp-actions-backend/README.md#experimental-dynamic-client-registration) and leave us some feedback in a [GitHub issue](https://github.com/backstage/backstage/issues/new), or on our [Community Discord](https://discord.gg/backstage-687207715902193673)!
### Introducing `BACKSTAGE_ENV`
The Backstage configuration system now pays attention to the `BACKSTAGE_ENV` environment variable, and uses it to locate config files to load without you having to manually specify `--config` flags at startup. This makes it even smoother to leverage e.g. `app-config.production.yaml` files in your production environment.
Check out [the updated documentation](https://backstage.io/docs/conf/) for more information.
Contributed by [@drodil](https://github.com/drodil) in [#30722](https://github.com/backstage/backstage/pull/30722)
### Backend logger configuration
It is now possible to configure log level, meta, and log level overrides through static configuration. This allows you to raise or lower the log level for individual plugins or services. But it also allows you to match on any log field using either exact matches or regular expressions. Read more about the new configuration options in the [Root Logger Service](https://backstage.io/docs/backend-system/core-services/root-logger/) documentation.
Contributed by [@tcardonne](https://github.com/tcardonne) in [#30727](https://github.com/backstage/backstage/pull/30727)
### Toggling and priorities for catalog features
You are now able to enable/disable individual processors and providers in your catalog, directly through your app config. You can also affect the order in which processors run, by assigning them priorities.
Contributed by [@drodil](https://github.com/drodil) in [#31034](https://github.com/backstage/backstage/pull/31034) and [#30969](https://github.com/backstage/backstage/pull/30969)
### Moved the Explore search module
Just a quick note, that the search collator module for the `explore` plugin was moved to the community repository, where it fits snugly next to the plugin itself. If you are using the yarn plugin, these references should be updated automatically for you. But if you do not, just update your dependencies on `@backstage/plugin-search-backend-module-explore`, to `@backstage-community/plugin-search-backend-module-explore`.
## Security Fixes
This release does not contain any security fixes. However, it is worth calling out that OAuth cookies issued by the auth backend have changed from domain-scoped to host-only.
Contributed by [@JessicaJHee](https://github.com/JessicaJHee) in [#30922](https://github.com/backstage/backstage/pull/30922)
## Upgrade path
We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated).
## Links and References
Below you can find a list of links and references to help you learn about and start using this new release.
- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/)
- [GitHub repository](https://github.com/backstage/backstage)
- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy)
- [Community Discord](https://discord.gg/backstage-687207715902193673) for discussions and support
- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.43.0-changelog.md)
- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins)
Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage.
-6
View File
@@ -1,6 +0,0 @@
{
"packages": ["packages/*", "plugins/*"],
"npmClient": "yarn",
"useWorkspaces": true,
"version": "0.0.0"
}
+10
View File
@@ -0,0 +1,10 @@
---
title: KwirthMetrics for Backstage
author: Julio Fernandez
authorUrl: https://github.com/jfvilas
category: Monitoring
description: Shows live-streaming charts of Kubernetes resources metrics like CPU, memory, I/O... (you can group and merge data).
documentation: https://github.com/jfvilas/plugin-kwirth-metrics
iconUrl: https://raw.githubusercontent.com/jfvilas/plugin-kwirth-metrics/master/src/assets/kwirthmetrics-logo.png
npmPackageName: '@jfvilas/plugin-kwirth-metrics'
addedDate: '2025-09-14'
+5
View File
@@ -297,6 +297,11 @@ const config: Config = {
specPath: '../plugins/search-backend/src/schema/openapi.yaml',
outputDir: '../docs/features/search/api',
} satisfies OpenApiPlugin.Options,
scaffolder: {
...defaultOpenApiOptions,
specPath: '../plugins/scaffolder-backend/src/schema/openapi.yaml',
outputDir: '../docs/features/software-templates/api',
} satisfies OpenApiPlugin.Options,
},
},
],
+19
View File
@@ -14,6 +14,9 @@ const catalogSidebar = tryToLoadCustomSidebar(
const searchSidebar = tryToLoadCustomSidebar(
'../docs/features/search/api/sidebar.ts',
);
const scaffolderSidebar = tryToLoadCustomSidebar(
'../docs/features/software-templates/api/sidebar.ts',
);
export default {
docs: {
@@ -229,6 +232,22 @@ export default {
'features/software-templates/dry-run-testing',
'features/software-templates/experimental',
'features/software-templates/templating-extensions',
{
type: 'category',
label: 'API',
link:
scaffolderSidebar.length > 0
? {
type: 'generated-index',
title: 'Scaffolder API',
slug: '/category/scaffolder-api',
}
: {
type: 'doc',
id: 'openapi/generated-docs/404',
},
items: scaffolderSidebar,
},
],
},
{
@@ -0,0 +1,19 @@
import React from 'react';
type Props = {
searchTerm: string;
onSearchTermChange: (newTerm: string) => void;
};
export const PluginsSearch = (props: Props) => {
const { searchTerm, onSearchTermChange } = props;
return (
<input
name="search"
onInput={e => onSearchTermChange((e.target as HTMLInputElement).value)}
value={searchTerm}
placeholder="Search plugins..."
className="DocSearch-Input search"
/>
);
};
+55 -29
View File
@@ -5,10 +5,11 @@ import { truncateDescription } from '@site/src/util/truncateDescription';
import { ChipCategory } from '@site/src/util/types';
import Layout from '@theme/Layout';
import clsx from 'clsx';
import React, { useState } from 'react';
import React, { useMemo, useState } from 'react';
import { IPluginData, PluginCard } from './_pluginCard';
import pluginsStyles from './plugins.module.scss';
import { PluginsSearch } from '@site/src/components/pluginsSearch/pluginsSearch';
interface IPluginsList {
corePlugins: IPluginData[];
@@ -55,6 +56,7 @@ const Plugins = () => {
const [selectedCategories, setSelectedCategories] = useState<string[]>([]);
const [showCoreFeatures, setShowCoreFeatures] = useState(true);
const [showOtherPlugins, setShowOtherPlugins] = useState(true);
const [searchTerm, setSearchTerm] = useState('');
const handleChipClick = (categoryName: string) => {
const isSelected =
@@ -97,6 +99,34 @@ const Plugins = () => {
}
};
const matchesSearch = (pluginData: IPluginData, term: string) => {
if (!term) return true;
const lowerTerm = term.toLowerCase();
return (
pluginData.title.toLowerCase().includes(lowerTerm) ||
pluginData.description.toLowerCase().includes(lowerTerm) ||
pluginData.category.toLowerCase().includes(lowerTerm) ||
(pluginData.author && pluginData.author.toLowerCase().includes(lowerTerm))
);
};
const matchesCategory = (pluginData: IPluginData, categories: string[]) => {
if (categories.length === 0) return true;
return categories.includes(pluginData.category);
};
const corePlugins = useMemo(() => {
return plugins.corePlugins
.filter(pluginData => matchesCategory(pluginData, selectedCategories))
.filter(pluginData => matchesSearch(pluginData, searchTerm));
}, [selectedCategories, searchTerm]);
const otherPlugins = useMemo(() => {
return plugins.otherPlugins
.filter(pluginData => matchesCategory(pluginData, selectedCategories))
.filter(pluginData => matchesSearch(pluginData, searchTerm));
}, [selectedCategories, searchTerm]);
return (
<Layout>
<div
@@ -126,31 +156,36 @@ const Plugins = () => {
categories={categories}
handleChipClick={handleChipClick}
/>
<PluginsSearch
searchTerm={searchTerm}
onSearchTermChange={setSearchTerm}
/>
</div>
{showCoreFeatures && (
{corePlugins.length === 0 && otherPlugins.length === 0 && (
<div className="margin-vert--lg">
<h3>No plugins found</h3>
<p>
We couldn't find any plugins matching your criteria. Please try
adjusting your search or filter settings.
</p>
</div>
)}
{showCoreFeatures && corePlugins.length > 0 && (
<div>
<h2>Core Features</h2>
<h2>Core Features ({corePlugins.length})</h2>
<div className="pluginsContainer margin-bottom--lg">
{plugins.corePlugins
.filter(
pluginData =>
!selectedCategories.length ||
selectedCategories.includes(pluginData.category),
)
.map(pluginData => (
<PluginCard
key={pluginData.title}
{...pluginData}
></PluginCard>
))}
{corePlugins.map(pluginData => (
<PluginCard key={pluginData.title} {...pluginData}></PluginCard>
))}
</div>
</div>
)}
{showOtherPlugins && (
{showOtherPlugins && otherPlugins.length > 0 && (
<div>
<h2>All Plugins</h2>
<h2>All Plugins ({otherPlugins.length})</h2>
<p>
Friendly reminder: While we love the variety and contributions of
our open source plugins, they haven't been fully vetted by the
@@ -158,18 +193,9 @@ const Plugins = () => {
your due diligence before installing. Happy exploring!
</p>
<div className="pluginsContainer margin-bottom--lg">
{plugins.otherPlugins
.filter(
pluginData =>
!selectedCategories.length ||
selectedCategories.includes(pluginData.category),
)
.map(pluginData => (
<PluginCard
key={pluginData.title}
{...pluginData}
></PluginCard>
))}
{otherPlugins.map(pluginData => (
<PluginCard key={pluginData.title} {...pluginData}></PluginCard>
))}
</div>
</div>
)}
@@ -76,6 +76,20 @@
height: 1rem;
}
:global(.search) {
float: right;
margin-bottom: 1rem;
margin-right: 1rem;
font-size: calc(0.875rem * var(--ifm-button-size-multiplier));
font-weight: var(--ifm-button-font-weight);
background-color: transparent;
border: var(--ifm-button-border-width) solid var(--ifm-color-primary);
border-radius: var(--ifm-button-border-radius);
color: var(--ifm-color-primary);
width: 220px;
height: 2.2rem;
}
:global(.dropdown) {
float: right;
margin-bottom: 1rem;
+17 -13
View File
@@ -1,6 +1,6 @@
{
"name": "root",
"version": "1.43.0-next.1",
"version": "1.43.0",
"backstage": {
"cli": {
"new": {
@@ -24,10 +24,11 @@
},
"scripts": {
"build-storybook": "storybook build --output-dir dist-storybook",
"build-storybook:chromatic": "STORYBOOK_STORY_SET=chromatic storybook build --stats-json --output-dir dist-storybook",
"build:all": "backstage-cli repo build --all",
"build:api-docs": "LANG=en_EN yarn build:api-reports --docs --exclude 'plugins/@(adr|adr-backend|adr-common|airbrake|airbrake-backend|allure|analytics-module-ga|analytics-module-ga4|analytics-module-newrelic-browser|apache-airflow|api-docs|api-docs-module-protoc-gen-doc|apollo-explorer|app-visualizer|azure-devops|azure-devops-backend|azure-devops-common|azure-sites|azure-sites-backend|azure-sites-common|badges|badges-backend|bazaar|bazaar-backend|bitbucket-cloud-common|bitrise|catalog-graph|catalog-graphql|catalog-import|catalog-unprocessed-entities|cicd-statistics|cicd-statistics-module-gitlab|circleci|cloudbuild|code-climate|code-coverage|code-coverage-backend|codescene|config-schema|cost-insights|cost-insights-common|dynatrace|entity-feedback|entity-feedback-backend|entity-feedback-common|entity-validation|example-todo-list|example-todo-list-backend|example-todo-list-common|firehydrant|fossa|gcalendar|gcp-projects|git-release-manager|github-actions|github-deployments|github-issues|github-pull-requests-board|gitops-profiles|gocd|graphiql|graphql-backend|graphql-voyager|ilert|jenkins|jenkins-backend|jenkins-common|kafka|kafka-backend|lighthouse|lighthouse-backend|lighthouse-common|linguist|linguist-backend|linguist-common|microsoft-calendar|newrelic|newrelic-dashboard|nomad|nomad-backend|octopus-deploy|opencost|pagerduty|periskop|periskop-backend|playlist|playlist-backend|playlist-common|proxy-backend|puppetdb|rollbar|rollbar-backend|sentry|shortcuts|splunk-on-call|stack-overflow|stack-overflow-backend|stackstorm|tech-radar|tech-radar-2|todo|todo-backend|xcmetrics)'",
"build:api-docs": "LANG=en_EN yarn build:api-reports --docs --exclude 'plugins/@(api-docs|api-docs-module-protoc-gen-doc|app-visualizer|catalog-graph|catalog-import|catalog-unprocessed-entities|config-schema|example-todo-list|example-todo-list-backend)'",
"build:api-reports": "yarn build:api-reports:only --tsc",
"build:api-reports:only": "LANG=en_US.UTF-8 NODE_OPTIONS=--max-old-space-size=8192 backstage-repo-tools api-reports --sql-reports --allow-warnings 'packages/backend-app-api,packages/core-components,plugins/+(catalog|catalog-import|git-release-manager|jenkins|kubernetes)' -o ae-undocumented,ae-wrong-input-file-type --validate-release-tags",
"build:api-reports:only": "LANG=en_US.UTF-8 NODE_OPTIONS=--max-old-space-size=8192 backstage-repo-tools api-reports --sql-reports --allow-warnings 'packages/backend-app-api,packages/core-components,plugins/+(catalog|catalog-import|kubernetes)' -o ae-undocumented,ae-wrong-input-file-type --validate-release-tags",
"build:backend": "yarn workspace example-backend build",
"build:knip-reports": "backstage-repo-tools knip-reports",
"build:plugins-report": "node ./scripts/build-plugins-report",
@@ -101,15 +102,20 @@
"@changesets/assemble-release-plan@^6.0.0": "patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch",
"@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch",
"@material-ui/pickers@^3.3.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch",
"@storybook/react@npm:9.1.5": "patch:@storybook/react@npm%3A9.1.5#~/.yarn/patches/@storybook-react-npm-9.1.5-2331f18b6b.patch",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"@yarnpkg/plugin-npm@npm:^3.1.0": "patch:@yarnpkg/plugin-npm@npm%3A3.1.0#~/.yarn/patches/@yarnpkg-plugin-npm-npm-3.1.0-6533d0f5a1.patch",
"ast-types@0.14.2": "patch:ast-types@npm%3A0.14.2#./.yarn/patches/ast-types-npm-0.14.2-43c4ac4b0d.patch",
"ast-types@^0.14.1": "patch:ast-types@npm%3A0.14.2#./.yarn/patches/ast-types-npm-0.14.2-43c4ac4b0d.patch",
"ast-types@npm:0.14.2": "patch:ast-types@npm%3A0.16.1#./.yarn/patches/ast-types-npm-0.16.1-43c4ac4b0d.patch",
"ast-types@npm:^0.13.4": "patch:ast-types@npm%3A0.16.1#./.yarn/patches/ast-types-npm-0.16.1-43c4ac4b0d.patch",
"ast-types@npm:^0.16.1": "patch:ast-types@npm%3A0.16.1#./.yarn/patches/ast-types-npm-0.16.1-43c4ac4b0d.patch",
"csstype@npm:^3.0.2": "3.0.9",
"csstype@npm:^3.1.2": "3.0.9",
"csstype@npm:^3.1.3": "3.0.9",
"jest-haste-map@^29.7.0": "patch:jest-haste-map@npm%3A29.7.0#./.yarn/patches/jest-haste-map-npm-29.7.0-e3be419eff.patch"
"jest-haste-map@^29.7.0": "patch:jest-haste-map@npm%3A29.7.0#./.yarn/patches/jest-haste-map-npm-29.7.0-e3be419eff.patch",
"recast@npm:0.23.9>ast-types": "patch:ast-types@npm%3A0.16.1#./.yarn/patches/ast-types-npm-0.16.1-43c4ac4b0d.patch"
},
"dependencies": {
"@backstage/errors": "workspace:^",
@@ -129,13 +135,11 @@
"@octokit/rest": "^19.0.3",
"@playwright/test": "^1.32.3",
"@spotify/eslint-plugin": "^15.0.0",
"@storybook/addon-essentials": "^8.6.12",
"@storybook/addon-interactions": "^8.6.12",
"@storybook/addon-links": "^8.6.12",
"@storybook/addon-storysource": "^8.6.12",
"@storybook/addon-themes": "^8.6.12",
"@storybook/react": "^8.6.12",
"@storybook/react-vite": "^8.6.12",
"@storybook/addon-a11y": "^9.1.5",
"@storybook/addon-docs": "^9.1.5",
"@storybook/addon-links": "^9.1.5",
"@storybook/addon-themes": "^9.1.5",
"@storybook/react-vite": "^9.1.5",
"@techdocs/cli": "workspace:*",
"@types/cacheable-request": "^8.3.6",
"@types/memjs": "^1.3.3",
@@ -160,10 +164,10 @@
"shx": "^0.4.0",
"sloc": "^0.3.1",
"sort-package-json": "^2.8.0",
"storybook": "^8.6.12",
"storybook": "^9.1.5",
"typedoc": "^0.28.0",
"typescript": "~5.7.0",
"vite": "^7.1.2"
"vite": "^7.1.5"
},
"packageManager": "yarn@4.8.1",
"engines": {
+13
View File
@@ -1,5 +1,18 @@
# @backstage/app-defaults
## 1.7.0
### Minor Changes
- 9956704: Add and configure the OpenShift authentication provider to the default APIs.
### Patch Changes
- Updated dependencies
- @backstage/core-plugin-api@1.11.0
- @backstage/core-components@0.18.0
- @backstage/core-app-api@1.19.0
## 1.6.6-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/app-defaults",
"version": "1.6.6-next.0",
"version": "1.7.0",
"description": "Provides the default wiring of a Backstage App",
"backstage": {
"role": "web-library"
@@ -35,6 +35,7 @@ import {
FetchMiddlewares,
VMwareCloudAuth,
FrontendHostDiscovery,
OpenShiftAuth,
} from '@backstage/core-app-api';
import {
@@ -58,6 +59,7 @@ import {
bitbucketServerAuthApiRef,
atlassianAuthApiRef,
vmwareCloudAuthApiRef,
openshiftAuthApiRef,
} from '@backstage/core-plugin-api';
import {
permissionApiRef,
@@ -275,6 +277,22 @@ export const apis = [
});
},
}),
createApiFactory({
api: openshiftAuthApiRef,
deps: {
discoveryApi: discoveryApiRef,
oauthRequestApi: oauthRequestApiRef,
configApi: configApiRef,
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) => {
return OpenShiftAuth.create({
configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
});
},
}),
createApiFactory({
api: permissionApiRef,
deps: {
@@ -1,5 +1,13 @@
# app-next-example-plugin
## 0.0.27
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.12.0
- @backstage/core-components@0.18.0
## 0.0.27-next.0
### Patch Changes
@@ -4,6 +4,6 @@
| Name | Location | Severity |
| :---------- | :----------- | :------- |
| cross-fetch | package.json | error |
| msw | package.json | error |
| cross-fetch | packages/app-next-example-plugin/package.json | error |
| msw | packages/app-next-example-plugin/package.json | error |
@@ -1,6 +1,6 @@
{
"name": "app-next-example-plugin",
"version": "0.0.27-next.0",
"version": "0.0.27",
"description": "Backstage internal example plugin",
"backstage": {
"role": "frontend-plugin",
+68
View File
@@ -1,5 +1,73 @@
# example-app-next
## 0.0.27
### Patch Changes
- Updated dependencies
- @backstage/cli@0.34.2
- @backstage/ui@0.7.1
- @backstage/plugin-techdocs@1.15.0
- @backstage/plugin-catalog-react@1.21.0
- @backstage/plugin-notifications@0.5.9
- @backstage/app-defaults@1.7.0
- @backstage/plugin-catalog-graph@0.5.0
- @backstage/plugin-org@0.6.44
- @backstage/plugin-techdocs-react@1.3.3
- @backstage/frontend-plugin-api@0.12.0
- @backstage/plugin-auth-react@0.1.19
- @backstage/plugin-auth@0.1.0
- @backstage/plugin-home@0.8.12
- @backstage/core-plugin-api@1.11.0
- @backstage/plugin-scaffolder@1.34.1
- @backstage/plugin-app@0.3.0
- @backstage/plugin-user-settings@0.8.26
- @backstage/plugin-catalog@1.31.3
- @backstage/core-components@0.18.0
- @backstage/frontend-app-api@0.13.0
- @backstage/frontend-defaults@0.3.1
- @backstage/core-compat-api@0.5.2
- @backstage/plugin-scaffolder-react@1.19.1
- @backstage/core-app-api@1.19.0
- @backstage/plugin-api-docs@0.12.11
- @backstage/plugin-app-visualizer@0.1.23
- @backstage/plugin-catalog-import@0.13.5
- @backstage/plugin-catalog-unprocessed-entities@0.2.21
- @backstage/plugin-kubernetes@0.12.11
- @backstage/plugin-search@1.4.30
- @backstage/plugin-search-react@1.9.4
- @backstage/plugin-signals@0.0.23
- @backstage/plugin-techdocs-module-addons-contrib@1.1.28
- @backstage/integration-react@1.2.10
- @backstage/plugin-kubernetes-cluster@0.0.29
## 0.0.27-next.2
### Patch Changes
- Updated dependencies
- @backstage/ui@0.7.1-next.0
- @backstage/plugin-auth-react@0.1.19-next.1
- @backstage/plugin-auth@0.1.0-next.0
- @backstage/plugin-home@0.8.12-next.2
- @backstage/plugin-scaffolder@1.34.1-next.2
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/plugin-user-settings@0.8.26-next.2
- @backstage/plugin-scaffolder-react@1.19.1-next.2
- @backstage/plugin-catalog@1.31.3-next.2
- @backstage/cli@0.34.2-next.2
- @backstage/plugin-catalog-graph@0.4.23-next.2
- @backstage/plugin-catalog-import@0.13.5-next.2
- @backstage/plugin-org@0.6.44-next.2
- @backstage/plugin-techdocs@1.14.2-next.2
- @backstage/core-compat-api@0.5.2-next.2
- @backstage/plugin-api-docs@0.12.11-next.2
- @backstage/plugin-kubernetes@0.12.11-next.2
- @backstage/plugin-kubernetes-cluster@0.0.29-next.2
- @backstage/plugin-search@1.4.30-next.2
- @backstage/plugin-techdocs-module-addons-contrib@1.1.28-next.0
## 0.0.27-next.1
### Patch Changes
-1
View File
@@ -4,7 +4,6 @@ app:
routes:
bindings:
catalog.viewTechDoc: techdocs.docRoot
catalog.createComponent: catalog-import.importPage
org.catalogIndex: catalog.catalogIndex
pluginOverrides:
+31 -31
View File
@@ -4,40 +4,40 @@
| Name | Location | Severity |
| :----------------------------------------------- | :----------- | :------- |
| @backstage/plugin-techdocs-module-addons-contrib | package.json | error |
| @backstage/plugin-catalog-unprocessed-entities | package.json | error |
| @backstage/plugin-kubernetes-cluster | package.json | error |
| @backstage/plugin-permission-react | package.json | error |
| @backstage/plugin-scaffolder-react | package.json | error |
| @backstage/plugin-catalog-common | package.json | error |
| @backstage/plugin-techdocs-react | package.json | error |
| @backstage/plugin-catalog-graph | package.json | error |
| @backstage/plugin-search-common | package.json | error |
| @backstage/plugin-search-react | package.json | error |
| @backstage/integration-react | package.json | error |
| @backstage/plugin-auth-react | package.json | error |
| @backstage/plugin-scaffolder | package.json | error |
| @backstage/core-plugin-api | package.json | error |
| @backstage/plugin-api-docs | package.json | error |
| @backstage/plugin-catalog | package.json | error |
| @backstage/plugin-signals | package.json | error |
| @backstage/app-defaults | package.json | error |
| @backstage/plugin-app | package.json | error |
| @backstage/plugin-org | package.json | error |
| @backstage/config | package.json | error |
| @material-ui/lab | package.json | error |
| zen-observable | package.json | error |
| @octokit/rest | package.json | error |
| react-use | package.json | error |
| history | package.json | error |
| @backstage/plugin-techdocs-module-addons-contrib | packages/app-next/package.json | error |
| @backstage/plugin-catalog-unprocessed-entities | packages/app-next/package.json | error |
| @backstage/plugin-kubernetes-cluster | packages/app-next/package.json | error |
| @backstage/plugin-permission-react | packages/app-next/package.json | error |
| @backstage/plugin-scaffolder-react | packages/app-next/package.json | error |
| @backstage/plugin-catalog-common | packages/app-next/package.json | error |
| @backstage/plugin-techdocs-react | packages/app-next/package.json | error |
| @backstage/plugin-catalog-graph | packages/app-next/package.json | error |
| @backstage/plugin-search-common | packages/app-next/package.json | error |
| @backstage/plugin-search-react | packages/app-next/package.json | error |
| @backstage/integration-react | packages/app-next/package.json | error |
| @backstage/plugin-auth-react | packages/app-next/package.json | error |
| @backstage/plugin-scaffolder | packages/app-next/package.json | error |
| @backstage/core-plugin-api | packages/app-next/package.json | error |
| @backstage/plugin-api-docs | packages/app-next/package.json | error |
| @backstage/plugin-catalog | packages/app-next/package.json | error |
| @backstage/plugin-signals | packages/app-next/package.json | error |
| @backstage/app-defaults | packages/app-next/package.json | error |
| @backstage/plugin-app | packages/app-next/package.json | error |
| @backstage/plugin-org | packages/app-next/package.json | error |
| @backstage/config | packages/app-next/package.json | error |
| @material-ui/lab | packages/app-next/package.json | error |
| zen-observable | packages/app-next/package.json | error |
| @octokit/rest | packages/app-next/package.json | error |
| react-use | packages/app-next/package.json | error |
| history | packages/app-next/package.json | error |
## Unused devDependencies (5)
| Name | Location | Severity |
| :-------------------------- | :----------- | :------- |
| @testing-library/user-event | package.json | error |
| @types/zen-observable | package.json | error |
| @testing-library/dom | package.json | error |
| @types/jquery | package.json | error |
| cross-env | package.json | error |
| @testing-library/user-event | packages/app-next/package.json | error |
| @types/zen-observable | packages/app-next/package.json | error |
| @testing-library/dom | packages/app-next/package.json | error |
| @types/jquery | packages/app-next/package.json | error |
| cross-env | packages/app-next/package.json | error |
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
"version": "0.0.27-next.1",
"version": "0.0.27",
"backstage": {
"role": "frontend"
},
@@ -49,6 +49,7 @@
"@backstage/plugin-api-docs": "workspace:^",
"@backstage/plugin-app": "workspace:^",
"@backstage/plugin-app-visualizer": "workspace:^",
"@backstage/plugin-auth": "workspace:^",
"@backstage/plugin-auth-react": "workspace:^",
"@backstage/plugin-catalog": "workspace:^",
"@backstage/plugin-catalog-common": "workspace:^",
+61
View File
@@ -1,5 +1,66 @@
# example-app
## 0.2.113
### Patch Changes
- Updated dependencies
- @backstage/cli@0.34.2
- @backstage/ui@0.7.1
- @backstage/plugin-techdocs@1.15.0
- @backstage/plugin-catalog-react@1.21.0
- @backstage/plugin-notifications@0.5.9
- @backstage/app-defaults@1.7.0
- @backstage/plugin-catalog-graph@0.5.0
- @backstage/plugin-org@0.6.44
- @backstage/plugin-techdocs-react@1.3.3
- @backstage/plugin-auth-react@0.1.19
- @backstage/plugin-home@0.8.12
- @backstage/core-plugin-api@1.11.0
- @backstage/plugin-scaffolder@1.34.1
- @backstage/plugin-user-settings@0.8.26
- @backstage/plugin-catalog@1.31.3
- @backstage/core-components@0.18.0
- @backstage/frontend-app-api@0.13.0
- @backstage/plugin-scaffolder-react@1.19.1
- @backstage/core-app-api@1.19.0
- @backstage/plugin-api-docs@0.12.11
- @backstage/plugin-catalog-import@0.13.5
- @backstage/plugin-catalog-unprocessed-entities@0.2.21
- @backstage/plugin-devtools@0.1.31
- @backstage/plugin-kubernetes@0.12.11
- @backstage/plugin-search@1.4.30
- @backstage/plugin-search-react@1.9.4
- @backstage/plugin-signals@0.0.23
- @backstage/plugin-techdocs-module-addons-contrib@1.1.28
- @backstage/integration-react@1.2.10
- @backstage/plugin-kubernetes-cluster@0.0.29
## 0.2.113-next.2
### Patch Changes
- Updated dependencies
- @backstage/ui@0.7.1-next.0
- @backstage/plugin-auth-react@0.1.19-next.1
- @backstage/plugin-home@0.8.12-next.2
- @backstage/plugin-scaffolder@1.34.1-next.2
- @backstage/plugin-catalog-react@1.21.0-next.2
- @backstage/core-components@0.17.6-next.1
- @backstage/plugin-user-settings@0.8.26-next.2
- @backstage/plugin-scaffolder-react@1.19.1-next.2
- @backstage/plugin-catalog@1.31.3-next.2
- @backstage/cli@0.34.2-next.2
- @backstage/plugin-catalog-graph@0.4.23-next.2
- @backstage/plugin-catalog-import@0.13.5-next.2
- @backstage/plugin-org@0.6.44-next.2
- @backstage/plugin-techdocs@1.14.2-next.2
- @backstage/plugin-api-docs@0.12.11-next.2
- @backstage/plugin-kubernetes@0.12.11-next.2
- @backstage/plugin-kubernetes-cluster@0.0.29-next.2
- @backstage/plugin-search@1.4.30-next.2
- @backstage/plugin-techdocs-module-addons-contrib@1.1.28-next.0
## 0.2.113-next.1
### Patch Changes
+12 -12
View File
@@ -4,26 +4,26 @@
| Name | Location | Severity |
| :------------------------------ | :----------- | :------- |
| @backstage/plugin-search-common | package.json | error |
| @backstage/plugin-auth-react | package.json | error |
| @backstage/frontend-app-api | package.json | error |
| @material-ui/lab | package.json | error |
| zen-observable | package.json | error |
| @octokit/rest | package.json | error |
| react-router | package.json | error |
| history | package.json | error |
| @backstage/plugin-search-common | packages/app/package.json | error |
| @backstage/plugin-auth-react | packages/app/package.json | error |
| @backstage/frontend-app-api | packages/app/package.json | error |
| @material-ui/lab | packages/app/package.json | error |
| zen-observable | packages/app/package.json | error |
| @octokit/rest | packages/app/package.json | error |
| react-router | packages/app/package.json | error |
| history | packages/app/package.json | error |
## Unused devDependencies (3)
| Name | Location | Severity |
| :-------------------------- | :----------- | :------- |
| @testing-library/user-event | package.json | error |
| @types/zen-observable | package.json | error |
| @types/jquery | package.json | error |
| @testing-library/user-event | packages/app/package.json | error |
| @types/zen-observable | packages/app/package.json | error |
| @types/jquery | packages/app/package.json | error |
## Unlisted dependencies (1)
| Name | Location | Severity |
| :---------- | :------------------------------------------------------- | :------- |
| @rjsf/utils | src/components/scaffolder/customScaffolderExtensions.tsx | error |
| @rjsf/utils | packages/app/src/components/scaffolder/customScaffolderExtensions.tsx | error |
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "example-app",
"version": "0.2.113-next.1",
"version": "0.2.113",
"backstage": {
"role": "frontend"
},
@@ -94,7 +94,7 @@
"@types/react": "*",
"@types/react-dom": "*",
"@types/zen-observable": "^0.8.0",
"axios": "^1.11.0",
"axios": "^1.12.0",
"cross-env": "^7.0.0",
"msw": "^1.0.0"
},
-24
View File
@@ -14,18 +14,6 @@
* limitations under the License.
*/
import {
RELATION_API_CONSUMED_BY,
RELATION_API_PROVIDED_BY,
RELATION_CONSUMES_API,
RELATION_DEPENDENCY_OF,
RELATION_DEPENDS_ON,
RELATION_HAS_PART,
RELATION_OWNED_BY,
RELATION_OWNER_OF,
RELATION_PART_OF,
RELATION_PROVIDES_API,
} from '@backstage/catalog-model';
import { createApp } from '@backstage/app-defaults';
import { AppRouter, FeatureFlagged, FlatRoutes } from '@backstage/core-app-api';
import {
@@ -158,18 +146,6 @@ const routes = (
<CatalogGraphPage
initialState={{
selectedKinds: ['component', 'domain', 'system', 'api', 'group'],
selectedRelations: [
RELATION_OWNER_OF,
RELATION_OWNED_BY,
RELATION_CONSUMES_API,
RELATION_API_CONSUMED_BY,
RELATION_PROVIDES_API,
RELATION_API_PROVIDED_BY,
RELATION_HAS_PART,
RELATION_PART_OF,
RELATION_DEPENDS_ON,
RELATION_DEPENDENCY_OF,
],
}}
/>
}
+7
View File
@@ -23,6 +23,7 @@ import {
oneloginAuthApiRef,
bitbucketAuthApiRef,
bitbucketServerAuthApiRef,
openshiftAuthApiRef,
} from '@backstage/core-plugin-api';
export const providers = [
@@ -74,4 +75,10 @@ export const providers = [
message: 'Sign In using Bitbucket Server',
apiRef: bitbucketServerAuthApiRef,
},
{
id: 'openshift-auth-provider',
title: 'OpenShift',
message: 'Sign In using OpenShift',
apiRef: openshiftAuthApiRef,
},
];
+7
View File
@@ -1,5 +1,12 @@
# @backstage/backend-app-api
## 1.2.7
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.4.3
## 1.2.7-next.0
### Patch Changes
+1 -1
View File
@@ -4,5 +4,5 @@
| Name | Location | Severity |
| :-------------------------- | :----------- | :------- |
| @backstage/backend-defaults | package.json | error |
| @backstage/backend-defaults | packages/backend-app-api/package.json | error |
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-app-api",
"version": "1.2.7-next.0",
"version": "1.2.7",
"description": "Core API used by Backstage backend apps",
"backstage": {
"role": "node-library"
+33
View File
@@ -1,5 +1,38 @@
# @backstage/backend-defaults
## 0.12.1
### Patch Changes
- 33bd4d0: Deduplicate discovered features discovered with discoveryFeatureLoader
- 4eda590: Fixed cache namespace and key prefix separator configuration to properly use configured values instead of hardcoded plugin ID. The cache manager now correctly combines the configured namespace with plugin IDs using the configured separator for Redis and Valkey. Memcache and memory store continue to use plugin ID as namespace.
- f244e61: Add `backend.logger` config options to configure the `RootLoggerService`.
Read more about the new configuration options in the
[Root Logger Service](https://backstage.io/docs/backend-system/core-services/root-logger/)
documentation.
- Updated dependencies
- @backstage/config-loader@1.10.3
- @backstage/plugin-auth-node@0.6.7
- @backstage/plugin-events-node@0.4.15
- @backstage/integration@1.18.0
- @backstage/types@1.2.2
- @backstage/backend-app-api@1.2.7
- @backstage/backend-plugin-api@1.4.3
- @backstage/plugin-permission-node@0.10.4
## 0.12.1-next.1
### Patch Changes
- 4eda590: Fixed cache namespace and key prefix separator configuration to properly use configured values instead of hardcoded plugin ID. The cache manager now correctly combines the configured namespace with plugin IDs using the configured separator for Redis and Valkey. Memcache and memory store continue to use plugin ID as namespace.
- Updated dependencies
- @backstage/config-loader@1.10.3-next.0
- @backstage/plugin-auth-node@0.6.7-next.1
- @backstage/integration@1.18.0-next.0
- @backstage/integration-aws-node@0.1.17
## 0.12.1-next.0
### Patch Changes
+61 -1
View File
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import { HumanDuration } from '@backstage/types';
import { HumanDuration, JsonObject } from '@backstage/types';
export interface Config {
app: {
@@ -985,6 +985,66 @@ export interface Config {
headers?: { [name: string]: string };
};
/**
* Options to configure the default RootLoggerService.
*/
logger?: {
/**
* Configures the global log level for messages.
*
* This can also be configured using the LOG_LEVEL environment variable, which
* takes precedence over this configuration.
*
* Defaults to 'info'.
*/
level?: 'debug' | 'info' | 'warn' | 'error';
/**
* Additional metadata to include with every log entry.
*/
meta?: JsonObject;
/**
* List of logger overrides.
*
* Can be used to configure a different level for logs matching certain criterias.
* For example, it can be used to ignore 'info' logs of given plugins.
*
* @example
*
* ```yaml
* logger:
* level: info
* overrides:
* # For catalog and auth plugins, messages less important than 'warn' will be ignored.
* - matchers:
* plugin: [catalog, auth]
* level: warn
* # Ignore all messages that starts with 'Forget'
* - matchers:
* message: '/^Forget/'
* level: warn
* ```
*/
overrides?: Array<{
/**
* Conditions that must be met to override the log level.
*
* A matcher can be:
*
* - A string (exact match or regex pattern delimited by slashes, e.g. `/pattern/`)
* - A non-string value (compared by strict equality)
* - An array of matchers (returns true if any matcher matches)
*/
matchers: JsonObject;
/**
* Log level to use for matched entries.
*/
level: 'debug' | 'info' | 'warn' | 'error';
}>;
};
/**
* Rate limiting options. Defining this as `true` will enable rate limiting with default values.
*/
+3 -3
View File
@@ -4,12 +4,12 @@
| Name | Location | Severity |
| :------------- | :----------- | :------- |
| better-sqlite3 | package.json | error |
| mysql2 | package.json | error |
| better-sqlite3 | packages/backend-defaults/package.json | error |
| mysql2 | packages/backend-defaults/package.json | error |
## Referenced optional peerDependencies (1)
| Name | Location | Severity |
| :-------------------------------- | :----------- | :------- |
| @google-cloud/cloud-sql-connector | package.json | error |
| @google-cloud/cloud-sql-connector | packages/backend-defaults/package.json | error |
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-defaults",
"version": "0.12.1-next.0",
"version": "0.12.1",
"description": "Backend defaults used by Backstage backend apps",
"backstage": {
"role": "node-library"
@@ -3,8 +3,10 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { config } from 'winston';
import { Format } from 'logform';
import { JsonObject } from '@backstage/types';
import { JsonPrimitive } from '@backstage/types';
import { LoggerService } from '@backstage/backend-plugin-api';
import { RootLoggerService } from '@backstage/backend-plugin-api';
import { ServiceFactory } from '@backstage/backend-plugin-api';
@@ -31,14 +33,31 @@ export class WinstonLogger implements RootLoggerService {
error(message: string, meta?: JsonObject): void;
// (undocumented)
info(message: string, meta?: JsonObject): void;
static logLevelFilter(defaultLogLevel: keyof config.NpmConfigSetLevels): {
format: Format;
setOverrides: (overrides: WinstonLoggerLevelOverride[]) => void;
};
static redacter(): {
format: Format;
add: (redactions: Iterable<string>) => void;
};
// (undocumented)
setLevelOverrides(overrides: WinstonLoggerLevelOverride[]): void;
// (undocumented)
warn(message: string, meta?: JsonObject): void;
}
// @public (undocumented)
export type WinstonLoggerLevelOverride = {
matchers: WinstonLoggerLevelOverrideMatchers;
level: string;
};
// @public (undocumented)
export type WinstonLoggerLevelOverrideMatchers = {
[key: string]: JsonPrimitive | JsonPrimitive[] | undefined;
};
// @public (undocumented)
export interface WinstonLoggerOptions {
// (undocumented)
@@ -175,6 +175,6 @@ export class PackageDiscoveryService {
}
}
return { features };
return { features: Array.from(new Set(features)) };
}
}
@@ -333,4 +333,147 @@ describe('CacheManager store options', () => {
keyPrefixSeparator: '!',
});
});
it('correctly applies namespace configuration to redis and valkey stores', () => {
const testCases = [
{ store: 'redis', namespace: 'test1', separator: ':' },
{ store: 'valkey', namespace: 'test2', separator: '!' },
];
testCases.forEach(({ store, namespace, separator }) => {
const manager = CacheManager.fromConfig(
mockServices.rootConfig({
data: {
backend: {
cache: {
store,
connection: 'redis://localhost:6379',
[store]: {
client: {
namespace,
keyPrefixSeparator: separator,
},
},
},
},
},
}),
);
manager.forPlugin('testPlugin');
if (store === 'redis') {
// eslint-disable-next-line jest/no-conditional-expect
expect(KeyvRedis).toHaveBeenCalledWith('redis://localhost:6379', {
namespace,
keyPrefixSeparator: separator,
});
} else if (store === 'valkey') {
// eslint-disable-next-line jest/no-conditional-expect
expect(KeyvValkey).toHaveBeenCalledWith('redis://localhost:6379', {
namespace,
keyPrefixSeparator: separator,
});
}
});
});
it('falls back to pluginId when no namespace is configured', () => {
const manager = CacheManager.fromConfig(
mockServices.rootConfig({
data: {
backend: {
cache: {
store: 'redis',
connection: 'redis://localhost:6379',
},
},
},
}),
);
manager.forPlugin('testPlugin');
expect(KeyvRedis).toHaveBeenCalledWith('redis://localhost:6379', {
keyPrefixSeparator: ':',
});
});
describe('Namespace construction', () => {
it('returns pluginId when no store options are provided', () => {
const result = (CacheManager as any).constructNamespace(
'testPlugin',
undefined,
);
expect(result).toBe('testPlugin');
});
it('returns pluginId when store options have no namespace', () => {
const storeOptions = {
client: {
keyPrefixSeparator: ':',
},
};
const result = (CacheManager as any).constructNamespace(
'testPlugin',
storeOptions,
);
expect(result).toBe('testPlugin');
});
it('combines namespace and pluginId with default separator', () => {
const storeOptions = {
client: {
namespace: 'my-app',
keyPrefixSeparator: ':',
},
};
const result = (CacheManager as any).constructNamespace(
'testPlugin',
storeOptions,
);
expect(result).toBe('my-app:testPlugin');
});
it('combines namespace and pluginId with custom separator', () => {
const storeOptions = {
client: {
namespace: 'my-app',
keyPrefixSeparator: '-',
},
};
const result = (CacheManager as any).constructNamespace(
'testPlugin',
storeOptions,
);
expect(result).toBe('my-app-testPlugin');
});
it('uses default separator when keyPrefixSeparator is not provided', () => {
const storeOptions = {
client: {
namespace: 'my-app',
},
};
const result = (CacheManager as any).constructNamespace(
'testPlugin',
storeOptions,
);
expect(result).toBe('my-app:testPlugin');
});
it('handles empty namespace by falling back to pluginId', () => {
const storeOptions = {
client: {
namespace: '',
keyPrefixSeparator: ':',
},
};
const result = (CacheManager as any).constructNamespace(
'testPlugin',
storeOptions,
);
expect(result).toBe('testPlugin');
});
});
});
@@ -213,6 +213,26 @@ export class CacheManager {
return redisOptions;
}
/**
* Construct the full namespace based on the options and pluginId.
*
* @param pluginId - The plugin ID to namespace
* @param storeOptions - Optional cache store configuration options
* @returns The constructed namespace string combining the configured namespace with pluginId
*/
private static constructNamespace(
pluginId: string,
storeOptions: RedisCacheStoreOptions | undefined,
): string {
const prefix = storeOptions?.client?.namespace
? `${storeOptions.client.namespace}${
storeOptions.client.keyPrefixSeparator ?? ':'
}`
: '';
return `${prefix}${pluginId}`;
}
/** @internal */
constructor(
store: string,
@@ -286,7 +306,7 @@ export class CacheManager {
});
}
return new Keyv({
namespace: pluginId,
namespace: CacheManager.constructNamespace(pluginId, this.storeOptions),
ttl: defaultTtl,
store: stores[pluginId],
emitErrors: false,
@@ -326,7 +346,7 @@ export class CacheManager {
});
}
return new Keyv({
namespace: pluginId,
namespace: CacheManager.constructNamespace(pluginId, this.storeOptions),
ttl: defaultTtl,
store: stores[pluginId],
emitErrors: false,
@@ -118,4 +118,82 @@ describe('WinstonLogger', () => {
add([null as any, undefined as any, 'valid-secret']);
}).not.toThrow();
});
it('should filter logs below the default log level', () => {
const mockTransport = new Transport({
log: jest.fn(),
logv: jest.fn(),
});
const logger = WinstonLogger.create({
level: 'warn',
format: format.json(),
transports: [mockTransport],
});
logger.debug('debug log');
expect(mockTransport.log).not.toHaveBeenCalled();
});
it('should not filter logs below the default log level with an override', () => {
const mockTransport = new Transport({
log: jest.fn(),
logv: jest.fn(),
});
const logger = WinstonLogger.create({
level: 'warn',
format: format.json(),
transports: [mockTransport],
});
logger.setLevelOverrides([
{
matchers: {
plugin: 'catalog',
},
level: 'debug',
},
]);
logger.debug('debug log', { plugin: 'catalog' });
expect(mockTransport.log).toHaveBeenCalledWith(
expect.objectContaining({
[MESSAGE]: JSON.stringify({
level: 'debug',
message: 'debug log',
plugin: 'catalog',
}),
}),
expect.any(Function),
);
});
it('should filter logs above the default log level with an override', () => {
const mockTransport = new Transport({
log: jest.fn(),
logv: jest.fn(),
});
const logger = WinstonLogger.create({
level: 'debug',
format: format.json(),
transports: [mockTransport],
});
logger.setLevelOverrides([
{
matchers: {
plugin: 'catalog',
},
level: 'error',
},
]);
logger.info('info log', { plugin: 'catalog' });
expect(mockTransport.log).not.toHaveBeenCalled();
});
});

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