@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-org': patch
|
||||
---
|
||||
|
||||
Improved responsiveness of GroupProfileCard component
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/create-app': patch
|
||||
---
|
||||
|
||||
Bumped create-app version.
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-react': patch
|
||||
---
|
||||
|
||||
Added missing i18n
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/ui': patch
|
||||
---
|
||||
|
||||
Improved visual consistency of PasswordField, SearchField, and MenuAutocomplete components.
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-plugin-api': minor
|
||||
---
|
||||
|
||||
Explicitly mark `coreServices.rootInstanceMetadata` as a root service.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-test-utils': patch
|
||||
---
|
||||
|
||||
Tweak some of the mock services to have more precise types
|
||||
@@ -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: {....}
|
||||
})
|
||||
```
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/ui': patch
|
||||
---
|
||||
|
||||
Removed `@base-ui-components/react` dependency as all components now use React Aria Components.
|
||||
@@ -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",
|
||||
|
||||
@@ -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.
|
||||
@@ -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`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-app-visualizer': patch
|
||||
---
|
||||
|
||||
Migrated to use `@backstage/ui`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/ui': patch
|
||||
---
|
||||
|
||||
Added `loading` prop to Button and ButtonIcon components for displaying spinner during async operations.
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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. ✈️
|
||||
|
||||
[](https://backstage.io/)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "root",
|
||||
"version": "1.45.0-next.2",
|
||||
"version": "1.45.0-next.3",
|
||||
"backstage": {
|
||||
"cli": {
|
||||
"new": {
|
||||
|
||||
+58
@@ -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' }]);
|
||||
});
|
||||
});
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "example-backend",
|
||||
"version": "0.0.44-next.1",
|
||||
"version": "0.0.44-next.2",
|
||||
"backstage": {
|
||||
"role": "backend"
|
||||
},
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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,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';
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "@backstage/frontend-plugin-api",
|
||||
"version": "0.12.2-next.1",
|
||||
"version": "0.12.2-next.2",
|
||||
"backstage": {
|
||||
"role": "web-library"
|
||||
},
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user