Merge branch 'master' into canon-menu

This commit is contained in:
Charles de Dreuille
2025-03-16 08:29:22 +00:00
492 changed files with 9993 additions and 1760 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': minor
---
`SimpleStepper` back button now works with `activeStep` property set higher than 0
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-search-backend-module-techdocs': patch
---
Added an extension point that allows for custom entity filtering during document collation.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend-module-gitlab': patch
---
fix: Creating a repository in a user namespace would always lead to an error
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-plugin-api': patch
---
Failure to lazy load an extension will now always result in an error being thrown to be forwarded to error boundaries, rather than being rendered using the `BootErrorPage` app component.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/canon': patch
---
Fix Button types that was preventing the use of native attributes like onClick.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-home': patch
---
The starred entities component uses the entity title or display name if it exists
+72
View File
@@ -0,0 +1,72 @@
---
'@backstage/plugin-scaffolder-node': minor
---
**DEPRECATION**: We've deprecated the old way of defining actions using `createTemplateAction` with raw `JSONSchema` and type parameters, as well as using `zod` through an import. You can now use the new format to define `createTemplateActions` with `zod` provided by the framework. This change also removes support for `logStream` in the `context` as well as moving the `logger` to an instance of `LoggerService`.
Before:
```ts
createTemplateAction<{ repoUrl: string }, { test: string }>({
id: 'test',
schema: {
input: {
type: 'object',
required: ['repoUrl'],
properties: {
repoUrl: { type: 'string' },
},
},
output: {
type: 'object',
required: ['test'],
properties: {
test: { type: 'string' },
},
},
},
handler: async ctx => {
ctx.logStream.write('blob');
},
});
// or
createTemplateAction({
id: 'test',
schema: {
input: z.object({
repoUrl: z.string(),
}),
output: z.object({
test: z.string(),
}),
},
handler: async ctx => {
ctx.logStream.write('something');
},
});
```
After:
```ts
createTemplateAction({
id: 'test',
schema: {
input: {
repoUrl: d => d.string(),
},
output: {
test: d => d.string(),
},
},
handler: async ctx => {
// you can just use ctx.logger.log('...'), or if you really need a log stream you can do this:
const logStream = new PassThrough();
logStream.on('data', chunk => {
ctx.logger.info(chunk.toString());
});
},
});
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-app-api': minor
---
The default auth injection middleware for the `FetchApi` will now also take configuration under `discovery.endpoints` into consideration when deciding whether to include credentials or not.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/frontend-plugin-api': minor
'@backstage/frontend-defaults': minor
'@backstage/frontend-app-api': patch
---
Introduced a `createFrontendFeatureLoader()` function, as well as a `FrontendFeatureLoader` interface, to gather several frontend plugins, modules or feature loaders in a single exported entrypoint and load them, possibly asynchronously. This new feature, very similar to the `createBackendFeatureLoader()` already available on the backend, supersedes the previous `CreateAppFeatureLoader` type which has been deprecated.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-permission-node': minor
---
**BREAKING** The `ServerPermissionClient` can no longer be instantiated with a `tokenManager` and must instead be instantiated with an `auth` service. If you are still on the legacy backend system, use `createLegacyAuthAdapters()` from `@backstage/backend-common` to create a compatible `auth` service.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/frontend-test-utils': patch
---
Added a `initialRouteEntries` option to `renderInTestApp`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/frontend-test-utils': patch
---
The `renderInTestApp` helper now provides a default mock config with mock values for both `app.baseUrl` and `backend.baseUrl`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/frontend-test-utils': minor
---
**BREAKING**: Removed deprecated `setupRequestMockHandlers` which was replaced by `registerMswTestHooks`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend-module-gitlab': patch
---
Made gitlab:repo:push action idempotent.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-node-test-utils': minor
---
Use update `createTemplateAction` kinds
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/frontend-defaults': minor
'@backstage/frontend-app-api': minor
'@backstage/core-compat-api': minor
---
**BREAKING**: Dropped support for the removed opaque `@backstage/ExtensionOverrides` and `@backstage/BackstagePlugin` types.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/frontend-plugin-api': minor
---
**BREAKING**: Removed the deprecated `ExtensionOverrides` and `FrontendFeature` types.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/frontend-plugin-api': minor
---
**BREAKING**: Removed deprecated variant of `createExtensionDataRef` where the ID is passed directly.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-test-utils': patch
---
Added support for PostgreSQL version 17
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': minor
---
Declared CancelIcon explicitly on Chip component inside Select.tsx to disable onMouseDown event by default that creates the flaw of re-opening select component when user tries to remove a selected filter.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-search': patch
---
Expand the default kind filter to include all kinds from the System Model.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-compat-api': patch
---
Improved route path normalization when converting existing route elements in `converLegacyApp`, for example handling trailing `/*` in paths.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': minor
---
Support new `createTemplateAction` type, and convert `catalog:fetch` action to new way of defining actions.
+32
View File
@@ -0,0 +1,32 @@
---
'@backstage/app-defaults': minor
---
**BREAKING**: The default `DiscoveryApi` implementation has been switched to use `FrontendHostDiscovery`, which adds support for the `discovery.endpoints` configuration.
This is marked as a breaking change because it will cause any existing `discovery.endpoints` configuration to be picked up and used, which may break existing setups.
For example, consider the following configuration:
```yaml
app:
baseUrl: https://backstage.acme.org
backend:
baseUrl: https://backstage.internal.acme.org
discovery:
endpoints:
- target: https://catalog.internal.acme.org/api/{{pluginId}}
plugins: [catalog]
```
This will now cause requests from the frontend towards the `catalog` plugin to be routed to `https://catalog.internal.acme.org/api/catalog`, but this might not be reachable from the frontend. To fix this, you should update the `discovery.endpoints` configuration to only override the internal URL of the plugin:
```yaml
discovery:
endpoints:
- target:
internal: https://catalog.internal.acme.org/api/{{pluginId}}
plugins: [catalog]
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Internal change to migrate `lint` to the new module system.
+55
View File
@@ -198,67 +198,122 @@
},
"changesets": [
"angry-plants-peel",
"brave-ears-bow",
"brave-wasps-fry",
"breezy-socks-cross",
"bright-pets-agree",
"calm-bottles-rest",
"calm-files-hunt",
"catch-you-mamma",
"chatty-turkeys-brake",
"chilled-bugs-draw",
"chilled-rocks-rule",
"cool-moons-lay",
"create-app-1740489353",
"create-app-1741106897",
"cuddly-apricots-fetch",
"dependabot-64f57a3",
"dirty-turkeys-remain",
"dull-coats-help",
"dull-olives-itch",
"early-buses-lick",
"fair-pianos-add",
"fair-rabbits-greet",
"famous-ladybugs-swim",
"famous-wombats-explain",
"fluffy-ghosts-drop",
"four-badgers-buy",
"four-readers-vanish",
"friendly-garlics-explain",
"gentle-lemons-explain",
"gentle-students-glow",
"giant-phones-melt",
"gold-donkeys-flow",
"good-lions-tease",
"gorgeous-keys-shop",
"grumpy-humans-brush",
"hip-ladybugs-behave",
"honest-ravens-stare",
"hungry-walls-pump",
"itchy-houses-whisper",
"itchy-moose-raise",
"itchy-schools-camp",
"itchy-shoes-rest",
"kind-paws-visit",
"kind-waves-impress",
"late-hairs-kneel",
"lazy-apricots-whisper",
"lazy-deers-dance",
"light-turtles-talk",
"loud-clocks-obey",
"lucky-ducks-attend",
"many-insects-add",
"many-rockets-marry",
"many-wolves-own",
"mira-color-like",
"nasty-lemons-scream",
"nervous-cups-happen",
"nice-dolphins-own",
"nice-ghosts-clean",
"nine-hounds-rest",
"ninety-experts-cheat",
"ninety-teachers-tease",
"old-avocados-grow",
"old-ladybugs-report",
"olive-carrots-move",
"olive-dodos-applaud",
"olive-dragons-guess",
"olive-planes-pay",
"poor-bats-retire",
"poor-phones-switch",
"popular-bobcats-occur",
"pretty-chicken-eat",
"quick-schools-grin",
"real-hounds-mate",
"real-turkeys-hunt",
"red-hotels-destroy",
"renovate-e8e0621",
"rich-berries-glow",
"rich-sloths-hang",
"rotten-bees-design",
"selfish-cheetahs-sip",
"shiny-ways-develop",
"short-moose-attend",
"shy-geckos-leave",
"shy-knives-matter",
"silly-otters-hang",
"silly-taxis-suffer",
"silver-camels-brake",
"silver-fishes-shop",
"six-shrimps-breathe",
"six-taxis-film",
"six-teachers-prove",
"sixty-ducks-bathe",
"slimy-rockets-jog",
"small-onions-live",
"smart-pens-change",
"stale-frogs-wonder",
"strange-eels-turn",
"strange-masks-type",
"sweet-zoos-beam",
"swift-rings-switch",
"swift-worms-behave",
"tall-falcons-juggle",
"tall-meals-prove",
"techdocs-four-needles-switch",
"techdocs-late-ants-remain",
"techdocs-slow-zebras-camp",
"ten-impalas-hope",
"thick-deers-destroy",
"thin-books-rest",
"thin-experts-sing",
"thin-steaks-trade",
"three-bears-heal",
"tidy-ads-cover",
"tiny-llamas-boil",
"unlucky-cups-sell",
"weak-lemons-sing",
"wicked-dancers-count",
"young-gifts-know"
]
}
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-scaffolder': patch
'@backstage/plugin-scaffolder-react': patch
---
Disable the submit button on creating
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-react': patch
---
Updated dependency `flatted` to `3.3.3`.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/core-app-api': minor
'@backstage/backend-defaults': patch
---
The `discovery.endpoints` configuration no longer requires both `internal` and `external` target when using the object form, instead falling back to the default.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/core-components': patch
---
Avoid Layout Shift for `DismissableBanner` when using a `storageApi` with latency (e.g. `user-settings-backend`)
Properly handle the `unknown` state of the `storageApi`. There's a trade-off: this may lead to some Layout Shift if the banner has not been dismissed, but once it has been dismissed, you won't have any.
+14
View File
@@ -0,0 +1,14 @@
---
'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch
'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
'@backstage/plugin-scaffolder-backend-module-bitbucket': patch
'@backstage/plugin-scaffolder-backend-module-gerrit': patch
'@backstage/plugin-scaffolder-backend-module-gitlab': patch
'@backstage/plugin-scaffolder-backend-module-azure': patch
'@backstage/plugin-scaffolder-backend-module-gitea': patch
'@backstage/plugin-scaffolder-backend': patch
'@backstage/plugin-scaffolder-node': patch
'@backstage/integration': patch
---
Allow signing git commits using configured private PGP key in scaffolder
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-compat-api': patch
---
Added the `entityPage` option to `convertLegacyApp`, which you can read more about in the [app migration docs](https://backstage.io/docs/frontend-system/building-apps/migrating#entity-pages).
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
---
Fixing spelling mistake in `jsonschema`
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-auth-backend-module-oauth2-provider': patch
'@backstage/plugin-auth-backend-module-oidc-provider': patch
'@backstage/plugin-auth-backend-module-okta-provider': patch
---
Fixed repository url in `README.md`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/canon': minor
---
Updating styles for Text and Link components as well as global surface tokens.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-events-backend': patch
'@backstage/plugin-events-node': patch
---
add `addHttpPostBodyParser` to events extension to allow body parse customization. This feature will enhance flexibility in handling HTTP POST requests in event-related operations.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Fixed bug in fs:delete causing no files to be deleted on windows machines
@@ -74,7 +74,7 @@ jobs:
- name: Cache Comment
if: ${{ steps.event.outputs.ACTION != 'closed' }}
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2
with:
path: comment.md
key: ${{ steps.hash.outputs.COMMENT_FILE_HASH }}
+6 -6
View File
@@ -161,8 +161,8 @@ jobs:
name: Test ${{ matrix.node-version }}
services:
postgres16:
image: postgres:16
postgres17:
image: postgres:17
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -172,8 +172,8 @@ jobs:
--health-retries 5
ports:
- 5432/tcp
postgres12:
image: postgres:12
postgres13:
image: postgres:13
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -253,8 +253,8 @@ jobs:
run: yarn backstage-cli repo test --maxWorkers=3 --workerIdleMemoryLimit=1300M --since origin/master --successCache --successCacheDir .cache/backstage-cli
env:
BACKSTAGE_TEST_DISABLE_DOCKER: 1
BACKSTAGE_TEST_DATABASE_POSTGRES16_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres16.ports[5432] }}
BACKSTAGE_TEST_DATABASE_POSTGRES12_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres12.ports[5432] }}
BACKSTAGE_TEST_DATABASE_POSTGRES17_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres17.ports[5432] }}
BACKSTAGE_TEST_DATABASE_POSTGRES13_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres13.ports[5432] }}
BACKSTAGE_TEST_DATABASE_MYSQL8_CONNECTION_STRING: mysql://root:root@localhost:${{ job.services.mysql8.ports[3306] }}/ignored
BACKSTAGE_TEST_CACHE_REDIS7_CONNECTION_STRING: redis://localhost:${{ job.services.redis.ports[6379] }}
+6 -6
View File
@@ -16,8 +16,8 @@ jobs:
node-version: [20.x, 22.x]
services:
postgres16:
image: postgres:16
postgres17:
image: postgres:17
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -27,8 +27,8 @@ jobs:
--health-retries 5
ports:
- 5432/tcp
postgres12:
image: postgres:12
postgres13:
image: postgres:13
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -122,8 +122,8 @@ jobs:
yarn backstage-cli repo test --maxWorkers=3 --workerIdleMemoryLimit=1300M --coverage --successCache --successCacheDir .cache/backstage-cli
env:
BACKSTAGE_TEST_DISABLE_DOCKER: 1
BACKSTAGE_TEST_DATABASE_POSTGRES16_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres16.ports[5432] }}
BACKSTAGE_TEST_DATABASE_POSTGRES12_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres12.ports[5432] }}
BACKSTAGE_TEST_DATABASE_POSTGRES17_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres17.ports[5432] }}
BACKSTAGE_TEST_DATABASE_POSTGRES13_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres13.ports[5432] }}
BACKSTAGE_TEST_DATABASE_MYSQL8_CONNECTION_STRING: mysql://root:root@localhost:${{ job.services.mysql8.ports[3306] }}/ignored
BACKSTAGE_TEST_CACHE_REDIS7_CONNECTION_STRING: redis://localhost:${{ job.services.redis.ports[6379] }}
+1 -1
View File
@@ -67,6 +67,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: 'Upload to code-scanning'
uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
uses: github/codeql-action/upload-sarif@6bb031afdd8eb862ea3fc1848194185e076637e5 # v3.28.11
with:
sarif_file: results.sarif
+1 -1
View File
@@ -58,6 +58,6 @@ jobs:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
NODE_OPTIONS: --max-old-space-size=7168
- name: Upload Snyk report
uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
uses: github/codeql-action/upload-sarif@6bb031afdd8eb862ea3fc1848194185e076637e5 # v3.28.11
with:
sarif_file: snyk.sarif
+3 -3
View File
@@ -55,7 +55,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
uses: github/codeql-action/init@6bb031afdd8eb862ea3fc1848194185e076637e5 # v3.28.11
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -66,7 +66,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
uses: github/codeql-action/autobuild@6bb031afdd8eb862ea3fc1848194185e076637e5 # v3.28.11
# ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -80,4 +80,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
uses: github/codeql-action/analyze@6bb031afdd8eb862ea3fc1848194185e076637e5 # v3.28.11
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
services:
postgres:
image: postgres:12
image: postgres:13
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
-1
View File
@@ -132,7 +132,6 @@ Scope: Tooling and Community Repo Maintainers for the Backstage [Community Plugi
| André Wanlin | Spotify | [awanlin](https://github.com/awanlin) | `ahhhndre` |
| Bethany Griggs | Red Hat | [BethGriggs](https://github.com/BethGriggs) | `bethgriggs` |
| Kashish Mittal | Red Hat | [04kash](https://github.com/04kash) | `kashh._.` |
| Nick Boldt | Red Hat | [nickboldt](https://github.com/nickboldt) | `nboldt` |
| Vincenzo Scamporlino | Spotify | [vinzscam](https://github.com/vinzscam) | `vinzscam` |
### Events
+1 -1
View File
@@ -66,7 +66,7 @@ Si vous voulez contribuer et vous impliquer dans notre communauté, voici les re
## Licence
Copyright 2020-2024 © Les auteurs de Backstage. Tous droits réservés. La Linux Foundation détient des marques déposées et utilise des marques commerciales. Pour une liste des marques de commerce de la Linux Foundation, veuillez consulter notre page d'utilisation des marques: https://www.linuxfoundation.org/trademark-usage
Copyright 2020-2025 © Les auteurs de Backstage. Tous droits réservés. La Linux Foundation détient des marques déposées et utilise des marques commerciales. Pour une liste des marques de commerce de la Linux Foundation, veuillez consulter notre page d'utilisation des marques: https://www.linuxfoundation.org/trademark-usage
Sous licence Apache, version 2.0: http://www.apache.org/licenses/LICENSE-2.0
+1 -1
View File
@@ -65,7 +65,7 @@ Backstage의 문서는 다음을 포함합니다:
## License
Copyright 2020-2024 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage
Copyright 2020-2025 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage
Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
+1 -1
View File
@@ -65,7 +65,7 @@ Backstage 的文档包括:
## 许可
版权所有 2020-2024 © Backstage 作者。版权所有。Linux 基金会已注册商标并使用商标。有关 Linux 基金会的商标列表,请参阅我们的商标使用页面:https://www.linuxfoundation.org/trademark-usage
版权所有 2020-2025 © Backstage 作者。版权所有。Linux 基金会已注册商标并使用商标。有关 Linux 基金会的商标列表,请参阅我们的商标使用页面:https://www.linuxfoundation.org/trademark-usage
采用 Apache v2.0 许可:http://www.apache.org/licenses/LICENSE-2.0
+1 -1
View File
@@ -69,7 +69,7 @@ See the [GOVERNANCE.md](https://github.com/backstage/community/blob/main/GOVERNA
## License
Copyright 2020-2024 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage
Copyright 2020-2025 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage
Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
+33 -24
View File
@@ -154,30 +154,36 @@ export function createGithubRepoCreateAction(options: {
username: owner,
});
await ctx.checkpoint('repo.creation', async () => {
const repoCreationPromise =
user.data.type === 'Organization'
? client.rest.repos.createInOrg({
name: repo,
org: owner,
})
: client.rest.repos.createForAuthenticatedUser({
name: repo,
});
const { repoUrl } = await repoCreationPromise;
return { repoUrl };
await ctx.checkpoint({
key: 'repo.creation.v1',
fn: async () => {
const repoCreationPromise =
user.data.type === 'Organization'
? client.rest.repos.createInOrg({
name: repo,
org: owner,
})
: client.rest.repos.createForAuthenticatedUser({
name: repo,
});
const { repoUrl } = await repoCreationPromise;
return { repoUrl };
},
});
if (secrets) {
await ctx.checkpoint('repo.create.variables', async () => {
for (const [key, value] of Object.entries(repoVariables ?? {})) {
await client.rest.actions.createRepoVariable({
owner,
repo,
name: key,
value: value,
});
}
await ctx.checkpoint({
key: 'repo.create.variables',
fn: async () => {
for (const [key, value] of Object.entries(repoVariables ?? {})) {
await client.rest.actions.createRepoVariable({
owner,
repo,
name: key,
value: value,
});
}
},
});
}
@@ -202,9 +208,12 @@ Checkpoints will allow action authors to create actions where code paths are ign
This will be provided on a context object and action of author provide a key and a callback.
```typescript
await ctx.checkpoint('repo.creation', async () => {
const { repoUrl } = await client.rest.Repository.create({});
return { repoUrl };
await ctx.checkpoint({
key: 'repo.creation',
fn: async () => {
const { repoUrl } = await client.rest.Repository.create({});
return { repoUrl };
},
});
```
+1 -2
View File
@@ -24,8 +24,7 @@ Install Canon using a package manager.
Import the global CSS file at the root of your application.
```tsx
import '@backstage/canon/css/core.css';
import '@backstage/canon/css/components.css';
import '@backstage/canon/css/styles.css';
```
### 3. Start building ✨
@@ -53,7 +53,7 @@ color of your app.
</Table.Row>
<Table.Row>
<Table.Cell>
<Chip head>--canon-bg-elevated</Chip>
<Chip head>--canon-bg-surface-1</Chip>
</Table.Cell>
<Table.Cell>Use for any panels or elevated surfaces.</Table.Cell>
</Table.Row>
@@ -189,7 +189,7 @@ are prefixed with `fg` to make it easier to identify.
<Chip head>--canon-fg-primary</Chip>
</Table.Cell>
<Table.Cell>
It should be used on top of `--canon-bg-app` or `--canon-bg-elevated`.
It should be used on top of `--canon-bg-app` or `--canon-bg-surface-1`.
</Table.Cell>
</Table.Row>
<Table.Row>
@@ -197,7 +197,7 @@ are prefixed with `fg` to make it easier to identify.
<Chip head>--canon-fg-secondary</Chip>
</Table.Cell>
<Table.Cell>
It should be used on top of `--canon-bg-app` or `--canon-bg-elevated`.
It should be used on top of `--canon-bg-app` or `--canon-bg-surface-1`.
</Table.Cell>
</Table.Row>
<Table.Row>
@@ -205,7 +205,7 @@ are prefixed with `fg` to make it easier to identify.
<Chip head>--canon-fg-link</Chip>
</Table.Cell>
<Table.Cell>
It should be used on top of `--canon-bg-app` or `--canon-bg-elevated`.
It should be used on top of `--canon-bg-app` or `--canon-bg-surface-1`.
</Table.Cell>
</Table.Row>
<Table.Row>
@@ -213,7 +213,7 @@ are prefixed with `fg` to make it easier to identify.
<Chip head>--canon-fg-link-hover</Chip>
</Table.Cell>
<Table.Cell>
It should be used on top of `--canon-bg-app` or `--canon-bg-elevated`.
It should be used on top of `--canon-bg-app` or `--canon-bg-surface-1`.
</Table.Cell>
</Table.Row>
<Table.Row>
@@ -267,7 +267,7 @@ low contrast to help as a separator with the different background colors.
<Chip head>--canon-border</Chip>
</Table.Cell>
<Table.Cell>
It should be used on top of `--canon-bg-elevated`.
It should be used on top of `--canon-bg-surface-1`.
</Table.Cell>
</Table.Row>
<Table.Row>
@@ -17,7 +17,7 @@ const defaultTheme = `:root {
const myTheme = createTheme({
theme: 'light',
settings: {
background: 'var(--canon-bg-elevated)',
background: 'var(--canon-bg-surface-1)',
backgroundImage: '',
foreground: '#6182B8',
caret: '#5d00ff',
+1 -4
View File
@@ -31,10 +31,7 @@ export const Tab = (props: React.ComponentProps<typeof TabsPrimitive.Tab>) => (
<Text
variant="subtitle"
weight="bold"
{...rest}
style={{
color: state.selected ? 'var(--primary)' : 'var(--secondary)',
}}
color={state.selected ? 'primary' : 'secondary'}
>
{children}
</Text>
+2 -2
View File
@@ -5,7 +5,7 @@ export const customTheme = `:root {
--canon-font-weight-regular: 400;
--canon-font-weight-bold: 600;
--canon-bg: #f8f8f8;
--canon-bg-elevated: #fff;
--canon-bg-surface-1: #fff;
/* ... other CSS variables */
/* Add your custom components styles here */
@@ -20,7 +20,7 @@ export const customTheme = `:root {
--canon-font-weight-regular: 400;
--canon-font-weight-bold: 600;
--canon-bg: #f8f8f8;
--canon-bg-elevated: #fff;
--canon-bg-surface-1: #fff;
/* ... other CSS variables */
/* Add your custom components styles here */
+22 -22
View File
@@ -916,11 +916,11 @@ __metadata:
linkType: hard
"@types/node@npm:^20":
version: 20.17.23
resolution: "@types/node@npm:20.17.23"
version: 20.17.24
resolution: "@types/node@npm:20.17.24"
dependencies:
undici-types: ~6.19.2
checksum: 9957916d0781f6efd59f2db5bff8be51e0ea0de96f64aa282c0ed7482668b5bc0ad041ea772265ece0e57e1afb64f56b7a5be5fecb03ba467f7c48753b313d86
checksum: 05d3ca5d8741d10368edeff01318e4e615a7654b0c6bd05415f8cd0a2f851ac8e04c2cac319442c20fe372d1bdba9dd1f40dda014e97902516f82058b68ef6c4
languageName: node
linkType: hard
@@ -2576,12 +2576,12 @@ __metadata:
languageName: node
linkType: hard
"framer-motion@npm:^12.4.10":
version: 12.4.10
resolution: "framer-motion@npm:12.4.10"
"framer-motion@npm:^12.5.0":
version: 12.5.0
resolution: "framer-motion@npm:12.5.0"
dependencies:
motion-dom: ^12.4.10
motion-utils: ^12.4.10
motion-dom: ^12.5.0
motion-utils: ^12.5.0
tslib: ^2.4.0
peerDependencies:
"@emotion/is-prop-valid": "*"
@@ -2594,7 +2594,7 @@ __metadata:
optional: true
react-dom:
optional: true
checksum: c5e2e3658627e37b91c0a09d0ef908dddc67028240d7b747845ecfe84bb9cadefcaab715f05e587d1baf029a3766356825aac91f0f062e92f29a0f551e59770f
checksum: aebf78b75000c783d12a8ae2534e62f0a5781490c0cfdf39c051b6dee2c7e11a5b8dd1077cc659e55dc24f582aa5d620c28999f3c17e17d38e49b14c6298d86b
languageName: node
linkType: hard
@@ -4118,27 +4118,27 @@ __metadata:
languageName: node
linkType: hard
"motion-dom@npm:^12.4.10":
version: 12.4.10
resolution: "motion-dom@npm:12.4.10"
"motion-dom@npm:^12.5.0":
version: 12.5.0
resolution: "motion-dom@npm:12.5.0"
dependencies:
motion-utils: ^12.4.10
checksum: 6ecf64e5a41db29b228940a9d832f67f69ce4c4b23bb501ed93bb98acaa30deb6bf486cfb319bdf4f63bef5f45448605cb212ab74a819f93dcfaae9e3aeb6053
motion-utils: ^12.5.0
checksum: abe92c72fb09eba9a6071fb77aa2020d1489df31c2291f5e3ff15def091d8b2bacb8a60854c5617f40f99e70178c0407519ca846a57e48051c4f49808e0f5927
languageName: node
linkType: hard
"motion-utils@npm:^12.4.10":
version: 12.4.10
resolution: "motion-utils@npm:12.4.10"
checksum: 86335d4c2332ee4215a5a78371b0b8da6d472834802ac6516a43bc237efa5659dbdebc47b64aefaaeacb779d4e8e5639c79a05099a482fc235ed0c4337c89abc
"motion-utils@npm:^12.5.0":
version: 12.5.0
resolution: "motion-utils@npm:12.5.0"
checksum: 347169ab97d8b3720b363afad6c9f4e8999490d1d95c70aaa8f83333be1b8b4e11c5f25564a9809fb091160fad2184403222e5b383be1bba004243c8b47497fe
languageName: node
linkType: hard
"motion@npm:^12.4.1":
version: 12.4.10
resolution: "motion@npm:12.4.10"
version: 12.5.0
resolution: "motion@npm:12.5.0"
dependencies:
framer-motion: ^12.4.10
framer-motion: ^12.5.0
tslib: ^2.4.0
peerDependencies:
"@emotion/is-prop-valid": "*"
@@ -4151,7 +4151,7 @@ __metadata:
optional: true
react-dom:
optional: true
checksum: 007ed203beaf4d61c941780c96078c48822ee913a4b34c7232a165592405e1f81cc267b3645061a4bbaed9fe1d2260ecd4e12433b5062c50dc882f469069d8b9
checksum: a32231ea53a3f3b659630a86b40b5cd61daaa4428db06746c7aa06124c6c27ba2772a6482d652d1b4c71d2d9f01e30602eb700655f32fd1c0ccba74b1695fd8c
languageName: node
linkType: hard
@@ -190,7 +190,7 @@ describe('MyDatabaseClass', () => {
// "physical" databases to test against is much costlier than creating the
// "logical" databases within them that the individual tests use.
const databases = TestDatabases.create({
ids: ['POSTGRES_16', 'POSTGRES_12', 'SQLITE_3', 'MYSQL_8'],
ids: ['POSTGRES_17', 'POSTGRES_13', 'SQLITE_3', 'MYSQL_8'],
});
// Just an example of how to conveniently bundle up the setup code
@@ -236,8 +236,8 @@ your CI environment is able to supply databases natively, the `TestDatabases`
support custom connection strings through the use of environment variables that
it'll take into account when present.
- `BACKSTAGE_TEST_DATABASE_POSTGRES17_CONNECTION_STRING`
- `BACKSTAGE_TEST_DATABASE_POSTGRES13_CONNECTION_STRING`
- `BACKSTAGE_TEST_DATABASE_POSTGRES9_CONNECTION_STRING`
- `BACKSTAGE_TEST_DATABASE_MYSQL8_CONNECTION_STRING`
## Testing Service Factories
+32
View File
@@ -134,6 +134,38 @@ search:
timeout: { minutes: 3 }
```
### Filtering through the catalog collator
The TechDocs collator by default filters through catalog entities where the annotation `metadata.annotations.backstage.io/techdocs-ref` exists. If you wish to further filter out entities, there are two ways to do so through the `techDocsCollatorEntityFilterExtensionPoint`.
```typescript
export const exampleCustomCatalogFiltering = createBackendModule({
pluginId: 'search',
moduleId: 'search-techdocs-collator-entity-filter',
register(reg) {
reg.registerInit({
deps: {
customCollatorFilter: techDocsCollatorEntityFilterExtensionPoint,
},
async init({ customCollatorFilter }) {
/* filtering by catalog params */
customCollatorFilter.setCustomCatalogApiFilters([
{ kind: ['API', 'Component', ...] },
{ metadata: ['...more filters'] },
]);
/* filtering by a custom function */
customCollatorFilter.setEntityFilterFunction((entities: Entity[]) =>
entities.filter(
entity => entity.metadata?.annotations?.abc === 'xyz',
),
);
},
});
},
});
```
## Community Collators
Here are some of the known Search Collators available in from the Backstage Community:
@@ -19,9 +19,11 @@ array when registering your custom actions, as seen below.
## Streamlining Custom Action Creation with Backstage CLI
The creation of custom actions in Backstage has never been easier thanks to the Backstage CLI. This tool streamlines the setup process, allowing you to focus on your actions' unique functionality.
The creation of custom actions in Backstage has never been easier thanks to the Backstage CLI. This tool streamlines the
setup process, allowing you to focus on your actions' unique functionality.
Start by using the `yarn backstage-cli new` command to generate a scaffolder module. This command sets up the necessary boilerplate code, providing a smooth start:
Start by using the `yarn backstage-cli new` command to generate a scaffolder module. This command sets up the necessary
boilerplate code, providing a smooth start:
```
$ yarn backstage-cli new
@@ -34,13 +36,19 @@ $ yarn backstage-cli new
You can find a [list](../../tooling/cli/03-commands.md) of all commands provided by the Backstage CLI.
When prompted, select the option to generate a scaffolder module. This creates a solid foundation for your custom action. Enter the name of the module you wish to create, and the CLI will generate the required files and directory structure.
When prompted, select the option to generate a scaffolder module. This creates a solid foundation for your custom
action. Enter the name of the module you wish to create, and the CLI will generate the required files and directory
structure.
## Writing your Custom Action
After running the command, the CLI will create a new directory with your new scaffolder module. This directory will be the working directory for creating the custom action. It will contain all the necessary files and boilerplate code to get started.
After running the command, the CLI will create a new directory with your new scaffolder module. This directory will be
the working directory for creating the custom action. It will contain all the necessary files and boilerplate code to
get started.
Let's create a simple action that adds a new file and some contents that are passed as `input` to the function. Within the generated directory, locate the file at `src/actions/example/example.ts`. Feel free to rename this file along with its generated unit test. We will replace the existing placeholder code with our custom action code as follows:
Let's create a simple action that adds a new file and some contents that are passed as `input` to the function. Within
the generated directory, locate the file at `src/actions/example/example.ts`. Feel free to rename this file along with
its generated unit test. We will replace the existing placeholder code with our custom action code as follows:
```ts title="With Zod"
import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
@@ -82,7 +90,8 @@ The `createTemplateAction` takes an object which specifies the following:
- `id` - A unique ID for your custom action. We encourage you to namespace these
in some way so that they won't collide with future built-in actions that we
may ship with the `scaffolder-backend` plugin.
- `description` - An optional field to describe the purpose of the action. This will populate in the `/create/actions` endpoint.
- `description` - An optional field to describe the purpose of the action. This will populate in the `/create/actions`
endpoint.
- `schema.input` - A `zod` or JSON schema object for input values to your function
- `schema.output` - A `zod` or JSON schema object for values which are output from the
function using `ctx.output`
@@ -132,18 +141,24 @@ export const createNewFileAction = () => {
### Naming Conventions
Try to keep names consistent for both your own custom actions, and any actions contributed to open source. We've found that a separation of `:` and using a verb as the last part of the name works well.
We follow `provider:entity:verb` or as close to this as possible for our built in actions. For example, `github:actions:create` or `github:repo:create`.
Try to keep names consistent for both your own custom actions, and any actions contributed to open source. We've found
that a separation of `:` and using a verb as the last part of the name works well.
We follow `provider:entity:verb` or as close to this as possible for our built in actions. For example,
`github:actions:create` or `github:repo:create`.
Also feel free to use your company name to namespace them if you prefer too, for example `acme:file:create` like above.
Prefer to use `camelCase` over `snake_case` or `kebab-case` for these actions if possible, which leads to better reading and writing of template entity definitions.
Prefer to use `camelCase` over `snake_case` or `kebab-case` for these actions if possible, which leads to better reading
and writing of template entity definitions.
> We're aware that there are some exceptions to this, but try to follow as close as possible. We'll be working on migrating these in the repository over time too.
> We're aware that there are some exceptions to this, but try to follow as close as possible. We'll be working on
> migrating these in the repository over time too.
### Adding a TemplateExample
A TemplateExample is a predefined structure that can be used to create custom actions in your software templates. It serves as a blueprint for users to understand how to use a specific action and its fields as well as to ensure consistency and standardization across different custom actions.
A TemplateExample is a predefined structure that can be used to create custom actions in your software templates. It
serves as a blueprint for users to understand how to use a specific action and its fields as well as to ensure
consistency and standardization across different custom actions.
#### Define a TemplateExample and add to your Custom Action
@@ -199,7 +214,8 @@ argument. It looks like the following:
## Registering Custom Actions
To register your new custom action in the Backend System you will need to create a backend module. Here is a very simplified example of how to do that:
To register your new custom action in the Backend System you will need to create a backend module. Here is a very
simplified example of how to do that:
```ts title="packages/backend/src/index.ts"
/* highlight-add-start */
@@ -233,7 +249,8 @@ backend.add(import('@backstage/plugin-scaffolder-backend'));
backend.add(scaffolderModuleCustomExtensions);
```
If your custom action requires core services such as `config` or `cache` they can be imported in the dependencies and passed to the custom action function.
If your custom action requires core services such as `config` or `cache` they can be imported in the dependencies and
passed to the custom action function.
```ts title="packages/backend/src/index.ts"
import {
@@ -243,17 +260,17 @@ import {
...
env.registerInit({
deps: {
scaffolder: scaffolderActionsExtensionPoint,
cache: coreServices.cache,
config: coreServices.rootConfig,
},
async init({ scaffolder, cache, config }) {
scaffolder.addActions(
customActionNeedingCacheAndConfig({ cache: cache, config: config }),
);
})
env.registerInit({
deps: {
scaffolder: scaffolderActionsExtensionPoint,
cache: coreServices.cache,
config: coreServices.rootConfig,
},
async init({scaffolder, cache, config}) {
scaffolder.addActions(
customActionNeedingCacheAndConfig({cache: cache, config: config}),
);
})
```
### Using Checkpoints in Custom Actions (Experimental)
@@ -281,6 +298,13 @@ You have to define the unique key in scope of the scaffolder task for your check
will check if the checkpoint with such key was already executed or not, if yes, and the run was successful, the callback
will be skipped and instead the stored value will be returned.
Whenever you change the return type of the checkpoint, we encourage you to change the ID.
For example, you can embed the versioning or another indicator for that (instead of using key `create.projects`, it can
be `create.projects.v1`).
If you'll preserve the same key, and you'll try to restart the affected task, it will fail on this checkpoint.
The cached result will not match with the expected updated return type.
By changing the key, you'll invalidate the cache of the checkpoint.
### Register Custom Actions with the Legacy Backend System
Once you have your Custom Action ready for usage with the scaffolder, you'll
+3 -2
View File
@@ -92,10 +92,11 @@ the source code hosting provider. Notice that instead of the `dir:` prefix, the
Note, just as it's possible to specify a subdirectory with the `dir:` prefix,
you can also provide a path to a non-root directory inside the repository which
contains the `mkdocs.yml` file and `docs/` directory.
contains the `mkdocs.yml` file and `docs/` directory. It is important that it is
suffixed with a '/' in order for relative path resolution to work consistently.
e.g.
`url:https://github.com/backstage/backstage/tree/master/plugins/techdocs-backend/examples/documented-component`
`url:https://github.com/backstage/backstage/tree/master/plugins/techdocs-backend/examples/documented-component/`
### Why is URL Reader faster than a git clone?
@@ -500,7 +500,84 @@ Continue this process for each of your legacy routes until you have migrated all
### Entity Pages
The entity pages are typically defined in `packages/app/src/components/catalog` and rendered as a child of the `/catalog/:namespace/:kind/:name` route. The entity pages are typically quite large and bringing in content from quite a lot of different plugins. At the moment we do not provide a way to gradually migrate entity pages to the new system, although that is planned as a future improvement. This means that the entire entity page and all of its plugins need to be migrated at once, including any other usages of those plugins.
The entity pages are typically defined in `packages/app/src/components/catalog` and rendered as a child of the `/catalog/:namespace/:kind/:name` route. The entity pages are typically quite large and bringing in content from quite a lot of different plugins. To help gradually migrate entity pages we provide the `entityPage` option in the `convertLegacyApp` helper. This option lets you pass in an entity page app element tree that will be converted to extensions that are added to the features returned from `convertLegacyApp`.
To start the gradual migration of entity pages, add your `entityPages` to the `convertLegacyApp` call:
```tsx title="in packages/app/src/App.tsx"
/* highlight-remove-next-line */
const legacyFeatures = convertLegacyApp(routes);
/* highlight-add-next-line */
const legacyFeatures = convertLegacyApp(routes, { entityPage });
```
Next, you will need to fully migrate the catalog plugin itself. This is because only a single version of a plugin can be installed in the app at a time, so in order to start using the new version of the catalog plugin you need to remove all usage of the old one. This includes both the routes and entity pages. You will need to keep the structural helpers for the entity pages, such as `EntityLayout` and `EntitySwitch`, but remove any extensions like the `<CatalogIndexPage/>` and entity cards and content like `<EntityAboutCard/>` and `<EntityOrphanWarning/>`.
Remove the following routes:
```tsx title="in packages/app/src/App.tsx"
const routes = (
<FlatRoutes>
...
{/* highlight-remove-start */}
<Route path="/catalog" element={<CatalogIndexPage />} />
<Route
path="/catalog/:namespace/:kind/:name"
element={<CatalogEntityPage />}
>
{entityPage}
</Route>
{/* highlight-remove-end */}
...
</FlatRoutes>
);
```
And explicitly install the catalog plugin before the converted legacy features:
```tsx title="in packages/app/src/App.tsx"
/* highlight-add-next-line */
import { default as catalogPlugin } from '@backstage/plugin-catalog/alpha';
const app = createApp({
/* highlight-remove-next-line */
features: [optionsModule, ...legacyFeatures],
/* highlight-add-next-line */
features: [catalogPlugin, optionsModule, ...legacyFeatures],
});
```
If you are not using the default `<CatalogIndexPage />` you can install your custom catalog page as an override for now instead, and fully migrate it to the new system later.
```tsx title="in packages/app/src/App.tsx"
/* highlight-remove-start */
const catalogPluginOverride = catalogPlugin.withOverrides({
extensions: [
catalogPlugin.getExtension('page:catalog').override({
params: {
loader: async () => (
<CatalogIndexPage
pagination={{ mode: 'offset', limit: 20 }}
filters={<>{/* ... */}</>}
/>
),
},
}),
],
});
/* highlight-remove-end */
const app = createApp({
/* highlight-remove-next-line */
features: [catalogPlugin, optionsModule, ...legacyFeatures],
/* highlight-add-next-line */
features: [catalogPluginOverride, optionsModule, ...legacyFeatures],
});
```
At this point you should be able to run the app and see that you're not using the new version of the catalog plugin. If you navigate to the entity pages you will likely see a lot of duplicate content at the bottom of the page. These are the duplicates of the entity cards provided by the catalog plugin itself that we mentioned earlier that you need to remove. Clean up the entity pages by removing cards and content from the catalog plugin such as `<EntityAboutCard/>` and `<EntityOrphanWarning/>`.
Once the cleanup is complete you should be left with clean entity pages that are built using a mix of the old and new frontend system. From this point you can continue to gradually migrate plugins that provide content for the entity pages, until all plugins have been fully moved to the new system and the `entityPage` option can be removed.
### Sidebar
+2 -2
View File
@@ -106,7 +106,7 @@ be part of the `1.12` Backstage release.
The following versioning policy applies to all packages:
- Breaking changes are noted in the changelog, and documentation is updated.
- Breaking changes are prefixed with `**BREAKING**: ` in the changelog.
- Breaking changes are prefixed with `**BREAKING**:` in the changelog.
- All public exports are considered stable and will have an entry in the
changelog.
- Breaking changes are recommended to document a clear upgrade path in the
@@ -195,4 +195,4 @@ The Backstage project recommends and supports using PostgreSQL for persistent st
The PostgreSQL [versioning policy](https://www.postgresql.org/support/versioning/) is to release a new major version every year with new features which is then supported for 5 years after its initial release.
Our policy mirrors the PostgreSQL versioning policy - we will support the last 5 major versions. We will also test the newest and oldest versions in that range. For example, if the range we support is currently 12 to 16, then we would only test 12 and 16 explicitly.
Our policy mirrors the PostgreSQL versioning policy - we will support the last 5 major versions. We will also test the newest and oldest versions in that range. For example, if the range we support is currently 13 to 17, then we would only test 13 and 17 explicitly.
+3 -3
View File
@@ -110,13 +110,13 @@ There are also additional settings:
from the target.
By default, the proxy will only forward safe HTTP request headers to the target.
Those are based on the headers that are considered safe for CORS and includes
These are based on the headers that are considered safe for CORS and include
headers like `content-type` or `last-modified`, as well as all headers that are
set by the proxy. If the proxy should forward other headers like
set by the proxy. If the proxy should forward other headers, like
`authorization`, this must be enabled by the `allowedHeaders` config, for
example `allowedHeaders: ['Authorization']`. This should help to not
accidentally forward confidential headers (`cookie`, `X-Auth-Request-User`) to
third-parties.
third parties.
The same logic applies to headers that are sent from the target back to the
frontend.
File diff suppressed because it is too large Load Diff
+12
View File
@@ -0,0 +1,12 @@
---
title: Facets.cloud Platform
author: Facets.cloud
authorUrl: 'https://facets.cloud'
category: Deployment
description: |
Show environments, releases and terraform outputs deployed by Facets.cloud Platform.
Plugin includes an Environment Overview, Release Details and Terraform Output ComponentCard.
documentation: https://github.com/Facets-cloud/facets-backstage-plugin
iconUrl: /img/facets-cloud-logo.png
npmPackageName: '@facets-cloud/backstage-plugin'
addedDate: '2025-02-25'
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

+49 -49
View File
@@ -2961,90 +2961,90 @@ __metadata:
languageName: node
linkType: hard
"@swc/core-darwin-arm64@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-darwin-arm64@npm:1.11.8"
"@swc/core-darwin-arm64@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-darwin-arm64@npm:1.11.9"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@swc/core-darwin-x64@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-darwin-x64@npm:1.11.8"
"@swc/core-darwin-x64@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-darwin-x64@npm:1.11.9"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@swc/core-linux-arm-gnueabihf@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-linux-arm-gnueabihf@npm:1.11.8"
"@swc/core-linux-arm-gnueabihf@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-linux-arm-gnueabihf@npm:1.11.9"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@swc/core-linux-arm64-gnu@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-linux-arm64-gnu@npm:1.11.8"
"@swc/core-linux-arm64-gnu@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-linux-arm64-gnu@npm:1.11.9"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@swc/core-linux-arm64-musl@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-linux-arm64-musl@npm:1.11.8"
"@swc/core-linux-arm64-musl@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-linux-arm64-musl@npm:1.11.9"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@swc/core-linux-x64-gnu@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-linux-x64-gnu@npm:1.11.8"
"@swc/core-linux-x64-gnu@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-linux-x64-gnu@npm:1.11.9"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@swc/core-linux-x64-musl@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-linux-x64-musl@npm:1.11.8"
"@swc/core-linux-x64-musl@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-linux-x64-musl@npm:1.11.9"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@swc/core-win32-arm64-msvc@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-win32-arm64-msvc@npm:1.11.8"
"@swc/core-win32-arm64-msvc@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-win32-arm64-msvc@npm:1.11.9"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@swc/core-win32-ia32-msvc@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-win32-ia32-msvc@npm:1.11.8"
"@swc/core-win32-ia32-msvc@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-win32-ia32-msvc@npm:1.11.9"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@swc/core-win32-x64-msvc@npm:1.11.8":
version: 1.11.8
resolution: "@swc/core-win32-x64-msvc@npm:1.11.8"
"@swc/core-win32-x64-msvc@npm:1.11.9":
version: 1.11.9
resolution: "@swc/core-win32-x64-msvc@npm:1.11.9"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@swc/core@npm:^1.3.46":
version: 1.11.8
resolution: "@swc/core@npm:1.11.8"
version: 1.11.9
resolution: "@swc/core@npm:1.11.9"
dependencies:
"@swc/core-darwin-arm64": 1.11.8
"@swc/core-darwin-x64": 1.11.8
"@swc/core-linux-arm-gnueabihf": 1.11.8
"@swc/core-linux-arm64-gnu": 1.11.8
"@swc/core-linux-arm64-musl": 1.11.8
"@swc/core-linux-x64-gnu": 1.11.8
"@swc/core-linux-x64-musl": 1.11.8
"@swc/core-win32-arm64-msvc": 1.11.8
"@swc/core-win32-ia32-msvc": 1.11.8
"@swc/core-win32-x64-msvc": 1.11.8
"@swc/core-darwin-arm64": 1.11.9
"@swc/core-darwin-x64": 1.11.9
"@swc/core-linux-arm-gnueabihf": 1.11.9
"@swc/core-linux-arm64-gnu": 1.11.9
"@swc/core-linux-arm64-musl": 1.11.9
"@swc/core-linux-x64-gnu": 1.11.9
"@swc/core-linux-x64-musl": 1.11.9
"@swc/core-win32-arm64-msvc": 1.11.9
"@swc/core-win32-ia32-msvc": 1.11.9
"@swc/core-win32-x64-msvc": 1.11.9
"@swc/counter": ^0.1.3
"@swc/types": ^0.1.19
peerDependencies:
@@ -3073,7 +3073,7 @@ __metadata:
peerDependenciesMeta:
"@swc/helpers":
optional: true
checksum: 53aac457ec10ad931e4a15d14be87d4cb53432d2fc2433244835ceb1396e5560f52155e24eadc67bb964bd675b74eea0d99a7570062cd915b02d0336152bf36c
checksum: 2c89cc4630f569f9b6e2e0dcc29b168d3c14c730d5f04b2923b4eb0d517be327b22bf8b64eb50fb0412e2960f43ab0ccb4e99f6792ec409a9d24e7a2a85fa12f
languageName: node
linkType: hard
@@ -5902,8 +5902,8 @@ __metadata:
linkType: hard
"docusaurus-plugin-openapi-docs@npm:^4.3.0":
version: 4.3.6
resolution: "docusaurus-plugin-openapi-docs@npm:4.3.6"
version: 4.3.7
resolution: "docusaurus-plugin-openapi-docs@npm:4.3.7"
dependencies:
"@apidevtools/json-schema-ref-parser": ^11.5.4
"@redocly/openapi-core": ^1.10.5
@@ -5925,7 +5925,7 @@ __metadata:
"@docusaurus/utils": ^3.5.0
"@docusaurus/utils-validation": ^3.5.0
react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0
checksum: ed80d72f16cf03fc38cc9c6b9916287c80b4bf289040eacbd5a4bacabeed428a9293be974fb1bbede8595e2288820b7d86ca15aaf21366d043edf7e58c45aeae
checksum: 714d91c40ea00217ef654b690569dc3249a5048b83532da08be0c552e13f42b326cf1262490063519286e2cd30ad1c1bbd08f678d09c7341f945be9d8cd8e864
languageName: node
linkType: hard
@@ -11891,9 +11891,9 @@ __metadata:
linkType: hard
"prismjs@npm:^1.29.0":
version: 1.29.0
resolution: "prismjs@npm:1.29.0"
checksum: 007a8869d4456ff8049dc59404e32d5666a07d99c3b0e30a18bd3b7676dfa07d1daae9d0f407f20983865fd8da56de91d09cb08e6aa61f5bc420a27c0beeaf93
version: 1.30.0
resolution: "prismjs@npm:1.30.0"
checksum: a68eddd4c5f1c506badb5434b0b28a7cc2479ed1df91bc4218e6833c7971ef40c50ec481ea49749ac964256acb78d8b66a6bd11554938e8998e46c18b5f9a580
languageName: node
linkType: hard
+10 -10
View File
@@ -1,11 +1,6 @@
{
"name": "root",
"version": "1.37.0-next.1",
"private": true,
"repository": {
"type": "git",
"url": "https://github.com/backstage/backstage"
},
"version": "1.37.0-next.2",
"backstage": {
"cli": {
"new": {
@@ -16,6 +11,11 @@
}
}
},
"private": true,
"repository": {
"type": "git",
"url": "https://github.com/backstage/backstage"
},
"workspaces": {
"packages": [
"packages/*",
@@ -51,11 +51,11 @@
"snyk:test": "npx snyk test --yarn-workspaces --strict-out-of-sync=false",
"snyk:test:package": "yarn snyk:test --include",
"start": "yarn workspace example-app start",
"start-backend": "yarn workspace example-backend start",
"start-backend:legacy": "yarn workspace example-backend-legacy start",
"start:lighthouse": "yarn workspaces foreach -A --include example-backend --include example-app --parallel --jobs unlimited -v -i run start",
"start:microsite": "cd microsite/ && yarn start",
"start:next": "yarn workspace example-app-next start",
"start-backend": "yarn workspace example-backend start",
"start-backend:legacy": "yarn workspace example-backend-legacy start",
"storybook": "yarn ./storybook run storybook",
"techdocs-cli": "node scripts/techdocs-cli.js",
"techdocs-cli:dev": "cross-env TECHDOCS_CLI_DEV_MODE=true node scripts/techdocs-cli.js",
@@ -103,9 +103,9 @@
"@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",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"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",
"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@0.14.2": "patch:ast-types@npm%3A0.14.2#./.yarn/patches/ast-types-npm-0.14.2-43c4ac4b0d.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"
},
"dependencies": {
"@backstage/errors": "workspace:^",
+42
View File
@@ -1,5 +1,47 @@
# @backstage/app-defaults
## 1.6.0-next.1
### Minor Changes
- 12f8e01: **BREAKING**: The default `DiscoveryApi` implementation has been switched to use `FrontendHostDiscovery`, which adds support for the `discovery.endpoints` configuration.
This is marked as a breaking change because it will cause any existing `discovery.endpoints` configuration to be picked up and used, which may break existing setups.
For example, consider the following configuration:
```yaml
app:
baseUrl: https://backstage.acme.org
backend:
baseUrl: https://backstage.internal.acme.org
discovery:
endpoints:
- target: https://catalog.internal.acme.org/api/{{pluginId}}
plugins: [catalog]
```
This will now cause requests from the frontend towards the `catalog` plugin to be routed to `https://catalog.internal.acme.org/api/catalog`, but this might not be reachable from the frontend. To fix this, you should update the `discovery.endpoints` configuration to only override the internal URL of the plugin:
```yaml
discovery:
endpoints:
- target:
internal: https://catalog.internal.acme.org/api/{{pluginId}}
plugins: [catalog]
```
### Patch Changes
- Updated dependencies
- @backstage/core-app-api@1.16.0-next.0
- @backstage/core-components@0.16.5-next.1
- @backstage/core-plugin-api@1.10.4
- @backstage/theme@0.6.4
- @backstage/plugin-permission-react@0.4.31
## 1.5.18-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/app-defaults",
"version": "1.5.18-next.0",
"version": "1.6.0-next.1",
"description": "Provides the default wiring of a Backstage App",
"backstage": {
"role": "web-library"
+2 -5
View File
@@ -28,13 +28,13 @@ import {
BitbucketServerAuth,
OAuthRequestManager,
WebStorage,
UrlPatternDiscovery,
OneLoginAuth,
UnhandledErrorForwarder,
AtlassianAuth,
createFetchApi,
FetchMiddlewares,
VMwareCloudAuth,
FrontendHostDiscovery,
} from '@backstage/core-app-api';
import {
@@ -68,10 +68,7 @@ export const apis = [
createApiFactory({
api: discoveryApiRef,
deps: { configApi: configApiRef },
factory: ({ configApi }) =>
UrlPatternDiscovery.compile(
`${configApi.getString('backend.baseUrl')}/api/{{ pluginId }}`,
),
factory: ({ configApi }) => FrontendHostDiscovery.fromConfig(configApi),
}),
createApiFactory({
api: alertApiRef,
@@ -1,5 +1,13 @@
# app-next-example-plugin
## 0.0.21-next.2
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.10.0-next.2
- @backstage/core-components@0.16.5-next.1
## 0.0.21-next.1
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "app-next-example-plugin",
"version": "0.0.21-next.1",
"version": "0.0.21-next.2",
"description": "Backstage internal example plugin",
"backstage": {
"role": "frontend-plugin",
+45
View File
@@ -1,5 +1,50 @@
# example-app-next
## 0.0.21-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog@1.28.0-next.2
- @backstage/frontend-app-api@0.11.0-next.2
- @backstage/frontend-defaults@0.2.0-next.2
- @backstage/frontend-plugin-api@0.10.0-next.2
- @backstage/cli@0.31.0-next.1
- @backstage/core-app-api@1.16.0-next.0
- @backstage/plugin-catalog-react@1.16.0-next.2
- @backstage/core-compat-api@0.4.0-next.2
- @backstage/plugin-signals@0.0.17-next.2
- @backstage/plugin-app@0.1.7-next.2
- @backstage/core-components@0.16.5-next.1
- @backstage/plugin-scaffolder-react@1.14.6-next.2
- @backstage/app-defaults@1.6.0-next.1
- @backstage/plugin-scaffolder@1.29.0-next.2
- @backstage/plugin-api-docs@0.12.5-next.2
- @backstage/plugin-catalog-graph@0.4.17-next.2
- @backstage/plugin-catalog-import@0.12.11-next.2
- @backstage/plugin-org@0.6.37-next.2
- @backstage/plugin-techdocs@1.12.4-next.2
- @backstage/plugin-user-settings@0.8.20-next.2
- @backstage/plugin-search-react@1.8.7-next.2
- @backstage/plugin-app-visualizer@0.1.17-next.2
- @backstage/plugin-catalog-unprocessed-entities@0.2.15-next.2
- @backstage/plugin-home@0.8.6-next.2
- @backstage/plugin-kubernetes@0.12.5-next.2
- @backstage/plugin-notifications@0.5.3-next.2
- @backstage/plugin-search@1.4.24-next.2
- @backstage/plugin-techdocs-module-addons-contrib@1.1.22-next.2
- @backstage/plugin-techdocs-react@1.2.15-next.2
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/core-plugin-api@1.10.4
- @backstage/integration-react@1.2.5-next.0
- @backstage/theme@0.6.4
- @backstage/plugin-auth-react@0.1.13-next.1
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-kubernetes-cluster@0.0.23-next.2
- @backstage/plugin-permission-react@0.4.31
- @backstage/plugin-search-common@1.2.17
## 0.0.21-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
"version": "0.0.21-next.1",
"version": "0.0.21-next.2",
"backstage": {
"role": "frontend"
},
+41
View File
@@ -1,5 +1,46 @@
# example-app
## 0.2.107-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog@1.28.0-next.2
- @backstage/frontend-app-api@0.11.0-next.2
- @backstage/cli@0.31.0-next.1
- @backstage/core-app-api@1.16.0-next.0
- @backstage/plugin-catalog-react@1.16.0-next.2
- @backstage/plugin-signals@0.0.17-next.2
- @backstage/core-components@0.16.5-next.1
- @backstage/plugin-scaffolder-react@1.14.6-next.2
- @backstage/app-defaults@1.6.0-next.1
- @backstage/plugin-scaffolder@1.29.0-next.2
- @backstage/plugin-api-docs@0.12.5-next.2
- @backstage/plugin-catalog-graph@0.4.17-next.2
- @backstage/plugin-catalog-import@0.12.11-next.2
- @backstage/plugin-org@0.6.37-next.2
- @backstage/plugin-techdocs@1.12.4-next.2
- @backstage/plugin-user-settings@0.8.20-next.2
- @backstage/plugin-search-react@1.8.7-next.2
- @backstage/plugin-catalog-unprocessed-entities@0.2.15-next.2
- @backstage/plugin-devtools@0.1.25-next.2
- @backstage/plugin-home@0.8.6-next.2
- @backstage/plugin-kubernetes@0.12.5-next.2
- @backstage/plugin-notifications@0.5.3-next.2
- @backstage/plugin-search@1.4.24-next.2
- @backstage/plugin-techdocs-module-addons-contrib@1.1.22-next.2
- @backstage/plugin-techdocs-react@1.2.15-next.2
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/core-plugin-api@1.10.4
- @backstage/integration-react@1.2.5-next.0
- @backstage/theme@0.6.4
- @backstage/plugin-auth-react@0.1.13-next.1
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-kubernetes-cluster@0.0.23-next.2
- @backstage/plugin-permission-react@0.4.31
- @backstage/plugin-search-common@1.2.17
## 0.2.107-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app",
"version": "0.2.107-next.1",
"version": "0.2.107-next.2",
"backstage": {
"role": "frontend"
},
+14
View File
@@ -1,5 +1,19 @@
# @backstage/backend-app-api
## 1.2.1-next.2
### Patch Changes
- Updated dependencies
- @backstage/config-loader@1.10.0-next.0
- @backstage/backend-plugin-api@1.2.1-next.1
- @backstage/cli-common@0.1.15
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/plugin-auth-node@0.6.1-next.1
- @backstage/plugin-permission-node@0.8.9-next.1
## 1.2.1-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-app-api",
"version": "1.2.1-next.1",
"version": "1.2.1-next.2",
"description": "Core API used by Backstage backend apps",
"backstage": {
"role": "node-library"
+21
View File
@@ -1,5 +1,26 @@
# @backstage/backend-defaults
## 0.8.2-next.2
### Patch Changes
- 12f8e01: The `discovery.endpoints` configuration no longer requires both `internal` and `external` target when using the object form, instead falling back to the default.
- Updated dependencies
- @backstage/config-loader@1.10.0-next.0
- @backstage/integration@1.16.2-next.0
- @backstage/plugin-events-node@0.4.9-next.2
- @backstage/backend-app-api@1.2.1-next.2
- @backstage/backend-dev-utils@0.1.5
- @backstage/backend-plugin-api@1.2.1-next.1
- @backstage/cli-common@0.1.15
- @backstage/cli-node@0.2.13
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/integration-aws-node@0.1.15
- @backstage/types@1.2.1
- @backstage/plugin-auth-node@0.6.1-next.1
- @backstage/plugin-permission-node@0.8.9-next.1
## 0.8.2-next.1
### Patch Changes
+1 -1
View File
@@ -652,7 +652,7 @@ export interface Config {
* Can be either a string or an object with internal and external keys.
* Targets with `{{pluginId}}` or `{{ pluginId }} in the URL will be replaced with the plugin ID.
*/
target: string | { internal: string; external: string };
target: string | { internal?: string; external?: string };
/**
* Array of plugins which use the target base URL.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-defaults",
"version": "0.8.2-next.1",
"version": "0.8.2-next.2",
"description": "Backend defaults used by Backstage backend apps",
"backstage": {
"role": "node-library"
@@ -162,6 +162,42 @@ describe('HostDiscovery', () => {
);
});
it('allows plugin overrides to only override either internal or external targets', async () => {
const discovery = HostDiscovery.fromConfig(
new ConfigReader({
backend: {
baseUrl: 'http://localhost:40',
listen: { port: 80, host: 'localhost' },
},
discovery: {
endpoints: [
{
target: { internal: 'http://catalog-backend:8080/api/catalog' },
plugins: ['catalog'],
},
{
target: { external: 'http://frontend/api/scaffolder' },
plugins: ['scaffolder'],
},
],
},
}),
);
await expect(discovery.getBaseUrl('catalog')).resolves.toBe(
'http://catalog-backend:8080/api/catalog',
);
await expect(discovery.getExternalBaseUrl('catalog')).resolves.toBe(
'http://localhost:40/api/catalog',
);
await expect(discovery.getBaseUrl('scaffolder')).resolves.toBe(
'http://localhost:80/api/scaffolder',
);
await expect(discovery.getExternalBaseUrl('scaffolder')).resolves.toBe(
'http://frontend/api/scaffolder',
);
});
it('replaces {{pluginId}} or {{ pluginId }} in the target', async () => {
const discovery = HostDiscovery.fromConfig(
new ConfigReader({
@@ -102,10 +102,13 @@ export class HostDiscovery implements DiscoveryService {
private getTargetFromConfig(pluginId: string, type: 'internal' | 'external') {
const endpoints = this.discoveryConfig?.getOptionalConfigArray('endpoints');
const target = endpoints
const targetOrObj = endpoints
?.find(endpoint => endpoint.getStringArray('plugins').includes(pluginId))
?.get<Target>('target');
const target =
typeof targetOrObj === 'string' ? targetOrObj : targetOrObj?.[type];
if (!target) {
const baseUrl =
type === 'external' ? this.externalBaseUrl : this.internalBaseUrl;
@@ -113,14 +116,7 @@ export class HostDiscovery implements DiscoveryService {
return `${baseUrl}/${encodeURIComponent(pluginId)}`;
}
if (typeof target === 'string') {
return target.replace(
/\{\{\s*pluginId\s*\}\}/g,
encodeURIComponent(pluginId),
);
}
return target[type].replace(
return target.replace(
/\{\{\s*pluginId\s*\}\}/g,
encodeURIComponent(pluginId),
);
@@ -33,7 +33,7 @@ jest.setTimeout(60_000);
describe('PluginTaskManagerImpl', () => {
const addShutdownHook = jest.fn();
const databases = TestDatabases.create({
ids: ['POSTGRES_16', 'POSTGRES_12', 'SQLITE_3'],
ids: ['POSTGRES_17', 'POSTGRES_13', 'SQLITE_3'],
});
beforeAll(async () => {
@@ -39,8 +39,8 @@ describe('PluginTaskSchedulerJanitor', () => {
const databases = TestDatabases.create({
ids: [
/* 'MYSQL_8' not supported yet */
'POSTGRES_16',
'POSTGRES_12',
'POSTGRES_17',
'POSTGRES_13',
'SQLITE_3',
'MYSQL_8',
],
+1 -1
View File
@@ -21,5 +21,5 @@ import { Settings } from 'luxon';
Settings.throwOnInvalid = true;
TestDatabases.setDefaults({
ids: ['MYSQL_8', 'POSTGRES_16', 'POSTGRES_12', 'SQLITE_3'],
ids: ['MYSQL_8', 'POSTGRES_17', 'POSTGRES_13', 'SQLITE_3'],
});
@@ -1,5 +1,29 @@
# @backstage/backend-dynamic-feature-service
## 0.6.1-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-scaffolder-node@0.8.0-next.2
- @backstage/plugin-catalog-backend@1.32.0-next.2
- @backstage/config-loader@1.10.0-next.0
- @backstage/backend-defaults@0.8.2-next.2
- @backstage/plugin-events-backend@0.4.4-next.2
- @backstage/plugin-events-node@0.4.9-next.2
- @backstage/backend-plugin-api@1.2.1-next.1
- @backstage/cli-common@0.1.15
- @backstage/cli-node@0.2.13
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/plugin-app-node@0.1.31-next.2
- @backstage/plugin-auth-node@0.6.1-next.1
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-permission-node@0.8.9-next.1
- @backstage/plugin-search-backend-node@1.3.9-next.1
- @backstage/plugin-search-common@1.2.17
## 0.6.1-next.1
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-dynamic-feature-service",
"version": "0.6.1-next.1",
"version": "0.6.1-next.2",
"description": "Backstage dynamic feature service",
"backstage": {
"role": "node-library"
+38
View File
@@ -1,5 +1,43 @@
# example-backend-legacy
## 0.2.108-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-scaffolder-backend-module-gitlab@0.8.1-next.2
- @backstage/plugin-scaffolder-backend@1.31.0-next.2
- @backstage/plugin-catalog-backend@1.32.0-next.2
- @backstage/plugin-techdocs-backend@1.11.7-next.2
- @backstage/backend-defaults@0.8.2-next.2
- @backstage/integration@1.16.2-next.0
- @backstage/plugin-events-backend@0.4.4-next.2
- @backstage/plugin-events-node@0.4.9-next.2
- @backstage/backend-plugin-api@1.2.1-next.1
- @backstage/catalog-client@1.9.1
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/plugin-auth-backend@0.24.4-next.2
- @backstage/plugin-auth-node@0.6.1-next.1
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6-next.1
- @backstage/plugin-catalog-backend-module-unprocessed@0.5.6-next.1
- @backstage/plugin-catalog-node@1.16.1-next.1
- @backstage/plugin-kubernetes-backend@0.19.4-next.1
- @backstage/plugin-permission-backend@0.5.55-next.1
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-permission-node@0.8.9-next.1
- @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.7-next.2
- @backstage/plugin-scaffolder-backend-module-rails@0.5.7-next.2
- @backstage/plugin-search-backend@1.8.3-next.2
- @backstage/plugin-search-backend-module-catalog@0.3.2-next.1
- @backstage/plugin-search-backend-module-elasticsearch@1.6.6-next.1
- @backstage/plugin-search-backend-module-explore@0.2.9-next.1
- @backstage/plugin-search-backend-module-pg@0.5.42-next.1
- @backstage/plugin-search-backend-module-techdocs@0.3.7-next.2
- @backstage/plugin-search-backend-node@1.3.9-next.1
- @backstage/plugin-signals-backend@0.3.2-next.2
- @backstage/plugin-signals-node@0.1.18-next.2
## 0.2.108-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend-legacy",
"version": "0.2.108-next.1",
"version": "0.2.108-next.2",
"backstage": {
"role": "backend"
},
+9 -3
View File
@@ -25,6 +25,7 @@
import Router from 'express-promise-router';
import {
CacheManager,
createLegacyAuthAdapters,
createServiceBuilder,
DatabaseManager,
getRootLogger,
@@ -37,7 +38,7 @@ import {
import { Config } from '@backstage/config';
import healthcheck from './plugins/healthcheck';
import { metricsHandler, metricsInit } from './metrics';
import auth from './plugins/auth';
import authPlugin from './plugins/auth';
import catalog from './plugins/catalog';
import events from './plugins/events';
import kubernetes from './plugins/kubernetes';
@@ -59,10 +60,15 @@ function makeCreateEnv(config: Config) {
const reader = UrlReaders.default({ logger: root, config });
const discovery = HostDiscovery.fromConfig(config);
const tokenManager = ServerTokenManager.fromConfig(config, { logger: root });
const permissions = ServerPermissionClient.fromConfig(config, {
const { auth } = createLegacyAuthAdapters({
auth: undefined,
discovery,
tokenManager,
});
const permissions = ServerPermissionClient.fromConfig(config, {
discovery,
auth,
});
const databaseManager = DatabaseManager.fromConfig(config, { logger: root });
const cacheManager = CacheManager.fromConfig(config);
const identity = DefaultIdentityClient.create({
@@ -137,7 +143,7 @@ async function main() {
apiRouter.use('/catalog', await catalog(catalogEnv));
apiRouter.use('/events', await events(eventsEnv));
apiRouter.use('/scaffolder', await scaffolder(scaffolderEnv));
apiRouter.use('/auth', await auth(authEnv));
apiRouter.use('/auth', await authPlugin(authEnv));
apiRouter.use('/search', await search(searchEnv));
apiRouter.use('/techdocs', await techdocs(techdocsEnv));
apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv));
+15
View File
@@ -1,5 +1,20 @@
# @backstage/backend-test-utils
## 1.3.1-next.2
### Patch Changes
- 37c6510: Moved `@types/jest` to `devDependencies`.
- Updated dependencies
- @backstage/backend-defaults@0.8.2-next.2
- @backstage/plugin-events-node@0.4.9-next.2
- @backstage/backend-app-api@1.2.1-next.2
- @backstage/backend-plugin-api@1.2.1-next.1
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/plugin-auth-node@0.6.1-next.1
## 1.3.1-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
"version": "1.3.1-next.1",
"version": "1.3.1-next.2",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
@@ -478,6 +478,7 @@ export class TestCaches {
// @public
export type TestDatabaseId =
| 'POSTGRES_17'
| 'POSTGRES_16'
| 'POSTGRES_15'
| 'POSTGRES_14'
@@ -28,6 +28,7 @@ export interface Engine {
* @public
*/
export type TestDatabaseId =
| 'POSTGRES_17'
| 'POSTGRES_16'
| 'POSTGRES_15'
| 'POSTGRES_14'
@@ -47,6 +48,13 @@ export type TestDatabaseProperties = {
export const allDatabases: Record<TestDatabaseId, TestDatabaseProperties> =
Object.freeze({
POSTGRES_17: {
name: 'Postgres 17.x',
driver: 'pg',
dockerImageName: getDockerImageForName('postgres:17'),
connectionStringEnvironmentVariableName:
'BACKSTAGE_TEST_DATABASE_POSTGRES17_CONNECTION_STRING',
},
POSTGRES_16: {
name: 'Postgres 16.x',
driver: 'pg',
+38
View File
@@ -1,5 +1,43 @@
# example-backend
## 0.0.36-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-scaffolder-backend@1.31.0-next.2
- @backstage/plugin-catalog-backend@1.32.0-next.2
- @backstage/plugin-techdocs-backend@1.11.7-next.2
- @backstage/plugin-scaffolder-backend-module-github@0.6.1-next.2
- @backstage/backend-defaults@0.8.2-next.2
- @backstage/plugin-events-backend@0.4.4-next.2
- @backstage/backend-plugin-api@1.2.1-next.1
- @backstage/catalog-model@1.7.3
- @backstage/plugin-app-backend@0.5.0-next.2
- @backstage/plugin-auth-backend@0.24.4-next.2
- @backstage/plugin-auth-backend-module-github-provider@0.3.1-next.1
- @backstage/plugin-auth-backend-module-guest-provider@0.2.6-next.1
- @backstage/plugin-auth-node@0.6.1-next.1
- @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0-next.1
- @backstage/plugin-catalog-backend-module-openapi@0.2.8-next.2
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6-next.1
- @backstage/plugin-catalog-backend-module-unprocessed@0.5.6-next.1
- @backstage/plugin-devtools-backend@0.5.3-next.2
- @backstage/plugin-kubernetes-backend@0.19.4-next.1
- @backstage/plugin-notifications-backend@0.5.4-next.2
- @backstage/plugin-permission-backend@0.5.55-next.1
- @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6-next.1
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-permission-node@0.8.9-next.1
- @backstage/plugin-proxy-backend@0.6.0-next.1
- @backstage/plugin-scaffolder-backend-module-notifications@0.1.8-next.2
- @backstage/plugin-search-backend@1.8.3-next.2
- @backstage/plugin-search-backend-module-catalog@0.3.2-next.1
- @backstage/plugin-search-backend-module-explore@0.2.9-next.1
- @backstage/plugin-search-backend-module-techdocs@0.3.7-next.2
- @backstage/plugin-search-backend-node@1.3.9-next.1
- @backstage/plugin-signals-backend@0.3.2-next.2
## 0.0.36-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.0.36-next.1",
"version": "0.0.36-next.2",
"backstage": {
"role": "backend"
},
+1 -1
View File
@@ -2,4 +2,4 @@
storybook-static
# CSS output
css
/css
+1 -4
View File
@@ -1,10 +1,7 @@
import React from 'react';
import type { Preview, ReactRenderer } from '@storybook/react';
import { withThemeByDataAttribute } from '@storybook/addon-themes';
// Canon specific styles
import '../src/css/core.css';
import '../src/css/components.css';
import '../src/css/styles.css';
const preview: Preview = {
parameters: {

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