Merge pull request #7 from backstage/master

Fetching commits from main
This commit is contained in:
vidhanshah
2025-11-12 21:15:28 +05:30
committed by GitHub
205 changed files with 5402 additions and 1650 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-org': patch
---
Improved responsiveness of GroupProfileCard component
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Bumped create-app version.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-home': patch
---
Allow customization of VisitList by adding optional enrichVisit, transformPathname, canSave functions to VisitsStorageApi, along with VisitDisplayProvider for colors, labels
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': patch
---
Added missing i18n
+9
View File
@@ -0,0 +1,9 @@
---
'@backstage/plugin-notifications-backend': minor
'@backstage/plugin-notifications-common': minor
---
Adds support for default configuration for an entire notification channel.
This setting will also be inherited down to origins and topics while still respecting the users individual choices.
This will be handy if you want to use a "opt-in" strategy.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/ui': patch
---
Improved visual consistency of PasswordField, SearchField, and MenuAutocomplete components.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/repo-tools': minor
---
The `package-docs` command will now automatically use a `typedoc.json` file if one exists at the root of your project.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-plugin-api': minor
---
Explicitly mark `coreServices.rootInstanceMetadata` as a root service.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-test-utils': patch
---
Tweak some of the mock services to have more precise types
+17
View File
@@ -0,0 +1,17 @@
---
'@backstage/frontend-plugin-api': patch
---
Added support for plugin-relative `attachTo` declarations for extension definitions. This allows for the creation of extension and extension blueprints that attach to other extensions of a particular `kind` in the same plugin, rather than needing to provide the exact extension ID. This is particularly useful when wanting to provide extension blueprints with a built-in hierarchy where the extensions created from one blueprint attach to extensions created from the other blueprint, for example:
```ts
// kind: 'tabbed-page'
const parentPage = TabbedPageBlueprint.make({
params: {....}
})
// attachTo: { kind: 'tabbed-page', input: 'tabs' }
const child1 = TabContentBlueprint.make({
name: 'tab1',
params: {....}
})
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/ui': patch
---
Removed `@base-ui-components/react` dependency as all components now use React Aria Components.
+21
View File
@@ -208,6 +208,7 @@
},
"changesets": [
"all-camels-agree",
"all-parrots-change",
"better-hats-cross",
"better-steaks-act",
"breezy-times-ring",
@@ -215,13 +216,19 @@
"busy-goats-create",
"clever-boats-clap",
"create-app-1761312116",
"create-app-1762897504",
"cruel-items-dig",
"cruel-plums-talk",
"deep-gifts-slide",
"easy-hands-grow",
"eighty-mails-leave",
"eighty-results-prove",
"eleven-carpets-win",
"eleven-lights-taste",
"every-ants-count",
"every-clocks-arrive",
"fancy-years-camp",
"fast-tables-sink",
"fast-tools-mate",
"fine-hands-return",
"five-seas-jam",
@@ -233,24 +240,34 @@
"giant-lamps-happen",
"grumpy-planes-bet",
"heavy-cars-wash",
"honest-lamps-occur",
"honest-pandas-win",
"huge-taxis-grab",
"itchy-bars-smell",
"legal-weeks-walk",
"lemon-spies-sleep",
"long-humans-sink",
"long-impalas-burn",
"loud-carpets-throw",
"moody-plums-add",
"ninety-cobras-feel",
"odd-states-melt",
"open-cloths-listen",
"open-items-open",
"plugin-relative-extensions",
"polite-eggs-dance",
"polite-seas-divide",
"pretty-kids-allow",
"purple-deer-bet",
"quiet-singers-pick",
"renovate-cd75086",
"rich-streets-rule",
"ripe-crabs-care",
"seven-cycles-pick",
"sharp-dragons-relate",
"short-sides-feel",
"silver-garlics-thank",
"sixty-clowns-run",
"smart-donuts-teach",
"solid-bees-agree",
"solid-dancers-march",
@@ -259,11 +276,15 @@
"tender-regions-know",
"thirty-hoops-own",
"tough-sloths-spend",
"true-taxes-cover",
"twelve-spoons-feel",
"typescript-constructor-refactor",
"upset-teeth-add",
"warm-carrots-lead",
"warm-ducks-notice",
"warm-moments-repeat",
"warm-shrimps-clap",
"wicked-cycles-enter",
"wide-papers-run",
"wild-donkeys-sneeze",
"wild-owls-divide",
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-graph': patch
---
Ensure the catalog graph entity card respects the height prop so the visualization scales down properly on wide screens.
+8
View File
@@ -0,0 +1,8 @@
---
'@backstage/plugin-kubernetes-backend': patch
'@backstage/plugin-kubernetes-common': patch
'@backstage/plugin-kubernetes-node': patch
'@backstage/plugin-kubernetes-react': patch
---
Updated dependency `@kubernetes/client-node` to `1.4.0`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-app-visualizer': patch
---
Migrated to use `@backstage/ui`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/ui': patch
---
Added `loading` prop to Button and ButtonIcon components for displaying spinner during async operations.
+9
View File
@@ -0,0 +1,9 @@
---
'@backstage/ui': minor
---
**BREAKING**: The `SelectProps` interface now accepts a generic type parameter for selection mode.
Added searchable and multiple selection support to Select component. The component now accepts `searchable`, `selectionMode`, and `searchPlaceholder` props to enable filtering and multi-selection modes.
Migration: If you're using `SelectProps` type directly, update from `SelectProps` to `SelectProps<'single' | 'multiple'>`. Component usage remains backward compatible.
@@ -23,7 +23,7 @@ jobs:
comment-cache-key: ${{ steps.hash.outputs.COMMENT_FILE_HASH }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
disable-sudo: true
egress-policy: block
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -40,7 +40,7 @@ jobs:
name: Test ${{ matrix.node-version }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+2 -2
View File
@@ -28,7 +28,7 @@ jobs:
name: Install ${{ matrix.node-version }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -64,7 +64,7 @@ jobs:
name: Verify ${{ matrix.node-version }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
timeout-minutes: 10
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+4 -4
View File
@@ -23,7 +23,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -135,7 +135,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -240,7 +240,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -329,7 +329,7 @@ jobs:
run: ls microsite/build && ls microsite/build/storybook && ls microsite/build/api/stable && ls microsite/build/api/next
- name: Deploy both microsite and storybook to gh-pages
uses: JamesIves/github-pages-deploy-action@6c2d9db40f9296374acc17b90404b6e8864128c8 # v4.7.3
uses: JamesIves/github-pages-deploy-action@4a3abc783e1a24aeb44c16e869ad83caf6b4cc23 # v4.7.4
with:
branch: gh-pages
folder: microsite/build
+1 -1
View File
@@ -151,7 +151,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
if: github.repository == 'backstage/backstage'
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -20,7 +20,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
steps:
# Inspired by https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -18,7 +18,7 @@ jobs:
if: github.repository == 'backstage/backstage' && ( github.event.pull_request || github.event.issue.pull_request )
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+2 -2
View File
@@ -29,7 +29,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -39,7 +39,7 @@ jobs:
persist-credentials: false
- name: 'Run analysis'
uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
+1 -1
View File
@@ -8,7 +8,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -11,7 +11,7 @@ jobs:
if: github.actor == 'dependabot[bot]' && github.repository == 'backstage/backstage'
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -8,7 +8,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -11,7 +11,7 @@ jobs:
if: github.actor == 'renovate[bot]' && github.repository == 'backstage/backstage'
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -26,7 +26,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
name: Chromatic
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
name: Chromatic
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -42,7 +42,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -29,7 +29,7 @@ jobs:
name: E2E Linux ${{ matrix.node-version }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
name: E2E Linux ${{ matrix.node-version }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -32,7 +32,7 @@ jobs:
name: Techdocs
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -25,7 +25,7 @@ jobs:
name: E2E Windows ${{ matrix.node-version }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -33,7 +33,7 @@ jobs:
name: E2E Windows ${{ matrix.node-version }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
name: Microsite
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+3 -3
View File
@@ -28,7 +28,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -137,7 +137,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -234,7 +234,7 @@ jobs:
name: Microsite
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -29,7 +29,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.0
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
with:
egress-policy: audit
+1 -1
View File
@@ -1,5 +1,5 @@
> [!NOTE]
> 🏖 From Monday October 27th through November 3rd, maintainers and Spotify employees will be on vacation due to Wellness Week. Expect the project to move a little slower than normal, and support to be limited. Normal service will resume after that! 🏝
> ✈️ From Monday November 10th through November 14rd, several maintainers and Spotify employees will be at KubeCon / BackstageCon! Expect the project to move a little slower than normal, and support to be limited. Normal service will resume after that! And do come visit our booth if you are there. ✈️
[![headline](docs/assets/headline.png)](https://backstage.io/)
+1 -1
View File
@@ -24,7 +24,7 @@ services:
timeout: 3s
retries: 5
opensearch:
image: opensearchproject/opensearch:2.19.3
image: opensearchproject/opensearch:2.19.4
environment:
plugins.security.disabled: true
discovery.type: single-node
+1
View File
@@ -16,6 +16,7 @@
"@types/react-dom": "19.1.7"
},
"dependencies": {
"@base-ui-components/react": "^1.0.0-beta.4",
"@codemirror/lang-sass": "^6.0.2",
"@codemirror/view": "^6.34.4",
"@lezer/highlight": "^1.2.1",
+13
View File
@@ -9,6 +9,7 @@ import {
buttonIconVariantsSnippet,
buttonIconSizesSnippet,
buttonIconDisabledSnippet,
buttonIconLoadingSnippet,
buttonIconResponsiveSnippet,
buttonIconAsLinkSnippet,
} from './button-icon.props';
@@ -74,6 +75,18 @@ Here's a view when buttons are disabled.
code={buttonIconDisabledSnippet}
/>
### Loading
Here's a view when buttons are in a loading state.
<Snippet
align="center"
py={4}
open
preview={<ButtonIconSnippet story="Loading" />}
code={buttonIconLoadingSnippet}
/>
### Responsive
Here's a view when buttons are responsive.
+3
View File
@@ -19,6 +19,7 @@ export const buttonIconPropDefs: Record<string, PropDef> = {
},
icon: { type: 'enum', values: ['ReactNode'], responsive: false },
isDisabled: { type: 'boolean', default: 'false', responsive: false },
loading: { type: 'boolean', default: 'false', responsive: false },
type: {
type: 'enum',
values: ['button', 'submit', 'reset'],
@@ -50,6 +51,8 @@ export const buttonIconSizesSnippet = `<Flex align="center">
export const buttonIconDisabledSnippet = `<ButtonIcon icon={<Icon name="cloud" />} isDisabled />`;
export const buttonIconLoadingSnippet = `<ButtonIcon icon={<Icon name="cloud" />} variant="primary" loading={isLoading} onPress={handleClick} />`;
export const buttonIconResponsiveSnippet = `<ButtonIcon icon={<Icon name="cloud" />} variant={{ initial: 'primary', lg: 'secondary' }} />`;
export const buttonIconAsLinkSnippet = `import { ButtonLink } from '@backstage/ui';
+13
View File
@@ -9,6 +9,7 @@ import {
buttonSizesSnippet,
buttonIconsSnippet,
buttonDisabledSnippet,
buttonLoadingSnippet,
buttonResponsiveSnippet,
buttonAsLinkSnippet,
} from './button.props';
@@ -86,6 +87,18 @@ Here's a view when buttons are disabled.
code={buttonDisabledSnippet}
/>
### Loading
Here's a view when buttons are in a loading state.
<Snippet
align="center"
py={4}
open
preview={<ButtonSnippet story="Loading" />}
code={buttonLoadingSnippet}
/>
### Responsive
Here's a view when buttons are responsive.
+5
View File
@@ -17,6 +17,7 @@ export const buttonPropDefs: Record<string, PropDef> = {
iconStart: { type: 'enum', values: ['ReactNode'], responsive: false },
iconEnd: { type: 'enum', values: ['ReactNode'], responsive: false },
isDisabled: { type: 'boolean', default: 'false', responsive: false },
loading: { type: 'boolean', default: 'false', responsive: false },
children: { type: 'enum', values: ['ReactNode'], responsive: false },
type: {
type: 'enum',
@@ -65,6 +66,10 @@ export const buttonResponsiveSnippet = `<Button variant={{ initial: 'primary', l
Responsive Button
</Button>`;
export const buttonLoadingSnippet = `<Button variant="primary" loading={isLoading} onPress={handleClick}>
Load more items
</Button>`;
export const buttonAsLinkSnippet = `import { ButtonLink } from '@backstage/ui';
<ButtonLink href="https://ui.backstage.io" target="_blank">
+39
View File
@@ -11,6 +11,9 @@ import {
selectDisabledSnippet,
selectResponsiveSnippet,
selectIconSnippet,
selectSearchableSnippet,
selectMultipleSnippet,
selectSearchableMultipleSnippet,
} from './select.props';
import { PageTitle } from '@/components/PageTitle';
import { Theming } from '@/components/Theming';
@@ -87,6 +90,42 @@ Here's a view when the select is disabled.
code={selectDisabledSnippet}
/>
### Searchable
Here's a view when the select has searchable filtering.
<Snippet
align="center"
py={4}
open
preview={<SelectSnippet story="Searchable" />}
code={selectSearchableSnippet}
/>
### Multiple Selection
Here's a view when the select allows multiple selections.
<Snippet
align="center"
py={4}
open
preview={<SelectSnippet story="MultipleSelection" />}
code={selectMultipleSnippet}
/>
### Searchable with Multiple Selection
Here's a view when the select combines search and multiple selection.
<Snippet
align="center"
py={4}
open
preview={<SelectSnippet story="SearchableMultiple" />}
code={selectSearchableMultipleSnippet}
/>
### Responsive
Here's a view when the select is responsive.
+71 -13
View File
@@ -23,6 +23,12 @@ export const selectPropDefs: Record<string, PropDef> = {
values: ['Array<{ value: string, label: string }>'],
required: true,
},
selectionMode: {
type: 'enum',
values: ['single', 'multiple'],
default: 'single',
responsive: false,
},
placeholder: {
type: 'string',
default: 'Select an item',
@@ -34,17 +40,23 @@ export const selectPropDefs: Record<string, PropDef> = {
responsive: false,
},
value: {
type: 'string',
type: 'enum',
values: ['string', 'string[]'],
responsive: false,
description:
'Selected value (controlled). String for single selection, array for multiple.',
},
defaultValue: {
type: 'string',
type: 'enum',
values: ['string', 'string[]'],
responsive: false,
description:
'Initial value (uncontrolled). String for single selection, array for multiple.',
},
size: {
type: 'enum',
values: ['small', 'medium'],
default: 'medium',
default: 'small',
responsive: true,
},
isOpen: {
@@ -57,7 +69,7 @@ export const selectPropDefs: Record<string, PropDef> = {
},
disabledKeys: {
type: 'enum',
values: ['string[]'],
values: ['Iterable<Key>'],
responsive: false,
},
isDisabled: {
@@ -72,14 +84,6 @@ export const selectPropDefs: Record<string, PropDef> = {
type: 'boolean',
responsive: false,
},
selectedKey: {
type: 'string',
responsive: false,
},
defaultSelectedKey: {
type: 'string',
responsive: false,
},
onOpenChange: {
type: 'enum',
values: ['(isOpen: boolean) => void'],
@@ -87,7 +91,19 @@ export const selectPropDefs: Record<string, PropDef> = {
},
onSelectionChange: {
type: 'enum',
values: ['(key: Key | null) => void'],
values: ['(key: Key | null) => void', '(keys: Selection) => void'],
responsive: false,
description:
'Handler called when selection changes. Single mode: receives Key | null. Multiple mode: receives Selection.',
},
searchable: {
type: 'boolean',
default: 'false',
responsive: false,
},
searchPlaceholder: {
type: 'string',
default: 'Search...',
responsive: false,
},
...classNamePropDefs,
@@ -151,3 +167,45 @@ export const selectResponsiveSnippet = `<Select
label="Font family"
options={[ ... ]}
/>`;
export const selectSearchableSnippet = `<Select
name="country"
label="Country"
searchable
searchPlaceholder="Search countries..."
options={[
{ value: 'us', label: 'United States' },
{ value: 'ca', label: 'Canada' },
{ value: 'uk', label: 'United Kingdom' },
{ value: 'fr', label: 'France' },
{ value: 'de', label: 'Germany' },
// ... more options
]}
/>`;
export const selectMultipleSnippet = `<Select
name="options"
label="Select multiple options"
selectionMode="multiple"
options={[
{ value: 'option1', label: 'Option 1' },
{ value: 'option2', label: 'Option 2' },
{ value: 'option3', label: 'Option 3' },
{ value: 'option4', label: 'Option 4' },
]}
/>`;
export const selectSearchableMultipleSnippet = `<Select
name="skills"
label="Skills"
searchable
selectionMode="multiple"
searchPlaceholder="Filter skills..."
options={[
{ value: 'react', label: 'React' },
{ value: 'typescript', label: 'TypeScript' },
{ value: 'javascript', label: 'JavaScript' },
{ value: 'python', label: 'Python' },
// ... more options
]}
/>`;
+163 -50
View File
@@ -23,10 +23,51 @@ __metadata:
languageName: node
linkType: hard
"@babel/runtime@npm:^7.18.6":
version: 7.28.3
resolution: "@babel/runtime@npm:7.28.3"
checksum: 10/f2415e4dbface7496f6fc561d640b44be203071fb0dfb63fbe338c7d2d2047419cb054ef13d1ebb8fc11e35d2b55aa3045def4b985e8b82aea5d7e58e1133e52
"@babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.28.4":
version: 7.28.4
resolution: "@babel/runtime@npm:7.28.4"
checksum: 10/6c9a70452322ea80b3c9b2a412bcf60771819213a67576c8cec41e88a95bb7bf01fc983754cda35dc19603eef52df22203ccbf7777b9d6316932f9fb77c25163
languageName: node
linkType: hard
"@base-ui-components/react@npm:^1.0.0-beta.4":
version: 1.0.0-beta.4
resolution: "@base-ui-components/react@npm:1.0.0-beta.4"
dependencies:
"@babel/runtime": "npm:^7.28.4"
"@base-ui-components/utils": "npm:0.1.2"
"@floating-ui/react-dom": "npm:^2.1.6"
"@floating-ui/utils": "npm:^0.2.10"
reselect: "npm:^5.1.1"
tabbable: "npm:^6.2.0"
use-sync-external-store: "npm:^1.5.0"
peerDependencies:
"@types/react": ^17 || ^18 || ^19
react: ^17 || ^18 || ^19
react-dom: ^17 || ^18 || ^19
peerDependenciesMeta:
"@types/react":
optional: true
checksum: 10/d2c6a779aaefa3454cc130244e839f0428460997f3ca8bbcd9636056bc5a4c77436cc0ceac064f34bdc7cb01489a4cbc4d8b0bf9668a023fa754e5a24bd3af4e
languageName: node
linkType: hard
"@base-ui-components/utils@npm:0.1.2":
version: 0.1.2
resolution: "@base-ui-components/utils@npm:0.1.2"
dependencies:
"@babel/runtime": "npm:^7.28.4"
"@floating-ui/utils": "npm:^0.2.10"
reselect: "npm:^5.1.1"
use-sync-external-store: "npm:^1.5.0"
peerDependencies:
"@types/react": ^17 || ^18 || ^19
react: ^17 || ^18 || ^19
react-dom: ^17 || ^18 || ^19
peerDependenciesMeta:
"@types/react":
optional: true
checksum: 10/b8408f5ad55886f793fb7580ffe2bb9565ff0713bec324f726b88ee1d135d75b26a1312338b19af743adf52e5b9d46892a47fb225e6abfe1077e75d32e88fb6e
languageName: node
linkType: hard
@@ -401,6 +442,44 @@ __metadata:
languageName: node
linkType: hard
"@floating-ui/core@npm:^1.7.3":
version: 1.7.3
resolution: "@floating-ui/core@npm:1.7.3"
dependencies:
"@floating-ui/utils": "npm:^0.2.10"
checksum: 10/a8952ff2673ddf28f12feeb86d90c54949e45bcb1af5758b7672850ac0dadb36d4bd61aa45dad1b6a35ba40d4756d3573afac6610b90502639d7266b91e0864e
languageName: node
linkType: hard
"@floating-ui/dom@npm:^1.7.4":
version: 1.7.4
resolution: "@floating-ui/dom@npm:1.7.4"
dependencies:
"@floating-ui/core": "npm:^1.7.3"
"@floating-ui/utils": "npm:^0.2.10"
checksum: 10/d3d6a23e7b9804ba56338c7c666590258683af14b6026270d32afc1202f72b5b82cca359004bdc7830bf2463a045da6c7bd4e7d5351218cf270ff94206197971
languageName: node
linkType: hard
"@floating-ui/react-dom@npm:^2.1.6":
version: 2.1.6
resolution: "@floating-ui/react-dom@npm:2.1.6"
dependencies:
"@floating-ui/dom": "npm:^1.7.4"
peerDependencies:
react: ">=16.8.0"
react-dom: ">=16.8.0"
checksum: 10/fbfd3319b42edb9c156e4e872f500d2edb112bc9cfd1b45892bff16ccf21c2484ddc9c416f7631c2aaaadec1b2f98b205db8a3f89eb78ca870905fcfe3917c35
languageName: node
linkType: hard
"@floating-ui/utils@npm:^0.2.10":
version: 0.2.10
resolution: "@floating-ui/utils@npm:0.2.10"
checksum: 10/b635ea865a8be2484b608b7157f5abf9ed439f351011a74b7e988439e2898199a9a8b790f52291e05bdcf119088160dc782d98cff45cc98c5a271bc6f51327ae
languageName: node
linkType: hard
"@humanwhocodes/config-array@npm:^0.13.0":
version: 0.13.0
resolution: "@humanwhocodes/config-array@npm:0.13.0"
@@ -705,8 +784,8 @@ __metadata:
linkType: hard
"@mdx-js/loader@npm:^3.1.0":
version: 3.1.0
resolution: "@mdx-js/loader@npm:3.1.0"
version: 3.1.1
resolution: "@mdx-js/loader@npm:3.1.1"
dependencies:
"@mdx-js/mdx": "npm:^3.0.0"
source-map: "npm:^0.7.0"
@@ -715,7 +794,7 @@ __metadata:
peerDependenciesMeta:
webpack:
optional: true
checksum: 10/983b8d4949f4d214a17f4ad8597a50de36ace75e93292d2493b5fb6077d69d6abc8230b62f88b818c04f12a01d281d63edb6a0738937f7e259406a73ce998134
checksum: 10/b78afe06e49b5c0bec9e5b232fbc874ffa721ff6b022bdaa7a29e2b5a44fa9f8282aa2b34f74701ca0b8750b33a775cd3182aaba5202e209f3d66961600c930f
languageName: node
linkType: hard
@@ -2299,6 +2378,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "docs-ui@workspace:."
dependencies:
"@base-ui-components/react": "npm:^1.0.0-beta.4"
"@codemirror/lang-sass": "npm:^6.0.2"
"@codemirror/view": "npm:^6.34.4"
"@lezer/highlight": "npm:^1.2.1"
@@ -4229,92 +4309,102 @@ __metadata:
languageName: node
linkType: hard
"lightningcss-darwin-arm64@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-darwin-arm64@npm:1.30.1"
"lightningcss-android-arm64@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-android-arm64@npm:1.30.2"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"lightningcss-darwin-arm64@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-darwin-arm64@npm:1.30.2"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"lightningcss-darwin-x64@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-darwin-x64@npm:1.30.1"
"lightningcss-darwin-x64@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-darwin-x64@npm:1.30.2"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"lightningcss-freebsd-x64@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-freebsd-x64@npm:1.30.1"
"lightningcss-freebsd-x64@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-freebsd-x64@npm:1.30.2"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"lightningcss-linux-arm-gnueabihf@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-linux-arm-gnueabihf@npm:1.30.1"
"lightningcss-linux-arm-gnueabihf@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-linux-arm-gnueabihf@npm:1.30.2"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"lightningcss-linux-arm64-gnu@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-linux-arm64-gnu@npm:1.30.1"
"lightningcss-linux-arm64-gnu@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-linux-arm64-gnu@npm:1.30.2"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"lightningcss-linux-arm64-musl@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-linux-arm64-musl@npm:1.30.1"
"lightningcss-linux-arm64-musl@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-linux-arm64-musl@npm:1.30.2"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"lightningcss-linux-x64-gnu@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-linux-x64-gnu@npm:1.30.1"
"lightningcss-linux-x64-gnu@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-linux-x64-gnu@npm:1.30.2"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"lightningcss-linux-x64-musl@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-linux-x64-musl@npm:1.30.1"
"lightningcss-linux-x64-musl@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-linux-x64-musl@npm:1.30.2"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"lightningcss-win32-arm64-msvc@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-win32-arm64-msvc@npm:1.30.1"
"lightningcss-win32-arm64-msvc@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-win32-arm64-msvc@npm:1.30.2"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"lightningcss-win32-x64-msvc@npm:1.30.1":
version: 1.30.1
resolution: "lightningcss-win32-x64-msvc@npm:1.30.1"
"lightningcss-win32-x64-msvc@npm:1.30.2":
version: 1.30.2
resolution: "lightningcss-win32-x64-msvc@npm:1.30.2"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"lightningcss@npm:^1.28.2":
version: 1.30.1
resolution: "lightningcss@npm:1.30.1"
version: 1.30.2
resolution: "lightningcss@npm:1.30.2"
dependencies:
detect-libc: "npm:^2.0.3"
lightningcss-darwin-arm64: "npm:1.30.1"
lightningcss-darwin-x64: "npm:1.30.1"
lightningcss-freebsd-x64: "npm:1.30.1"
lightningcss-linux-arm-gnueabihf: "npm:1.30.1"
lightningcss-linux-arm64-gnu: "npm:1.30.1"
lightningcss-linux-arm64-musl: "npm:1.30.1"
lightningcss-linux-x64-gnu: "npm:1.30.1"
lightningcss-linux-x64-musl: "npm:1.30.1"
lightningcss-win32-arm64-msvc: "npm:1.30.1"
lightningcss-win32-x64-msvc: "npm:1.30.1"
lightningcss-android-arm64: "npm:1.30.2"
lightningcss-darwin-arm64: "npm:1.30.2"
lightningcss-darwin-x64: "npm:1.30.2"
lightningcss-freebsd-x64: "npm:1.30.2"
lightningcss-linux-arm-gnueabihf: "npm:1.30.2"
lightningcss-linux-arm64-gnu: "npm:1.30.2"
lightningcss-linux-arm64-musl: "npm:1.30.2"
lightningcss-linux-x64-gnu: "npm:1.30.2"
lightningcss-linux-x64-musl: "npm:1.30.2"
lightningcss-win32-arm64-msvc: "npm:1.30.2"
lightningcss-win32-x64-msvc: "npm:1.30.2"
dependenciesMeta:
lightningcss-android-arm64:
optional: true
lightningcss-darwin-arm64:
optional: true
lightningcss-darwin-x64:
@@ -4335,7 +4425,7 @@ __metadata:
optional: true
lightningcss-win32-x64-msvc:
optional: true
checksum: 10/6c921135216cc498dfcb87e35dffe8432e99306cbd58009c598b1daf20c81cc14535abbd4c1066e5d1faf4080ed44a2995e8ecc343633db4897a2d041b76fb05
checksum: 10/d6cc06d9bac295589a49446e9c45a241dfa16f4f81a7318c26cbc0be3e189003ec0da5d9a0fd9bdffc63a3ce05878cc7329277eaac77a826e8b68c73dc96cfda
languageName: node
linkType: hard
@@ -5768,6 +5858,13 @@ __metadata:
languageName: node
linkType: hard
"reselect@npm:^5.1.1":
version: 5.1.1
resolution: "reselect@npm:5.1.1"
checksum: 10/1fdae11a39ed9c8d85a24df19517c8372ee24fefea9cce3fae9eaad8e9cefbba5a3d4940c6fe31296b6addf76e035588c55798f7e6e147e1b7c0855f119e7fa5
languageName: node
linkType: hard
"resolve-from@npm:^4.0.0":
version: 4.0.0
resolution: "resolve-from@npm:4.0.0"
@@ -6455,6 +6552,13 @@ __metadata:
languageName: node
linkType: hard
"tabbable@npm:^6.2.0":
version: 6.3.0
resolution: "tabbable@npm:6.3.0"
checksum: 10/3e54a0b770d26bc20c3de5837652be19f5efa8bfa869f580af24bcf60de934506e9401a577213186b5e86ebcf6b5290a5429d354cc3041471815f5095e44e51a
languageName: node
linkType: hard
"tar@npm:^7.4.3":
version: 7.4.3
resolution: "tar@npm:7.4.3"
@@ -6836,6 +6940,15 @@ __metadata:
languageName: node
linkType: hard
"use-sync-external-store@npm:^1.5.0":
version: 1.6.0
resolution: "use-sync-external-store@npm:1.6.0"
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
checksum: 10/b40ad2847ba220695bff2d4ba4f4d60391c0fb4fb012faa7a4c18eb38b69181936f5edc55a522c4d20a788d1a879b73c3810952c9d0fd128d01cb3f22042c09e
languageName: node
linkType: hard
"util@npm:^0.12.5":
version: 0.12.5
resolution: "util@npm:0.12.5"
@@ -352,3 +352,69 @@ const extension = createExtension({
},
});
```
## Relative attachment points
When creating an extension or an [extension blueprint](./23-extension-blueprints.md) you can specify an attachment point that is relative to the current plugin. This is particularly useful for groups of blueprints that are part of a common hierarchy, with extensions from one blueprint attaching to extensions from the other blueprint. For example, the following pair of extension definitions could be installed multiple times in different plugins, each creating their own hierarchy:
```tsx
// Parent extension with a fixed attachment point
const parentExtension = createExtension({
kind: 'section',
attachTo: [{ id: 'app/some-fixed-extension', input: 'children' }],
inputs: {
content: createExtensionInput([coreExtensionData.reactElement], {
singleton: true,
}),
},
output: [coreExtensionData.reactElement],
factory({ inputs }) {
return [
coreExtensionData.reactElement(
<section>
<h1>Section Title</h1>
{inputs.content.get(coreExtensionData.reactElement)}
</section>,
),
];
},
});
// Child extension with a relative attachment point
const childExtension = createExtension({
kind: 'section-content',
attachTo: [{ relative: { kind: 'section' }, input: 'content' }],
output: [coreExtensionData.reactElement],
factory() {
return [coreExtensionData.reactElement(<p>Section Content</p>)];
},
});
```
## Extension input references
Building on the relative attachment point concept, you can also reference extension inputs directly via the `inputs` property of an extension definition. This provides a more convenient and type-safe way to attach child extensions, especially when using blueprints that provide a nested hierarchy of extensions.
Extension inputs references are always relative, this means that they can only be used for referencing extensions within the same plugin.
Each extension definition exposes an `inputs` property that contains references to all of its defined inputs. These references can be passed directly to the `attachTo` option when creating child extensions:
```tsx
const parent = createExtension({
inputs: {
children: createExtensionInput([coreExtensionData.reactElement]),
},
// other options...
});
// Create a child extension that attaches to the parent's input
const child = createExtension({
attachTo: page.inputs.children, // Direct reference to the input
output: [coreExtensionData.reactElement], // Outputs are verified against the parent input
// other options...
});
```
These references are a type-safe way to attach child extensions, it both ensures that the parent input is present, as well as the child providing the required data for the parent.
Under the hood, input references are resolved in the same way as relative attachment points, using the extension's kind, namespace, and name to construct the final attachment target.
+55
View File
@@ -164,6 +164,61 @@ You can customize the origin names shown in the UI by passing an object where th
Each notification processor will receive its own row in the settings page, where the user can enable or disable notifications from that processor.
### Default notification settings
You can configure default notification settings for all users in your `app-config.yaml` file. This allows you to set up notification preferences globally, such as disabling specific channels or origins by default, implementing an opt-in strategy instead of opt-out.
#### Channel-level defaults
You can set a default enabled state for an entire channel. When set to `false`, the channel uses an opt-in strategy where notifications are disabled by default unless explicitly enabled by the user or for specific origins.
```yaml
notifications:
defaultSettings:
channels:
- id: 'Web'
enabled: false # Opt-in strategy: channel disabled by default
- id: 'Email'
enabled: true # Opt-out strategy: channel enabled by default (default behavior)
```
#### Origin-level defaults
You can also configure defaults for specific origins within a channel:
```yaml
notifications:
defaultSettings:
channels:
- id: 'Web'
enabled: true # Channel is enabled by default
origins:
- id: 'plugin:scaffolder'
enabled: false # Disable scaffolder notifications by default
- id: 'plugin:catalog'
enabled: true # Enable catalog notifications by default
```
#### Topic-level defaults
For even more granular control, you can set defaults for specific topics within origins:
```yaml
notifications:
defaultSettings:
channels:
- id: 'Email'
enabled: false # Email is opt-in by default
origins:
- id: 'plugin:catalog'
enabled: true # But catalog notifications are enabled
topics:
- id: 'entity:validation:error'
enabled: false # Except validation errors
```
**Note:** If a channel's `enabled` flag is not set, it defaults to `true` for backwards compatibility. When a channel is set to `enabled: false`, all origins within that channel default to disabled unless explicitly enabled.
### Automatic notification cleanup
Notifications are deleted automatically after a certain period of time to prevent the database from growing indefinitely
+12 -3
View File
@@ -48,11 +48,20 @@ This will think for a bit, and then say `Listening on :7007`. In a different
terminal window, now run
```sh
curl localhost:7007/api/carmen/health
curl localhost:7007/api/carmen/todos
```
This should return `{"status":"ok"}`. Success! Press `Ctrl + c` to stop it
again.
You should see the following response:
```json
{
"items": []
}
```
:::note Note: The route shown here matches the default in the current backend plugin template. If you want a `/health` endpoint for health checks, you can add it to your router yourself.
:::
## Developing your Backend Plugin
+282
View File
@@ -0,0 +1,282 @@
# Release v1.45.0-next.3
Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.45.0-next.3](https://backstage.github.io/upgrade-helper/?to=1.45.0-next.3)
## @backstage/backend-plugin-api@1.5.0-next.2
### Minor Changes
- 62fc2de: Explicitly mark `coreServices.rootInstanceMetadata` as a root service.
## @backstage/repo-tools@0.16.0-next.2
### Minor Changes
- 11c61f2: The `package-docs` command will now automatically use a `typedoc.json` file if one exists at the root of your project.
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.5.0-next.2
## @backstage/ui@0.9.0-next.3
### Minor Changes
- 83c100e: **BREAKING**: Removed `Collapsible` component. Migrate to `Accordion` or use React Aria `Disclosure`.
## Migration Path 1: Accordion (Opinionated Styled Component)
Accordion provides preset styling with a similar component structure.
```diff
- import { Collapsible } from '@backstage/ui';
+ import { Accordion, AccordionTrigger, AccordionPanel } from '@backstage/ui';
- <Collapsible.Root>
- <Collapsible.Trigger render={(props) => <Button {...props}>Toggle</Button>} />
- <Collapsible.Panel>Content</Collapsible.Panel>
- </Collapsible.Root>
+ <Accordion>
+ <AccordionTrigger title="Toggle" />
+ <AccordionPanel>Content</AccordionPanel>
+ </Accordion>
```
CSS classes: `.bui-CollapsibleRoot``.bui-Accordion`, `.bui-CollapsibleTrigger``.bui-AccordionTrigger` (now on heading element), `.bui-CollapsiblePanel``.bui-AccordionPanel`
## Migration Path 2: React Aria Disclosure (Full Customization)
For custom styling without preset styles:
```tsx
import { Disclosure, Button, DisclosurePanel } from 'react-aria-components';
<Disclosure>
<Button slot="trigger">Toggle</Button>
<DisclosurePanel>Content</DisclosurePanel>
</Disclosure>;
```
- 816af0f: **BREAKING**: The `SelectProps` interface now accepts a generic type parameter for selection mode.
Added searchable and multiple selection support to Select component. The component now accepts `searchable`, `selectionMode`, and `searchPlaceholder` props to enable filtering and multi-selection modes.
Migration: If you're using `SelectProps` type directly, update from `SelectProps` to `SelectProps<'single' | 'multiple'>`. Component usage remains backward compatible.
### Patch Changes
- 35a3614: Fixed CSS issues in Select component including popover width constraints, focus outline behavior, and overflow handling.
- 01476f0: Improved visual consistency of PasswordField, SearchField, and MenuAutocomplete components.
- 836b0c7: Fixed dialog backdrop appearance in dark mode.
- 6d35a6b: Removed `@base-ui-components/react` dependency as all components now use React Aria Components.
- 7839e7b: Added `loading` prop to Button and ButtonIcon components for displaying spinner during async operations.
- a00fb88: Fixed Table Row component to properly support opening links in new tabs via right-click or Cmd+Click when using the href prop.
## @backstage/plugin-notifications-backend@0.6.0-next.2
### Minor Changes
- 87e597c: Adds support for default configuration for an entire notification channel.
This setting will also be inherited down to origins and topics while still respecting the users individual choices.
This will be handy if you want to use a "opt-in" strategy.
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-common@0.2.0-next.1
- @backstage/backend-plugin-api@1.5.0-next.2
- @backstage/plugin-notifications-node@0.2.21-next.2
## @backstage/plugin-notifications-common@0.2.0-next.1
### Minor Changes
- 87e597c: Adds support for default configuration for an entire notification channel.
This setting will also be inherited down to origins and topics while still respecting the users individual choices.
This will be handy if you want to use a "opt-in" strategy.
## @backstage/backend-test-utils@1.10.0-next.2
### Patch Changes
- f3001fd: Tweak some of the mock services to have more precise types
- Updated dependencies
- @backstage/backend-plugin-api@1.5.0-next.2
## @backstage/core-components@0.18.3-next.2
### Patch Changes
- 96ad674: Line numbers in LogViewer will not be selectable in UI anymore
## @backstage/create-app@0.7.6-next.3
### Patch Changes
- Bumped create-app version.
## @backstage/frontend-plugin-api@0.12.2-next.2
### Patch Changes
- 7c6a66d: Added support for plugin-relative `attachTo` declarations for extension definitions. This allows for the creation of extension and extension blueprints that attach to other extensions of a particular `kind` in the same plugin, rather than needing to provide the exact extension ID. This is particularly useful when wanting to provide extension blueprints with a built-in hierarchy where the extensions created from one blueprint attach to extensions created from the other blueprint, for example:
```ts
// kind: 'tabbed-page'
const parentPage = TabbedPageBlueprint.make({
params: {....}
})
// attachTo: { kind: 'tabbed-page', input: 'tabs' }
const child1 = TabContentBlueprint.make({
name: 'tab1',
params: {....}
})
```
- Updated dependencies
- @backstage/core-components@0.18.3-next.2
## @backstage/plugin-app-visualizer@0.1.25-next.2
### Patch Changes
- 722e2df: Migrated to use `@backstage/ui`.
- Updated dependencies
- @backstage/ui@0.9.0-next.3
- @backstage/frontend-plugin-api@0.12.2-next.2
- @backstage/core-components@0.18.3-next.2
## @backstage/plugin-catalog-graph@0.5.3-next.2
### Patch Changes
- a2d7ae7: Ensure the catalog graph entity card respects the height prop so the visualization scales down properly on wide screens.
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.3-next.2
- @backstage/frontend-plugin-api@0.12.2-next.2
- @backstage/core-components@0.18.3-next.2
## @backstage/plugin-catalog-react@1.21.3-next.2
### Patch Changes
- 36d7582: Added missing i18n
- Updated dependencies
- @backstage/frontend-plugin-api@0.12.2-next.2
- @backstage/core-components@0.18.3-next.2
## @backstage/plugin-home@0.8.14-next.1
### Patch Changes
- 2ac5d29: Allow customization of VisitList by adding optional enrichVisit, transformPathname, canSave functions to VisitsStorageApi, along with VisitDisplayProvider for colors, labels
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.3-next.2
- @backstage/frontend-plugin-api@0.12.2-next.2
- @backstage/core-components@0.18.3-next.2
## @backstage/plugin-kubernetes-backend@0.20.4-next.2
### Patch Changes
- 1906d37: Updated dependency `@kubernetes/client-node` to `1.4.0`.
- Updated dependencies
- @backstage/backend-plugin-api@1.5.0-next.2
- @backstage/plugin-kubernetes-common@0.9.8-next.1
- @backstage/plugin-kubernetes-node@0.3.6-next.2
## @backstage/plugin-kubernetes-common@0.9.8-next.1
### Patch Changes
- 1906d37: Updated dependency `@kubernetes/client-node` to `1.4.0`.
## @backstage/plugin-kubernetes-node@0.3.6-next.2
### Patch Changes
- 1906d37: Updated dependency `@kubernetes/client-node` to `1.4.0`.
- Updated dependencies
- @backstage/backend-plugin-api@1.5.0-next.2
- @backstage/plugin-kubernetes-common@0.9.8-next.1
## @backstage/plugin-kubernetes-react@0.5.13-next.1
### Patch Changes
- 1906d37: Updated dependency `@kubernetes/client-node` to `1.4.0`.
- Updated dependencies
- @backstage/plugin-kubernetes-common@0.9.8-next.1
- @backstage/core-components@0.18.3-next.2
## @backstage/plugin-notifications@0.5.11-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-common@0.2.0-next.1
- @backstage/frontend-plugin-api@0.12.2-next.2
- @backstage/core-components@0.18.3-next.2
## @backstage/plugin-notifications-backend-module-email@0.3.16-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-common@0.2.0-next.1
- @backstage/backend-plugin-api@1.5.0-next.2
- @backstage/plugin-notifications-node@0.2.21-next.2
## @backstage/plugin-notifications-backend-module-slack@0.2.1-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-common@0.2.0-next.1
- @backstage/backend-plugin-api@1.5.0-next.2
- @backstage/plugin-notifications-node@0.2.21-next.2
## @backstage/plugin-notifications-node@0.2.21-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-common@0.2.0-next.1
- @backstage/backend-plugin-api@1.5.0-next.2
## @backstage/plugin-org@0.6.46-next.1
### Patch Changes
- 6db9e7e: Improved responsiveness of GroupProfileCard component
- Updated dependencies
- @backstage/plugin-catalog-react@1.21.3-next.2
- @backstage/frontend-plugin-api@0.12.2-next.2
- @backstage/core-components@0.18.3-next.2
## @backstage/plugin-scaffolder-backend-module-notifications@0.1.16-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-common@0.2.0-next.1
- @backstage/backend-plugin-api@1.5.0-next.2
- @backstage/plugin-notifications-node@0.2.21-next.2
## example-backend@0.0.44-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-backend@0.6.0-next.2
- @backstage/backend-plugin-api@1.5.0-next.2
- @backstage/plugin-kubernetes-backend@0.20.4-next.2
- @backstage/plugin-scaffolder-backend-module-notifications@0.1.16-next.2
- @backstage/plugin-catalog-backend@3.2.0-next.1
- @backstage/plugin-events-backend@0.5.8-next.1
- @backstage/plugin-scaffolder-backend@3.0.1-next.1
- @backstage/plugin-search-backend@2.0.8-next.1
@@ -0,0 +1,9 @@
---
title: Usage Statistics
author: CodeVerse-GP
authorUrl: https://github.com/CodeVerse-GP
category: Monitoring
description: Shows usage statistics for scaffolder templates
documentation: https://github.com/CodeVerse-GP/usage-statistics/blob/main/README.md
npmPackageName: '@codeverse-gp/plugin-usage-statistics'
addedDate: '2025-11-05'
+3 -3
View File
@@ -2460,14 +2460,14 @@ __metadata:
linkType: hard
"@mdx-js/react@npm:^3.0.0":
version: 3.1.0
resolution: "@mdx-js/react@npm:3.1.0"
version: 3.1.1
resolution: "@mdx-js/react@npm:3.1.1"
dependencies:
"@types/mdx": "npm:^2.0.0"
peerDependencies:
"@types/react": ">=16"
react: ">=16"
checksum: 10/cf89d6392c76091622fb647f205e1ab5cbdf5edd4401dde7092138cefc9fbb6d61428aa63557de0bccca3695d5a8854dd4a93b34a27cb8e27369da7eaeaa3e73
checksum: 10/52a740e2f37761694fa94d4704b7825084b4055616a95c8b8f4c1676190d399ddc5cdbb399ffc45b550beecd30497a7224c2e5b05bf43ecb668c7473641037d1
languageName: node
linkType: hard
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "root",
"version": "1.45.0-next.2",
"version": "1.45.0-next.3",
"backstage": {
"cli": {
"new": {
@@ -0,0 +1,58 @@
/*
* Copyright 2025 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
coreServices,
createBackendPlugin,
} from '@backstage/backend-plugin-api';
import { instanceMetadataServiceFactory } from './instanceMetadataServiceFactory';
import { startTestBackend } from '@backstage/backend-test-utils';
import { instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha';
import Router from 'express-promise-router';
import request from 'supertest';
describe('instanceMetadataServiceFactory', () => {
it('should create an instance metadata service', async () => {
const pluginSubject = createBackendPlugin({
pluginId: 'my-plugin',
register(reg) {
reg.registerInit({
deps: {
instanceMetadata: instanceMetadataServiceRef,
httpRouter: coreServices.httpRouter,
},
async init({ instanceMetadata, httpRouter }) {
const router = Router();
router.get('/instance-metadata', async (_, res) => {
const metadata = await instanceMetadata.getInstalledFeatures();
res.json(metadata);
});
httpRouter.use(router);
},
});
},
});
const { server } = await startTestBackend({
features: [pluginSubject, instanceMetadataServiceFactory],
});
const response = await request(server)
.get('/api/my-plugin/instance-metadata')
.expect(200);
expect(response.body).toEqual([{ pluginId: 'my-plugin', type: 'plugin' }]);
});
});
+6
View File
@@ -1,5 +1,11 @@
# @backstage/backend-plugin-api
## 1.5.0-next.2
### Minor Changes
- 62fc2de: Explicitly mark `coreServices.rootInstanceMetadata` as a root service.
## 1.5.0-next.1
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-plugin-api",
"version": "1.5.0-next.1",
"version": "1.5.0-next.2",
"description": "Core API used by Backstage backend plugins",
"backstage": {
"role": "node-library"
+1 -1
View File
@@ -234,7 +234,7 @@ export namespace coreServices {
const urlReader: ServiceRef<UrlReaderService, 'plugin', 'singleton'>;
const rootInstanceMetadata: ServiceRef<
RootInstanceMetadataService,
'plugin',
'root',
'singleton'
>;
}
@@ -287,5 +287,6 @@ export namespace coreServices {
import('./RootInstanceMetadataService').RootInstanceMetadataService
>({
id: 'core.rootInstanceMetadata',
scope: 'root',
});
}
+8
View File
@@ -1,5 +1,13 @@
# @backstage/backend-test-utils
## 1.10.0-next.2
### Patch Changes
- f3001fd: Tweak some of the mock services to have more precise types
- Updated dependencies
- @backstage/backend-plugin-api@1.5.0-next.2
## 1.10.0-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
"version": "1.10.0-next.1",
"version": "1.10.0-next.2",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
+6 -10
View File
@@ -230,11 +230,7 @@ export namespace mockServices {
export function events(): EventsService;
// (undocumented)
export namespace events {
const factory: () => ServiceFactory<
EventsService,
'plugin',
'singleton' | 'multiton'
>;
const factory: () => ServiceFactory<EventsService, 'plugin', 'singleton'>;
const mock: (
partialImpl?: Partial<EventsService> | undefined,
) => ServiceMock<EventsService>;
@@ -320,7 +316,7 @@ export namespace mockServices {
const // (undocumented)
factory: (
options?: Options | undefined,
) => ServiceFactory<RootConfigService, 'root', 'singleton' | 'multiton'>;
) => ServiceFactory<RootConfigService, 'root', 'singleton'>;
const // (undocumented)
mock: (
partialImpl?: Partial<RootConfigService> | undefined,
@@ -355,8 +351,8 @@ export namespace mockServices {
const // (undocumented)
factory: () => ServiceFactory<
RootInstanceMetadataService,
'plugin',
'singleton' | 'multiton'
'root',
'singleton'
>;
}
// (undocumented)
@@ -369,7 +365,7 @@ export namespace mockServices {
) => ServiceMock<RootLifecycleService>;
}
// (undocumented)
export function rootLogger(options?: rootLogger.Options): LoggerService;
export function rootLogger(options?: rootLogger.Options): RootLoggerService;
// (undocumented)
export namespace rootLogger {
// (undocumented)
@@ -379,7 +375,7 @@ export namespace mockServices {
const // (undocumented)
factory: (
options?: Options | undefined,
) => ServiceFactory<LoggerService, 'root', 'singleton' | 'multiton'>;
) => ServiceFactory<RootLoggerService, 'root', 'singleton'>;
const // (undocumented)
mock: (
partialImpl?: Partial<RootLoggerService> | undefined,
@@ -35,7 +35,6 @@ import {
DiscoveryService,
HttpAuthService,
RootInstanceMetadataService,
LoggerService,
PermissionsService,
RootConfigService,
SchedulerService,
@@ -44,6 +43,7 @@ import {
UserInfoService,
coreServices,
createServiceFactory,
RootLoggerService,
} from '@backstage/backend-plugin-api';
import { ConfigReader } from '@backstage/config';
import { EventsService, eventsServiceRef } from '@backstage/plugin-events-node';
@@ -77,14 +77,15 @@ function createLoggerMock() {
function simpleFactoryWithOptions<
TService,
TScope extends 'root' | 'plugin',
TInstances extends 'singleton' | 'multiton',
TOptions extends [options?: object] = [],
>(
ref: ServiceRef<TService, TScope>,
ref: ServiceRef<TService, TScope, TInstances>,
factory: (...options: TOptions) => TService,
): (...options: TOptions) => ServiceFactory<TService, TScope> {
): (...options: TOptions) => ServiceFactory<TService, TScope, TInstances> {
const factoryWithOptions = (...options: TOptions) =>
createServiceFactory({
service: ref as ServiceRef<TService, any>,
service: ref as ServiceRef<TService, any, any>,
deps: {},
async factory() {
return factory(...options);
@@ -93,8 +94,8 @@ function simpleFactoryWithOptions<
return Object.assign(
factoryWithOptions,
factoryWithOptions(...([undefined] as unknown as TOptions)),
) as ServiceFactory<TService, TScope> &
((...options: TOptions) => ServiceFactory<TService, TScope>);
) as ServiceFactory<TService, TScope, TInstances> &
((...options: TOptions) => ServiceFactory<TService, TScope, TInstances>);
}
/**
@@ -178,7 +179,7 @@ export namespace mockServices {
}));
}
export function rootLogger(options?: rootLogger.Options): LoggerService {
export function rootLogger(options?: rootLogger.Options): RootLoggerService {
return MockRootLoggerService.create(options);
}
export namespace rootLogger {
+14
View File
@@ -1,5 +1,19 @@
# example-backend
## 0.0.44-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-backend@0.6.0-next.2
- @backstage/backend-plugin-api@1.5.0-next.2
- @backstage/plugin-kubernetes-backend@0.20.4-next.2
- @backstage/plugin-scaffolder-backend-module-notifications@0.1.16-next.2
- @backstage/plugin-catalog-backend@3.2.0-next.1
- @backstage/plugin-events-backend@0.5.8-next.1
- @backstage/plugin-scaffolder-backend@3.0.1-next.1
- @backstage/plugin-search-backend@2.0.8-next.1
## 0.0.44-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.0.44-next.1",
"version": "0.0.44-next.2",
"backstage": {
"role": "backend"
},
+6
View File
@@ -1,5 +1,11 @@
# @backstage/core-components
## 0.18.3-next.2
### Patch Changes
- 96ad674: Line numbers in LogViewer will not be selectable in UI anymore
## 0.18.3-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-components",
"version": "0.18.3-next.1",
"version": "0.18.3-next.2",
"description": "Core components used by Backstage plugins and apps",
"backstage": {
"role": "web-library"
+6
View File
@@ -1,5 +1,11 @@
# @backstage/create-app
## 0.7.6-next.3
### Patch Changes
- Bumped create-app version.
## 0.7.6-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/create-app",
"version": "0.7.6-next.2",
"version": "0.7.6-next.3",
"description": "A CLI that helps you create your own Backstage app",
"backstage": {
"role": "cli"
@@ -44,6 +44,7 @@ function makeExt(
version: 'v1',
id,
attachTo: { id: attachId, input: 'default' },
inputs: {},
disabled: status === 'disabled',
toString: expect.any(Function),
} as Extension<unknown>;
@@ -61,6 +62,7 @@ function makeExtDef(
name,
attachTo: { id: attachId, input: 'default' },
disabled: status === 'disabled',
inputs: {},
override: () => ({} as ExtensionDefinition),
} as ExtensionDefinition;
}
@@ -17,7 +17,7 @@
import {
ApiHolder,
AppNode,
ExtensionAttachToSpec,
ExtensionDefinitionAttachTo,
ExtensionDataValue,
ExtensionDataRef,
ExtensionDefinition,
@@ -36,7 +36,7 @@ export const OpaqueExtensionDefinition = OpaqueType.create<{
readonly kind?: string;
readonly namespace?: string;
readonly name?: string;
readonly attachTo: ExtensionAttachToSpec;
readonly attachTo: ExtensionDefinitionAttachTo;
readonly disabled: boolean;
readonly configSchema?: PortableSchema<any, any>;
readonly inputs: {
@@ -67,7 +67,7 @@ export const OpaqueExtensionDefinition = OpaqueType.create<{
readonly kind?: string;
readonly namespace?: string;
readonly name?: string;
readonly attachTo: ExtensionAttachToSpec;
readonly attachTo: ExtensionDefinitionAttachTo;
readonly disabled: boolean;
readonly configSchema?: PortableSchema<any, any>;
readonly inputs: { [inputName in string]: ExtensionInput };
@@ -0,0 +1,36 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ExtensionInput } from '@backstage/frontend-plugin-api';
import { OpaqueType } from '@internal/opaque';
export type ExtensionInputContext = {
input: string;
kind?: string;
name?: string;
};
export const OpaqueExtensionInput = OpaqueType.create<{
public: ExtensionInput;
versions: {
readonly version: undefined;
readonly context?: ExtensionInputContext;
withContext(context: ExtensionInputContext): ExtensionInput;
};
}>({
type: '@backstage/ExtensionInput',
versions: [undefined],
});
@@ -15,6 +15,10 @@
*/
export { createExtensionDataContainer } from './createExtensionDataContainer';
export { OpaqueSwappableComponentRef } from './InternalSwappableComponentRef';
export { OpaqueExtensionDefinition } from './InternalExtensionDefinition';
export {
OpaqueExtensionInput,
type ExtensionInputContext,
} from './InternalExtensionInput';
export { OpaqueFrontendPlugin } from './InternalFrontendPlugin';
export { OpaqueSwappableComponentRef } from './InternalSwappableComponentRef';
+21
View File
@@ -1,5 +1,26 @@
# @backstage/frontend-plugin-api
## 0.12.2-next.2
### Patch Changes
- 7c6a66d: Added support for plugin-relative `attachTo` declarations for extension definitions. This allows for the creation of extension and extension blueprints that attach to other extensions of a particular `kind` in the same plugin, rather than needing to provide the exact extension ID. This is particularly useful when wanting to provide extension blueprints with a built-in hierarchy where the extensions created from one blueprint attach to extensions created from the other blueprint, for example:
```ts
// kind: 'tabbed-page'
const parentPage = TabbedPageBlueprint.make({
params: {....}
})
// attachTo: { kind: 'tabbed-page', input: 'tabs' }
const child1 = TabContentBlueprint.make({
name: 'tab1',
params: {....}
})
```
- Updated dependencies
- @backstage/core-components@0.18.3-next.2
## 0.12.2-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-plugin-api",
"version": "0.12.2-next.1",
"version": "0.12.2-next.2",
"backstage": {
"role": "web-library"
},
+80 -13
View File
@@ -259,7 +259,7 @@ export interface AppNodeInstance {
// @public
export interface AppNodeSpec {
// (undocumented)
readonly attachTo: ExtensionAttachToSpec;
readonly attachTo: ExtensionAttachTo;
// (undocumented)
readonly config?: unknown;
// (undocumented)
@@ -407,6 +407,7 @@ export function createExtension<
UFactoryOutput extends ExtensionDataValue<any, any>,
const TKind extends string | undefined = undefined,
const TName extends string | undefined = undefined,
UParentInputs extends ExtensionDataRef = ExtensionDataRef,
>(
options: CreateExtensionOptions<
TKind,
@@ -414,7 +415,8 @@ export function createExtension<
UOutput,
TInputs,
TConfigSchema,
UFactoryOutput
UFactoryOutput,
UParentInputs
>,
): ExtensionDefinition<{
config: string extends keyof TConfigSchema
@@ -454,6 +456,7 @@ export function createExtensionBlueprint<
},
UFactoryOutput extends ExtensionDataValue<any, any>,
TKind extends string,
UParentInputs extends ExtensionDataRef,
TDataRefs extends {
[name in string]: ExtensionDataRef;
} = never,
@@ -465,7 +468,8 @@ export function createExtensionBlueprint<
TInputs,
TConfigSchema,
UFactoryOutput,
TDataRefs
TDataRefs,
UParentInputs
>,
): ExtensionBlueprint<{
kind: TKind;
@@ -508,9 +512,11 @@ export type CreateExtensionBlueprintOptions<
TDataRefs extends {
[name in string]: ExtensionDataRef;
},
UParentInputs extends ExtensionDataRef,
> = {
kind: TKind;
attachTo: ExtensionAttachToSpec;
attachTo: ExtensionDefinitionAttachTo<UParentInputs> &
VerifyExtensionAttachTo<UOutput, UParentInputs>;
disabled?: boolean;
inputs?: TInputs;
output: Array<UOutput>;
@@ -589,10 +595,12 @@ export type CreateExtensionOptions<
[key: string]: (zImpl: typeof z) => z.ZodType;
},
UFactoryOutput extends ExtensionDataValue<any, any>,
UParentInputs extends ExtensionDataRef,
> = {
kind?: TKind;
name?: TName;
attachTo: ExtensionAttachToSpec;
attachTo: ExtensionDefinitionAttachTo<UParentInputs> &
VerifyExtensionAttachTo<UOutput, UParentInputs>;
disabled?: boolean;
inputs?: TInputs;
output: Array<UOutput>;
@@ -839,7 +847,7 @@ export interface Extension<TConfig, TConfigInput = TConfig> {
}
// @public (undocumented)
export type ExtensionAttachToSpec =
export type ExtensionAttachTo =
| {
id: string;
input: string;
@@ -849,6 +857,9 @@ export type ExtensionAttachToSpec =
input: string;
}>;
// @public @deprecated (undocumented)
export type ExtensionAttachToSpec = ExtensionAttachTo;
// @public (undocumented)
export interface ExtensionBlueprint<
T extends ExtensionBlueprintParameters = ExtensionBlueprintParameters,
@@ -859,9 +870,11 @@ export interface ExtensionBlueprint<
make<
TName extends string | undefined,
TParamsInput extends AnyParamsInput<NonNullable<T['params']>>,
UParentInputs extends ExtensionDataRef,
>(args: {
name?: TName;
attachTo?: ExtensionAttachToSpec;
attachTo?: ExtensionDefinitionAttachTo<UParentInputs> &
VerifyExtensionAttachTo<NonNullable<T['output']>, UParentInputs>;
disabled?: boolean;
params: TParamsInput extends ExtensionBlueprintDefineParams
? TParamsInput
@@ -887,9 +900,16 @@ export interface ExtensionBlueprint<
TExtraInputs extends {
[inputName in string]: ExtensionInput;
},
UParentInputs extends ExtensionDataRef,
>(args: {
name?: TName;
attachTo?: ExtensionAttachToSpec;
attachTo?: ExtensionDefinitionAttachTo<UParentInputs> &
VerifyExtensionAttachTo<
ExtensionDataRef extends UNewOutput
? NonNullable<T['output']>
: UNewOutput,
UParentInputs
>;
disabled?: boolean;
inputs?: TExtraInputs & {
[KName in keyof T['inputs']]?: `Error: Input '${KName &
@@ -1073,6 +1093,11 @@ export type ExtensionDefinition<
> = {
$$type: '@backstage/ExtensionDefinition';
readonly T: T;
readonly inputs: {
[K in keyof T['inputs']]: ExtensionInput<
T['inputs'][K] extends ExtensionInput<infer IData> ? IData : never
>;
};
override<
TExtensionConfigSchema extends {
[key in string]: (zImpl: typeof z) => z.ZodType;
@@ -1083,10 +1108,17 @@ export type ExtensionDefinition<
[inputName in string]: ExtensionInput;
},
TParamsInput extends AnyParamsInput_2<NonNullable<T['params']>>,
UParentInputs extends ExtensionDataRef,
>(
args: Expand<
{
attachTo?: ExtensionAttachToSpec;
attachTo?: ExtensionDefinitionAttachTo<UParentInputs> &
VerifyExtensionAttachTo<
ExtensionDataRef extends UNewOutput
? NonNullable<T['output']>
: UNewOutput,
UParentInputs
>;
disabled?: boolean;
inputs?: TExtraInputs & {
[KName in keyof T['inputs']]?: `Error: Input '${KName &
@@ -1168,6 +1200,41 @@ export type ExtensionDefinition<
}>;
};
// @public
export type ExtensionDefinitionAttachTo<
UParentInputs extends ExtensionDataRef = ExtensionDataRef,
> =
| {
id: string;
input: string;
relative?: never;
}
| {
relative: {
kind?: string;
name?: string;
};
input: string;
id?: never;
}
| ExtensionInput<UParentInputs>
| Array<
| {
id: string;
input: string;
relative?: never;
}
| {
relative: {
kind?: string;
name?: string;
};
input: string;
id?: never;
}
| ExtensionInput<UParentInputs>
>;
// @public (undocumented)
export type ExtensionDefinitionParameters = {
kind?: string;
@@ -1215,13 +1282,13 @@ export interface ExtensionInput<
},
> {
// (undocumented)
$$type: '@backstage/ExtensionInput';
readonly $$type: '@backstage/ExtensionInput';
// (undocumented)
config: TConfig;
readonly config: TConfig;
// (undocumented)
extensionData: Array<UExtensionData>;
readonly extensionData: Array<UExtensionData>;
// (undocumented)
replaces?: Array<{
readonly replaces?: Array<{
id: string;
input: string;
}>;
@@ -15,12 +15,8 @@
*/
import { createApiRef } from '@backstage/core-plugin-api';
import {
FrontendPlugin,
Extension,
ExtensionDataRef,
ExtensionAttachToSpec,
} from '../../wiring';
import { FrontendPlugin, Extension, ExtensionDataRef } from '../../wiring';
import { ExtensionAttachTo } from '../../wiring/resolveExtensionDefinition';
/**
* The specification for this {@link AppNode} in the {@link AppTree}.
@@ -33,7 +29,7 @@ import {
*/
export interface AppNodeSpec {
readonly id: string;
readonly attachTo: ExtensionAttachToSpec;
readonly attachTo: ExtensionAttachTo;
readonly extension: Extension<unknown, unknown>;
readonly disabled: boolean;
readonly config?: unknown;
@@ -203,10 +203,16 @@ describe('ApiBlueprint', () => {
"optional": false,
"singleton": false,
},
"context": {
"input": "test",
"kind": "api",
"name": "test",
},
"extensionData": [
[Function],
],
"replaces": undefined,
"withContext": [Function],
},
},
"kind": "api",

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